1、看门狗的作用 看门狗准确来说就是在单片机构成的系统中,可能会收到外界电磁波的干扰,造成程序跑飞,陷入死循环中,这样系统就不能够正常的工作,看门狗就是用来监控这种非正常的程序,如果系统因为故障没有能够及时的去喂狗,然后,这狗就完了,最终导致系统的重启,程序重新执行。 看门狗的原理:单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路就是为了避免这种情况的发生。看门狗的作用就是在一定时间内(通过定时计数器实现)没有接收喂狗信号(表示 MCU 已经挂了),便实现处理器的自动复位重启(发送复位信号) STM32系统中的看门狗有两种——独立看门狗与串口看门狗: (1)独立看门狗IWDG–独立于系统之外,因为有独立时钟,所以不受系统影响的系统故障探测器,主要用于监视硬件错误。 (2)窗口看门狗WWDG----系统内部的故障探测器,时钟与系统相同。如果系统时钟不走了,这个狗也就失去了作用了,主要用于监视软件错误。
2、独立看门狗中用到的寄存器和库函数
(1)、键值寄存器 IWDG_KR:在键寄存器(IWDG_KR)中写入 0xCCCC,开启独立看门狗, 库函数IWDG_Enable(); //使能 IWDG
此时计数器开始从其复位值 0xFFF 递减计数。当计数器计数到末尾 0x000 时,会产生一个复位信号(IWDG_RESET)。
(2)IWDG_PR 和 IWDG_RLR 寄存器具有写保护功能。要修改这两个寄存器的值,必须先向 IWDG_KR 寄存器中写入 0x5555。 将其他值写入这个寄存器将会打乱操作顺序,寄存器将重新被保护。库函数:取消寄存器写保护(向 IWDG_KR 写入 0X5555)使用IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
重装载操作(即写入 0xAAAA) (库函数:IWDG_ReloadCounter(); //按照 IWDG 重装载寄存器的值重装载 IWDG 计数器 ) 也会启动写保护功能。
(3)预分频寄存器(IWDG_PR),该寄存器用来设置看门狗时钟的分频系数,最低为 4,最高位 256,该寄存器是一个 32 位的寄存器,但是我们只用了最低 3 位,其他都是保留位。 库函数:设置独立看门狗的预分频系数和重装载值,void IWDG_SetPrescaler(uint8_t IWDG_Prescaler); //设置 IWDG 预分频值 void IWDG_SetReload(uint16_t Reload); //设置 IWDG 重装载值
(4)介绍完 IWDG_PR 之后,我们介绍一下重装载寄存器。该寄存器用来保存重装载到计数器中的值。该寄存器也是一个 32 位寄存器,但是只有低 12 位是有效的,该寄存器的各位描述
看门狗的喂狗时间公式:Tout=((4×2^prer) ×rlr) /40 其中 Tout 为看门狗溢出时间(单位为 ms);prer 为看门狗时钟预分频值(IWDG_PR 值),范围为 0~7;rlr 为看门狗的重装载值(IWDG_RLR 的值); 例如:比如我们设定 prer 值为 4,rlr 值为 625,那么就可以得到 Tout=64×625/40=1000ms,这样,看门狗的溢出时间就是 1s,只要你在一秒钟之内,有一次写入 0XAAAA 到 IWDG_KR,就不会导致看门狗复位(当然写入多次也是可以的)。
初学STM32,把看门狗这里的重点要用到的库函数记录下来,以供自己复习和大家交流讨论
加油!