独立看门狗(IWDG):神舟IV实验

看了正点的教程觉得写得很好,以下复制的正点的教程

 http://www.openedv.com/posts/list/0/11790.htm#71198

1)向IWDG_KR写入0X5555

#define IWDG_WriteAccess_Enable     ((uint16_t)0x5555)
#define IWDG_WriteAccess_Disable    ((uint16_t)0x0000)

通过这步,我们取消IWDG_PR和IWDG_RLR的写保护,使后面可以操作这两个寄存器。

设置IWDG_PR和IWDG_RLR的值。这两步设置看门狗的分频系数,和重装载的值

Tout=((4×2^prer) ×rlr) /40

比如我们设定prer值为4rlr值为625,那么就可以得到Tout=64×625/40=1000ms,这样,看门狗的溢出时间就是1s,只要你在一秒钟之内,有一次写入0XAAAAIWDG_KR,就不会导致看门狗复位(当然写入多次也是可以的)。这里需要提醒大家的是,看门狗的时钟不是准确的40Khz,所以在喂狗的时候,最好不要太晚了,否则,有可能发生看门狗复位。

2)向IWDG_KR写入0XAAAA

/* KR register bit mask */
#define KR_KEY_Reload    ((uint16_t)0xAAAA)
#define KR_KEY_Enable    ((uint16_t)0xCCCC)

通过这句,将使STM32重新加载IWDG_RLR的值到看门狗计数器里面。即实现独立看门狗的喂狗操作。

3)向IWDG_KR写入0XCCCC

通过这句,来启动STM32的看门狗。注意IWDG在一旦启用,就不能再被关闭!想要关闭,只能重启,并且重启之后不能打开IWDG,否则问题依旧,所以在这里提醒大家,如果不用IWDG的话,就不要去打开它,免得麻烦。

IWDG_Config

喂狗函数

IWDG_Feed
1 //喂独立看门狗
2 void IWDG_Feed(void)
3 {   
4      IWDG_ReloadCounter();//reload                                           
5 }

在systick中断里喂狗

SysTick_Handler
1 void SysTick_Handler(void)
2 {
3 
4      IWDG_Feed();
5      //printf("feed\r\n");
6      Led_Turn_on_all();    
7                           
8 }

在按键四按下中断处理关闭systick,这样就停止喂狗,发现系统reset

EXTI0_IRQHandler
 1 void EXTI0_IRQHandler(void)
 2 {
 3   u8 i;
 4   /* Key4 */
 5   if(EXTI_GetITStatus(EXTI_Line0) != RESET)
 6   {
 7     Led_Turn_off_all();
 8 
 9 
10     /* 关闭systick */
11    Systick_Close();
12 
13     /* Clear the EXTI Line 0 */
14     EXTI_ClearITPendingBit(EXTI_Line0);
15   }
16 }
原文地址:https://www.cnblogs.com/wwjdwy/p/2961158.html