STM32的两只看门狗

STM32独立看门狗

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

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


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

其中,

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

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

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

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


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

它的初始化过程大致如下 :  

?
1
2
3
4
5
6
7
8
9
//时间计算(大概):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(); 
}


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

?
1
IWDG_ReloadCounter(); //reload

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

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


STM32窗口看门狗

共三个寄存器,如下图:


看似简单,但设置及应用起来有不少玄机。

控制寄存器(WWDG_CR)中的值必须在0xFF与0xC0之间, 因为它的第0至第6位为递减计数器CNT,在它的第6位变为0时将产生复位,所以在初始化时需要为1,第7位WDGA是用来设置启动或禁止窗口看门狗的,当为1进才会启动窗口看门狗,所以第6和第7位都需为1,即WWDG_CR 的值需要大于等于0xC0 。

配置寄存器(WWDG_CFR) 第0至第6位 是设置窗口边界值用的,只有当递减计数器CNT的值小于边界值时才可以喂狗,过早不行,狗还不饿,撑死了。并且7位递减计数器CNT减少到0x3F时即T6位变为0,此时MCU也会复位,过晚了,狗饿死了。所以必须在指定的时间范围喂狗,过早或过晚都将产生复位,而这样设计可以减少软件跑飞了却仍能够歪打正着地喂狗的发生概率。

状态寄存器(WWDG_CFR) 只用到了第0位,EWIF(Early wakeup interrupt flag )是提前唤醒中断标识,当递减计数器CNT的值到达0X40(若再减少一次则T6位变为0,产生复位)时此位由硬件置1,且需用软件清0,注意无论中断是否使能此位都会被硬件置1。而提前唤醒中断使能设置是在配置寄存器(WWDG_CFR)第9位EWI(Early wakeup interrupt),此位需由软件置1,则会在当递减计数器CNT的值到达0X40时产生中断,并且与EWIF不同,此位是由硬件清0。

 另外控制寄存器(WWDG_CR)中第7位WDGA(Activation bit)激活位,需用软件来置1,以启动窗口看门狗,并且一旦启动后,只能在复位或重启后由硬件来清0。

配置寄存器(WWDG_CFR)的第8位和第7位WDGTB[1:0]用来设置时基(Timer base)预分频数。

 以上描述可参考下图以更清晰的理解:

窗口看门狗应用时还要注意算准最小与最大喂狗时间,以便正确地喂狗,如下:

在PCLK1频率为36MHz 时,则

上窗口时间:T_min = 4096 * (2^WDGTB)*(WWDG_CR[6:0] - WWDG_CFR[6:0])/36 (us)

下窗口时间: T_max = 4096 * (2^WDGTB)*(WWDG_CR[6:0] - 0x40)/36 (us) 。


喂狗动作需在这段时间之间进行,而喂狗动作为向控制寄存器(WWDG_CR)中写值,值的范围上文已经说过。

窗口看门狗中断函数void WWDG_IRQHandler(void);是用来做什么的呢。窗口看门狗中断函数是在递减计数器减少到0x40是被调用,因为它本身计数就比较慢,所以离数到0x3F复位还有一段时间,我认为这样设计是为MCU复位之前留下一点时间,能够使工程设计人员根据需要在中断函数保存一些重要的数据,这样在复位后MCU可知道系统因异常复位的某此状态,以使系统有更高稳定性。

并且我觉得在窗口看门狗中断函数中喂狗没有什么意义,程序本来已经不按正常运行了,还在中断函数中喂狗防止复位只会错上加错,不好好利用它干点正事, 更是浪费资源。

这点上我个人认为不要被点原子示例代码误导哦,但其还是有部分借鉴意义的,以下为初始化相关代码:

