内部看门狗时钟驱动:
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 }