STM32CubeMX教程24 WDG - 独立/窗口看门狗_cubemx配置看门狗-CSDN博客

在开始之前,也读到了别人的博客,感觉写的非常好,保存了下来

F1使用的LSI时钟频率为40Khz,F4/F7/H7使用的LSI时钟频率为32Khz,

1.问题1:什么是独立看门狗,什么是窗口门狗?

独立看门狗可以理解为可以产生系统复位信号的计数器,计数值减到0时产生复位信号。

窗口看门狗可以理解为可以产生系统复位信号和提前唤醒中断的计数器,产生中断的条件有两个一个是计数值大于窗口值时,即T[6:0]>W[6:0];另外一个条件是T[6:0]<=0X3F时,这里0x3F对应的十进制数是63;在这里我们要特别的记几个值127,64和63,分别对应16进制数0x7F,0x40和0x3F。后面再讲为什么。

2.问题2:独立看门狗和窗口看门狗它的作用是什么?

首先先将一下独立看门狗的作用:复位简而言之让开发板产生复位条件,在什么情况下开发板需要复位呢,就是开发板出现问题,我们的程序不运行时,出现死机或者异常时需要复位一下,常见的复位有硬件复位即板子上有reset按钮,这里独立看门狗主要用于解决外界电磁干扰或者系统自身硬件异常导致的程序跑飞问题。对于时间精度要求不高,

而针对窗口看门狗,主要解决软件异常;

3.问题3:如何理解喂狗?

喂狗就相当于在一定的时间内不断地给狗喂粮食,假设时间为T,这里的T为计数时间,我们要在T减小到0的这个区间内不断地喂狗,如果狗没有吃的了,就会叫,这里就是产生复位信号。喂狗的作用是检测程序是否正常运行,如果程序正常运行就会不断地喂狗,如果程序卡死到某个环节,超过了一定的时间T,就是就计数器减到0产生复位信号,程序就又开始运行了。

程序正常运行---------------------------喂狗操作正常运行(计时时间正常)

程序卡死运行----------------------------喂狗操作异常(计时时间超出合理范围,计数器值为0.产生复位信号)

4.问题4:IWDG工作原理和WWDG工作原理是什么?

无论是定时器还是独立看门狗,我们都只需要抓住重点部分,包含预分频器PSC,递增/递减计数器CNT和自动重装值,对于定时器而言时递增计数器,每来一个时钟沿计一个数加1,对于独立看门狗而言每来一个时钟沿则减1,定时器时CNT不断自加,加到CNT=ARR自动重装值时产生中断,在中断里面我们就可以实现我们想要的功能,这就是定时器中断,假设我们设置为定时器时间为1s,那我们就可以在1s的时间内不断重复地做我们想做的事情;

而对于独立看门狗,这里则是来一个时钟沿减一个数,类比一下狗的盆盆里面粮食越来越少,就是CNT不断减少,为了防止狗叫,我们就要不断地给狗盆盆里面喂饭,防止狗叫,狗叫就是产生复位信号,狗叫以后,我们又要给狗喂饭,不断地喂饭,狗不叫程序就开始正常运行,这里的喂饭就是加自动重装值加载到递减计数器里面

而对于WWDG,喂狗的事件则变得更加精确,不能过早喂狗,不能过晚喂狗,要在一定地事件范围内进行喂狗,前里面我说了,要记住三个值,127/64/63,127对应的是T[6:0]全为1时最大值为127,0x40为64和0x3F为63,

当计数值大于窗口上限值 W[6:0]<x<T[[6:0],产生复位信号

当x<=0x3F时也会产生复位信号

真正的喂狗时间为0x3F<x<=w[6:0]窗口上限值

当x=0x40时产生提前唤醒中断

5.问题5:IWDG框图和WWDG框图应该怎么看?(了解就行)

我们上述所说的一切话理解起来都可以理解为是对IWDG寄存器的操作

IWDG_KR寄存器中写入0XCCCC相当于启动看门狗

IWDG_KR寄存器中写入0X5555相当于IWDG_PR和IWDG_RLR工作

IWDG_KR寄存器中写入0XAAAA相当于不断喂狗

由这个框图我们可以非常清晰地看到产生复位信号的来源,可以看到WWDG_CR寄存器T6位为0时,经过或门非支路变为1,就会产生复位信号,即0x40=0100 0000变为0x3F=0011 1111,就是T6位由1变为0时产生复位信号,还有一条之路就是比较器T6:0>W6:0时,就会产生复位信号。

6.问题6:这里喂狗时间应该怎么计算?(重要)

怎么理解这里的公式?不要死记硬背,

记一个数所用的频率=f(时钟源频率)/psc

那么计一个数所用的时间就为 psc/f

计自动重装值个值rlr所有的时间就为psc*rlr/f

WWDG想比于IWDG在预分频前又多了一个4096分频,这里的T[5:0]范围是0到63

7.问题7:IWDG和WWDG的cubeMX如何设置?

7.1IWDG的cubeMX配置

第一步首先要搞清楚时钟源频率是多少

第二部在Pinout & Configuration页面左边功能分类栏目System Core中单击其中IWDG,在Mode中勾选Activated,最后在下方配置两个参数即可,时钟使用LSI配置不可调,IWDG无中断,具体步骤如下图所示

计算一下T溢出时间就是

计一个数所用的频率:32000 000/16=2000 000hz

计4095个数所需要的时间为 4095/2000 000=0.0020475s=2.0475ms,那么喂狗的时间就要小于2.0745ms,超过2.0745ms就会产生复位信号

7.2WWDG的cubeMX配置

(这里我参考的是别人的,因为确实写得很清楚,就没有必要再写了)

时钟树配置

由于窗口看门狗递减定时器为7位且递减到0x3F就会产生复位,因此最大计数值也才127-63=64,因此其时钟频率尽可能低一点,否则超时时间太短,实验现象不太好观察,这里将PCLK1设置为了21MHz,具体时钟配置如下图所示

单击Pinout & Configuration页面左边的System Core 的WWDG进入窗口看门狗的设置,在Mode中勾选Activated,在下方配置其分频系数为8,窗口值为90,计数器重装值为最大值127,具体配置如下图所示

相关寄存器配置

现在我们来计算一下窗口看门狗的超时时间

首先PCLK1设置为了21MHz,然后该时钟经过4096次分频,在经过设置的8分频得到的频率为640.869140625Hz

则其超时时间可以计算得到为(127-63)/640.869140625≈0.09986s≈99.86ms

其不允许喂狗的时间可以计算得到为(127-90)/640.869140625≈57.734ms

即当窗口定时器被初始化启动后,如果在57.734ms-100ms之间没有进行喂狗操作,那么窗口看门狗将超时导致程序复位

中断配置

在Pinout & Configuration页面左边System Core/NVIC中勾选Window watchdog interrupt全局中断,然后选择合适的中断优先级即可,这里优先级建议选大一些,优先级太高会影响程序运行

8.IWDG和WWDG相关函数调用

/*独立看门狗喂狗函数*/
HAL_StatusTypeDef HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg)
 
/*窗口看门狗喂狗函数*/
HAL_StatusTypeDef HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg)
 
/*窗口看门狗早唤醒中断回调函数*/
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