基于STM32HAL 库实现独立看门狗,进行异常检测

前言

本质:

               能产生系统复位信号的计数器

含义:

        超出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函数重定向,串口调试的另一种方法。
  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值