独立看门狗和窗口看门狗

独立看门狗没几个寄存器。

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
}

 

posted on 2015-08-04 22:37  nasduc  阅读(1331)  评论(0编辑  收藏  举报

导航