8-STM32 IWDG独立看门狗

内部看门狗时钟驱动:

STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动(LSI),即使主时钟发生故障,它也仍然有效。这里需要注意独立看门狗的时钟是一个内部 RC 时钟,所以并不是准确的 40Khz,而是
30~60Khz 之间的一个可变化的时钟,只是我们在估算的时候,以 40Khz 的频率来计算,看门狗对时间的要求不是很精确,所以,时钟有些偏差,都是可以接受的。

看门狗的作用:
单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环, 看门狗电路就是为了避免这种情况的发生。 看门狗的作用就是在一定时间内(通过定时计数器实现) 没有接收喂狗信号(表示 MCU 已经挂了),便实现处理器的自动复位重启(发送复位信号)。

看门狗框图:

预分频寄存器(IWDG_PR):该寄存器用来设置看门狗时钟的分频系数

重装载寄存器(IWDG_RLR):该寄存器用来保存重装载到计数器中的值。该寄存器也是一个 32位寄存器,但是只有低 12 位是有效的。

 

①开启看门狗:键值寄存器(IWDG_KR)中写入 0xCCCC,开始启用独立看门狗;此时计数器开始从其复位值 0xFFF 递减计数。当计数器计数到末尾 0x000 时,会产生一个复位信号(IWDG_RESET)

②喂狗:只要键寄存器 IWDG_KR 中被写入 0xAAAA, IWDG_RLR 中的值就会被重新加载到计数器中从而避免产生看门狗复位 。

IWDG_PR 和 IWDG_RLR 寄存器具有写保护功能。要修改这两个寄存器的值,必须先向IWDG_KR 寄存器中写入 0x5555

固件库: stm32f10x_iwdg.h stm32f10x_iwdg.c  

实验代码:

 1 void IWDG_Init(u8 prer,u16 rlr) 
 2 {    
 3      IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);  //使能对寄存器IWDG_PR和IWDG_RLR的写操作
 4     
 5     IWDG_SetPrescaler(prer);  //设置IWDG预分频值:设置IWDG预分频值为64
 6     
 7     IWDG_SetReload(rlr);  //设置IWDG重装载值
 8     
 9     IWDG_ReloadCounter();  //按照IWDG重装载寄存器的值重装载IWDG计数器
10     
11     IWDG_Enable();  //使能IWDG
12 }
13 
14 //喂独立看门狗
15 void IWDG_Feed(void)
16 {   
17      IWDG_ReloadCounter();                                           
18 }

main: 不喂狗,代码将不断重启,导致LED闪烁

 1 int main(void)
 2 {
 3   LED_init();
 4     delay_init();
 5     delay_ms(300);   
 6   IWDG_Init(4,625);
 7     GPIO_ResetBits(GPIOA, GPIO_Pin_8);
 8     
 9     while(1)
10     {
11   if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_15)==RESET) //按键按下,进行喂狗   
12         IWDG_Feed();
13         delay_ms(10);
14     }
15 
16 }
原文地址:https://www.cnblogs.com/darren-pty/p/13974590.html