在之前的分享 【ST NUCLEO-C031C6开发板测评】独立看门狗IWDG使用 中,提到了STM32C0提供了两个看门狗:IWDG(独立看门狗)和WWDG(窗口看门狗)。
这篇帖子分享的是窗口看门狗WWDG使用。
一、硬件了解
从系统手册中,可以了解WWDG框图:
和独立看门狗IWDG不同,WWDG时钟由 APB 时钟经预分频后提供,因此能够做到精确计时。
另外,其喂狗和复位也和IWDG有所不同:
使用WWDG,当计数器值在WR到0x40之间时,能够正常喂狗。而在TR到WR之间喂狗,则会复位。
另外,计数器值低于0x40,也会复位。
因此,根据其功能,被命名为窗口计数器。
二、WWDG关键寄存器了解
1. WWDG控制寄存器
结合一张第三方的图,可以更好的了解这个寄存器:
WWDG_CR寄存的T[6:0]用于存储计数器的值,且当T[6]清零时,会产生复位。
通过几个关键点的二进制数据可以更清楚的了解:
T[6:0]均为1: 0b1111111 = 0x7f = 127
T[6]为0其余为1: 0b0111111 = 0x3f = 63
从上面的关键数据可以看出,计数器的值,只可能在0x7f ~ 0x40。
2. WWDG 配置寄存器 (WWDG_CFR)
这个寄存器里面,存放了多个配置。
首先是分频WDGTB[2:0],然后是提前唤醒中断使能,再就是7位窗口值只有W[6:0]。
其中,如果T[6:0] > W[6:0]时,进行"喂狗",也会复位。只要在 W[6:0]>=T[6:0]>0x3F的情况下,喂狗才能正常重载计数器。
三、WWDG超时时间
因为WWDG的计数器为T[6:0],且在一定窗口范围内,所以其超时时间相对较短。
WWDG是时序图如下:
对应的超时计算公示如下:
STM32C0 MCU的主频为48MHz,所以,对应的超时时间计算结果如下:
经过实际测试,发现上面官方手册中的计算公式中,WDGTB[1:0]应为WDGTB[2:0],这样正好符合上面计算出来的输出。
官方英文手册和中文手册中,应该都是同样写错了:
相对于IWDG超时时间可以长达32.768s而言,WWDG最大只有699.050ms。
如果超时时间,需要超过这个最大值,该怎么办呢?
WWDG提供了中断功能,在计数器值递减到0x40的时候,产生一个看门狗中断:
在看门狗中断服务程序中,及时喂狗,则可以重载计数器,从而避免下一次递减时触发复位。
通过看门狗中断服务程序,可以设置一个额外的计数器,在看门口计时器产生n次中断后,不继续喂狗,从而让复位操作成功触发。
四、zephyr中对WWDG的支持
在 zephyr/drivers/watchdog/wdt_wwdg_stm32.c中,提供了对WWDG调用的支持:
在 wwdg_stm32_install_timeout()调用中,通过传入的config->window.max来设置超时时间。
程序中,通过wwdg_stm32_convert_timeout()来计算计数器值,以及wwdg_stm32_get_timeout()来计算实际使用的超时时间:
在实际设置WWDG前,还使用宏定义IS_WWDG_COUNTER和IS_WWDG_TIMEOUT检测计算的值是否有效,本质上是设置的超时时间,是否超过了可以正常设置的范围。
上述代码,可以将超时时间,设置为500ms。
另外,从代码本身来看,应该是支持了看门口中断处理,但是在实际使用中,并没有触发,已经在zephyr的github提交了issue。
五、WWDG实际实使用
WWDG和IWDG的测试,都可以使用前面IWDG的测试样例和代码。
但需要对../zephyr/boards/arm/nucleo_c031c6/nucleo_c031c6.dts 做一些处理,具体如下:
默认没有开启wwdg,所以上述配置中开启,并设置watchdog0指向wwdg即可。
然后,对 【ST NUCLEO-C031C6开发板测评】独立看门狗IWDG使用 的代码做少许修改:
1. 设置超时时间为500ms
然后编译并下载到开发板运行即可:
west build -b nucleo_c031c6 samples/drivers/watchdog/
在不按键的情况下,输出如下:
如果不按键,则超时后就会自动重启。
如果在超时时间内按键,则会自动喂狗,重载计数器。
需要注意的是,按键来喂狗,在WWDG中很不好控制,因为只有在窗口期内喂狗才是有效的。
在实际程序中,在一段代码运行后,进行喂狗即可。
六、总结
IWDG和WWDG各有优势,也各有缺点。根据实际情况需要,灵活运用,可以给我们的嵌入式系统的稳定运行提供保障。
引用一张第三方思维导图图片,可以清晰的看到两者的异同点:
七、参考
帮主大佬这帖子是太优秀了,学习了之后,对两个狗狗有了更进一步的理解,感谢感谢!
引用: lugl4313820 发表于 2024-2-18 09:24 帮主大佬这帖子是太优秀了,学习了之后,对两个狗狗有了更进一步的理解,感谢感谢!
要让系统运行稳如老狗,狗狗不可少!
引用: HonestQiao 发表于 2024-2-18 17:56 要让系统运行稳如老狗,狗狗不可少!
多谢帮主的大佬的指点,读君一篇文,胜读十年书呀!