?
1
2
3
4
5
6
7
8
9
10
   //窗口看门狗中断服务设置程序
     void  WWDG_NVIC_Init()
     {
       NVIC_InitTypeDef NVIC_InitStructure;
       NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);      
       NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn;        //WWDG 中断
       NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  //抢占2 子优先级3 组2
       NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;     //抢占2,子优先级3,组2
       NVIC_Init(&NVIC_InitStructure);                        //NVIC 初始化
     }

 

?
1
2
//保存WWDG 计数器的设置值,默认为最大.
u8 WWDG_CNT=0x7f;
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  //初始化窗口看门狗
     //tr  :T[6:0],计数器值
     //wr   :W[6:0],窗口值
     //fprer:分频系数(WDGTB ),仅最低2 位有效
     //Fwwdg=PCLK1/(4096*2^fprer).
     void  WWDG_Init(u8 tr,u8 wr,u32 fprer)
     {
       RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);  // WWDG 时钟使能
       WWDG_CNT=tr&WWDG_CNT;       //初始化WWDG_CNT.
       WWDG_SetPrescaler(fprer);         //设置IWDG 预分频值
       WWDG_SetWindowValue(wr);        //设置窗口值
       WWDG_Enable(WWDG_CNT);        //使能看门狗,设置counter
       WWDG_ClearFlag();                //清除提前唤醒中断标志位 (注:若没有此句则会在初始化后先进入中断一次)
       WWDG_NVIC_Init();                //初始化窗口看门狗NVIC
       WWDG_EnableIT();                 //开启窗口看门狗中断
}


以上代码朋友们也可以跳到库函数代码中自己研究下,另外要说明下的是WWDG_EnableIT(); 函数相关代码

?
1
#define CFR_EWI_BB        (PERIPH_BB_BASE + (CFR_OFFSET * 32) + (EWI_BitNumber * 4))

用到位带操作,具体理解可参照《Cortex-M3权威指南》第五章的位带操作相关介绍(具体89页)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用STM32CubeMX配置看门狗时,首先需要了解独立看门狗的基本介绍和功能。独立看门狗是一种定时器,用于提供更高的安全性、时间的精确性和使用的灵活性。在STM32F1xx系列中,提供了两个看门狗设备,即独立看门狗和窗口看门狗,用于检测和解决由软件错误引起的故障。 配置独立看门狗的方法如下: 1. 打开STM32CubeMX软件,并选择相应的芯片型号。 2. 在"Peripherals"选项卡中,找到"Independent Watchdog"(独立看门狗)并勾选它。 3. 在弹出的窗口中,可以设置看门狗的分频系数和倒计时阈值。分频系数用于将LSI时钟分频为看门狗时钟,倒计时阈值用于设置看门狗的超时时间。 4. 根据需要,可以设置看门狗的上限时间(窗口值),该值必须大于0x40且小于0x7F。 5. 配置完成后,点击"Generate Code"(生成代码)按钮,即可生成相应的代码。 例如,如果将分频系数设置为32,LSI时钟为32kHz,则看门狗时钟为1kHz。如果将倒计时阈值设置为3000,则倒计时每减1,表示过去了1ms,因此3000表示3秒的超时时间。 需要注意的是,一旦启用了独立看门狗,系统将生成重置功能并启动其递减计数器。在喂狗时,必须在设定的上限时间和下限时间之间进行喂狗。如果喂狗时间超过上限时间或低于下限时间,都会触发看门狗的重启机制。其中下限时间是系统固定的0x40,而上限时间(窗口值)是用户可以定义的,只需大于0x40且小于0x7F即可。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [STM32开发(11)----CubeMX配置独立看门狗(IWDG)](https://blog.csdn.net/bin_zhang1/article/details/129021585)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [STM32CubeMX配置STM32使用看门狗](https://blog.csdn.net/weixin_43869518/article/details/124077283)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [STM32CubeIDE开发(十三), stm32窗口看门狗WWDG的CubeMX配置及HAL库底层实现分析](https://blog.csdn.net/py8105/article/details/128510772)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值