独立看门狗和窗口看门狗
独立看门狗没几个寄存器。
1、IWDG_KR,写入0xcccc,启动看门狗。计数器开始从复位值 0xFFF 递减计数。当计数器计数到终值 (0x000) 时会产生一个复位信号( IWDG 复位)
2、任何时候将关键字 0xAAAA 写到 IWWDG_KR 寄存器中, IWDG_RLR 的值就会被重载到计数器,从而避免产生看门狗复位。写入键值 5555h 可使能对 IWDG_PR 和 IWDG_RLR 寄存器的访问.
3、这个看门狗的时钟源是LSI,IWDG_PR寄存器是这个看门狗时钟的分频设置。
没有及时喂狗,单板复位后,寄存器恢复默认值,看门狗就不使能了。所谓的窗口看门狗,就是喂狗不能太慢,也不能太快,需要在一个窗口时间内喂狗。
窗口看门狗有中断源,独立看门狗没有,是不是窗口看门狗不会复位MCU,只是产生中断???
独立看门狗确实只会触发复位。而窗口看门狗可以触发中断和复位。如果在窗口看门狗的中断服务程序中重载计数值,就不会复位了。
下面来看这个模块的库函数。
void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess) { /* Check the parameters */ assert_param(IS_IWDG_WRITE_ACCESS(IWDG_WriteAccess)); IWDG->KR = IWDG_WriteAccess; //写入0x5555,接触对PR和RLR的写保护 }
void IWDG_SetPrescaler(uint8_t IWDG_Prescaler) { /* Check the parameters */ assert_param(IS_IWDG_PRESCALER(IWDG_Prescaler)); IWDG->PR = IWDG_Prescaler; //设置分频 }
void IWDG_SetReload(uint16_t Reload) { /* Check the parameters */ assert_param(IS_IWDG_RELOAD(Reload)); IWDG->RLR = Reload;//设置重载值,默认是0xfff,重载值和分频系数配合,可以控制看门狗喂狗时间。 }
void IWDG_ReloadCounter(void) { IWDG->KR = KR_KEY_RELOAD;//KR写入AAAA,重载,就是在清狗 }
void IWDG_Enable(void) { IWDG->KR = KR_KEY_ENABLE; //看门狗使能 }
一般的独立看门狗用法
void IWDG_Init(u8 prer,u16 rlr) { IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //取消对寄存器的写保护 IWDG_SetPrescaler(prer); //写入分频值 IWDG_SetReload(rlr); //写入重载值 IWDG_ReloadCounter(); //reload IWDG_Enable(); //看门狗使能· } //喂狗函数· void IWDG_Feed(void) { IWDG_ReloadCounter();//reload }