STM32的两只狗儿——狗立看门狗

落花浮王杯 提交于 2019-12-17 22:19:53

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

STM32狗立看门狗,由专门的低速时钟(LSI)驱动,即便是主时钟发生故障它仍能够有效,所以此狗狗可以工作在与主时钟无关的要求下,或者待机模块下等,所以它叫独立看门狗,注意一旦开启此看门狗则只能由MCU复位后才清除,让它不再工作。

它的时钟是一个内部RC时钟,它会在30KHZ60KHZ之间变化,并非是精确的40KHZ,而只是一般计算时取40KHZ

 

狗立看门狗需设置四个寄存器如下:

其中,

预分频寄存器(IWDG_PR),最低三位PR[2:0](Prescaler divider)有效,可设置有8种不同的计数器时钟预分频因子。

重装载寄存器(IWDG_RLR)12RL[11:0]: 看门狗计数器重装载值 (Watchdog counter reload value) 有效,用来设置计数器的重装载值。

注意要设置以上两个寄存器的值需满足两个条件,详见如下。

 

键寄存器(IWDG_KR),用来控制去除IWDG_PRIWDG_RLR写保护功能以便正常写值,向此寄存器写入0x5555则暂时去除IWDG_PRIWDG_RLR的写保护功能才可向两个寄存器中写值。当向此寄存器写入0xAAAAIWDG_RLR的值会重装载,防止MCU复位,向入0xCCCC是开启狗立看门狗动作。

 

状态寄存器(IWDG_SR)最低两位有效RVU: 看门狗计数器重装载值更新 (Watchdog counter reload value update) 标识位和PVU: 看门狗预分频值更新 (Watchdog prescaler value update) 标识位,分别用来指示此时是否可向IWDG_RLR  IWDG_PR写值,此寄存器由硬件置1与清0,只有当为0时才可向上面两个寄存器写值。

 

它的初始化过程大致如下  

//时间计算(大概):Tout=((4*2^prer)*rlr)/40 (ms)
void IWDG_Init(u8 prer,u16 rlr)
{       
        IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); 
         IWDG_SetPrescaler(prer);   
         IWDG_SetReload(rlr); 
         IWDG_ReloadCounter();      
         IWDG_Enable(); 
}

喂狗可通过调用如下函数进行:

IWDG_ReloadCounter();//reload

 

以上参考正点原子相关代码,朋友们可以跳到库函数代码中自己研究下,控制比较简单,不再赘述。另外要注意不要使用硬件时钟中断喂狗,因为硬件时钟中断一般都有较高优先级且独立于主控程序,这样有时会出现主控程序虽然跑飞了,但仍能够正常喂狗的现象。

独立看门狗能够在一定程度上监控着程序正常运行,然而我认为更加强大,应用更灵活及更能保证程序稳定运行的还属窗口看门狗,虽然它开始时不太好理解,请看下篇。



 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!