STM32 独立看门狗与窗口看门狗

STM32内置两个看门狗:

            独立看门狗:LSI驱动,主时钟故障任然有效;需要看门狗作为在主程序之外能够完全独立工作,并且对时间精度要求低的场合

            窗口看门狗:APB1分频驱动;适合要求看门狗在精确计时窗口起作用的程序

            PS:当程序跑飞,但看门狗程序正常运行,或者是跑飞时间短。在递减到0之前回复正常并正确喂狗时,独立看门狗无法检测到程序异常。所需要规定时间,即需                        要窗口看门狗的设定

一:设置独立看门狗步骤: 

       1. 启动看门狗:键值寄存器(IWDG_KR)写入:0XCCCC

             计数器从0XFFF递减;当为0X000时会产生复位信号IWDG_Reset

       2.喂狗:键值寄存器(IWDG_KR)写入:0XAAAA

             自动重装载寄存器(IWDG_RLR)会重新加载到计数器,从而避免复位

              溢出时间计算:Tout=((4×2^prer) ×rlr) /40 (M3)    prer:LSI分频系数   rlr:RLR寄存器设定值         //一个看门狗的时钟周期就是最短超时时间

 

代码实现步骤:

   a. 取消寄存器写保护://(IWDG_PR)和(IWDG_RLR)寄存器具有写保护功能,不能正常写入
          IWDG_WriteAccessCmd();
        b. 设置独立看门狗的预分频系数,确定时钟:
          IWDG_SetPrescaler();
        c. 设置看门狗重装载值,确定溢出时间:
          IWDG_SetReload();
        d. 使能看门狗
          IWDG_Enable();
        e.  应用程序喂狗:
         IWDG_ReloadCounter(); 

二:设置窗口看门狗

       喂狗时间有上下限:上限可设置,下限固定0X3F(0X40产生早期唤醒中断EWI)

 代码实现步骤:
     a.使能看门狗时钟:
        RCC_APB1PeriphClockCmd();//------>WWDG_CFR
     b.设置分频系数:
        WWDG_SetPrescaler();//------>WWDG_CFR
     c.设置上窗口值:
         WWDG_SetWindowValue();//------>WWDG_CFR
     d.开启提前唤醒中断并分组(可选):
         WWDG_EnableIT();   //------>WWDG_CFR
         NVIC_Init();
     e.使能看门狗:
        WWDG_Enable();//------>WWDG_CR   BYTE7
     f.喂狗:
        WWDG_SetCounter();//------>WWDG_CR    BYTE6:0
    g.编写中断服务函数
        WWDG_IRQHandler();//------>WWDG_SR获取相关状态,喂狗

 

posted @ 2019-05-07 12:23  远处是风景  阅读(12)  评论(0)    收藏  举报