前言
本质:
能产生系统复位信号的计数器
含义:
超出1秒未喂狗,程序将自动关机,常用于某处程序进去死循环,重启程序,例如合泰杯时,串口需要重启才能接收数据,通俗来说,就是一定时间没有喂狗,狗就会死,喂狗了,狗就继续活着;
注意事项:
*****独立看门狗是异常处理的最后手段,不可依赖,应在设计时尽量避免异常的发生。
*****启用IWDG后,LSI时钟会自动开启;
应用场景:在一些需要高稳定性的产品中,并且对时间精度要求低的场合
比如:串口接收数据异常,程序卡在了中断里长时间无法跳出,此时可能是由外部噪声引起,外部噪声干扰了正常数据接收,单片机无法按照指定数据格式接收数据,就有可能一直在中断里无法跳出,学中断时我们知道中断时间要尽可能的短,所以为了防止这种情况发生,就需要看门狗的功能。我在用某单片机时就出现过这种情况,每次单片机工作时串口数据只能接收一次,需要手动复位才能持续接收数据,我便采用了看门狗,解决了这个问题,成功的在那场比赛收获省一
溢出时间计算:Tout = psc*rlr/fiWDG
Tout :溢出时间;psc:预分频系数;rlr:重装载值;fiwdg:时钟源频率(f103是40khz,f4, h7是32khz);
代码部分
WDG.c
/*看门狗初始化函数句柄*/
IWDG_HandleTypeDef g_iwdg_handle;
void HAL_IWDG_lnit(uint8_t prer, uint16_t rlr)
{
g_iwdg_handle.Instance = IWDG;
g_iwdg_handle.Init.Prescaler = prer; /*预分频*/
g_iwdg_handle.Init.Reload = rlr; /*重装载值*/
HAL_IWDG_Init(&g_iwdg_handle);
}
/*喂狗函数*/
void iwdg_feed(void)
{
HAL_IWDG_Refresh(&g_iwdg_handle);
}
main.c:
/*超出1秒未喂狗,程序将自动关机,常用于某处程序进去死循环,重启程序*/
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟为72Mhz */
delay_init(72); /* 延时初始化 */
usart_init(115200); /* 串口初始化为115200 */
printf("\r\n您还没喂狗,请及时喂狗!!!!\r\n");
HAL_IWDG_lnit(IWDG_PRESCALER_32 ,1250); /*预分频器为32,重装载值1250,溢出时间约为1秒*/
while (1)
{
delay_ms(1500);
iwdg_feed();
printf("已经喂狗\r\n");
}
}
我使用了printf函数,如果你的不能正常打印,可以参考我的另外篇文章 stm32HAL printf函数重定向,串口调试的另一种方法。