IWDG(獨立看門狗)可以在系統主時鐘發生異常時,從APB1時鐘分頻後得到時鐘驅動。當程式發生異常時如過早或過遲的操作,IWDG的存在可快速復位CPU從而重新執行程式,在工業現場,獨立看門狗的存在,可以快速發現異常並加以處理,對現場安全可靠的執行具有無可替代的意義。
工具/原料
Keil uVision4軟體
STM32F10X系列微控制器
J-Link v8偵錯程式
方法/步驟
建立工程
開啟Keil uVision4軟體,建立工程如下:
編寫程式碼
在主檔案(APP)層中編寫如下程式碼:
#include "stm32f10x.h"
#include "stdio.h"
#include "string.h"
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
void GPIO_Configuration(void);
void IWDG_Configuration(uint8_t pres, uint16_t reload);
void IWDG_FeedWatchdog(void);
void NVIC_Configuration(void);
void Delay(uint32_t nCount);
int main(void)
{
NVIC_Configuration();
GPIO_Configuration();
IWDG_Configuration(4,625);
while(1) {
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)){
IWDG_FeedWatchdog();
}
else {
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)){
GPIO_SetBits(GPIOA,GPIO_Pin_1);
}
else{
GPIO_ResetBits(GPIOA,GPIO_Pin_1);
}
}
}
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
// GPIOA.0/.1 Push-Pull Output
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
void Delay (uint32_t nCount)
{
for(; nCount != 0; nCount--);
}
void IWDG_Configuration(uint8_t pres, uint16_t reload)
{
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
IWDG_SetPrescaler(pres);
IWDG_SetReload(reload);
IWDG_ReloadCounter();
IWDG_Enable();
}
void IWDG_FeedWatchdog(void)
{
IWDG_ReloadCounter();
}
void NVIC_Configuration (void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
}
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t* file, uint32_t line)
{
while(1) {
}
}
#endif
下載測試
當軟體模擬時,可以通過改變 GPIOA.0 的電平,觀測 GPIOA.1 以及CPU是否被複位來檢測IWDG是否被啟動。
注意事項
一般初學者在學習STM32微控制器時並不需要開啟IWDG,預設情況下是關閉的。
IWDG實質上是定時/計數器,工作時還是需要時鐘配置的!