看了正点的教程觉得写得很好,以下复制的正点的教程
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值为4,rlr值为625,那么就可以得到Tout=64×625/40=1000ms,这样,看门狗的溢出时间就是1s,只要你在一秒钟之内,有一次写入0XAAAA到IWDG_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的话,就不要去打开它,免得麻烦。

喂狗函数

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

1 void SysTick_Handler(void) 2 { 3 4 IWDG_Feed(); 5 //printf("feed\r\n"); 6 Led_Turn_on_all(); 7 8 }
在按键四按下中断处理关闭systick,这样就停止喂狗,发现系统reset

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 }