[原创] 【ST NUCLEO-C031C6开发板测评】窗口看门狗WWDG使用

HonestQiao   2024-2-17 22:39 楼主

在之前的分享 【ST NUCLEO-C031C6开发板测评】独立看门狗IWDG使用 中,提到了STM32C0提供了两个看门狗:IWDG(独立看门狗)和WWDG(窗口看门狗)。

 

这篇帖子分享的是窗口看门狗WWDG使用。

 

一、硬件了解

从系统手册中,可以了解WWDG框图:

image.png  

和独立看门狗IWDG不同,WWDG时钟由 APB 时钟经预分频后提供,因此能够做到精确计时。

 

另外,其喂狗和复位也和IWDG有所不同:

image.png  

使用WWDG,当计数器值在WR到0x40之间时,能够正常喂狗。而在TR到WR之间喂狗,则会复位。

另外,计数器值低于0x40,也会复位。

因此,根据其功能,被命名为窗口计数器。

 

二、WWDG关键寄存器了解

1. WWDG控制寄存器

image.png  

结合一张第三方的图,可以更好的了解这个寄存器:

 

WWDG003.png

 

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)

image.png  

这个寄存器里面,存放了多个配置。

首先是分频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是时序图如下:

image.png  

对应的超时计算公示如下:

image.png  

 

STM32C0 MCU的主频为48MHz,所以,对应的超时时间计算结果如下:

image.png  

经过实际测试,发现上面官方手册中的计算公式中,WDGTB[1:0]应为WDGTB[2:0],这样正好符合上面计算出来的输出。

官方英文手册和中文手册中,应该都是同样写错了:

image.png  

 

相对于IWDG超时时间可以长达32.768s而言,WWDG最大只有699.050ms。

如果超时时间,需要超过这个最大值,该怎么办呢?

WWDG提供了中断功能,在计数器值递减到0x40的时候,产生一个看门狗中断:

image.png 在看门狗中断服务程序中,及时喂狗,则可以重载计数器,从而避免下一次递减时触发复位。

通过看门狗中断服务程序,可以设置一个额外的计数器,在看门口计时器产生n次中断后,不继续喂狗,从而让复位操作成功触发。

 

四、zephyr中对WWDG的支持

在 zephyr/drivers/watchdog/wdt_wwdg_stm32.c中,提供了对WWDG调用的支持:

image.png  

 

在 wwdg_stm32_install_timeout()调用中,通过传入的config->window.max来设置超时时间。

程序中,通过wwdg_stm32_convert_timeout()来计算计数器值,以及wwdg_stm32_get_timeout()来计算实际使用的超时时间:

image.png  

image.png  

 

在实际设置WWDG前,还使用宏定义IS_WWDG_COUNTER和IS_WWDG_TIMEOUT检测计算的值是否有效,本质上是设置的超时时间,是否超过了可以正常设置的范围。

 

image.png  

上述代码,可以将超时时间,设置为500ms。

 

另外,从代码本身来看,应该是支持了看门口中断处理,但是在实际使用中,并没有触发,已经在zephyr的github提交了issue。

 

五、WWDG实际实使用

WWDG和IWDG的测试,都可以使用前面IWDG的测试样例和代码。

但需要对../zephyr/boards/arm/nucleo_c031c6/nucleo_c031c6.dts 做一些处理,具体如下:

image.png   默认没有开启wwdg,所以上述配置中开启,并设置watchdog0指向wwdg即可。

 

然后,对 【ST NUCLEO-C031C6开发板测评】独立看门狗IWDG使用 的代码做少许修改:

1. 设置超时时间为500ms

image.png   2. 设置延时时间为100ms

image.png  

 

然后编译并下载到开发板运行即可:

west build -b nucleo_c031c6 samples/drivers/watchdog/

 

在不按键的情况下,输出如下:

image.png   上述输出中,设置500ms,实际应用502.442ms。

如果不按键,则超时后就会自动重启。

 

如果在超时时间内按键,则会自动喂狗,重载计数器。

image.png 需要注意的是,按键来喂狗,在WWDG中很不好控制,因为只有在窗口期内喂狗才是有效的。

在实际程序中,在一段代码运行后,进行喂狗即可。

 

六、总结

IWDG和WWDG各有优势,也各有缺点。根据实际情况需要,灵活运用,可以给我们的嵌入式系统的稳定运行提供保障。

引用一张第三方思维导图图片,可以清晰的看到两者的异同点:

 

1854804-20191129132615691-1023355657.png

 

 

七、参考

回复评论 (3)

帮主大佬这帖子是太优秀了,学习了之后,对两个狗狗有了更进一步的理解,感谢感谢!

点赞  2024-2-18 09:24
引用: lugl4313820 发表于 2024-2-18 09:24 帮主大佬这帖子是太优秀了,学习了之后,对两个狗狗有了更进一步的理解,感谢感谢!

要让系统运行稳如老狗,狗狗不可少!

点赞  2024-2-18 17:56
引用: HonestQiao 发表于 2024-2-18 17:56 要让系统运行稳如老狗,狗狗不可少!

多谢帮主的大佬的指点,读君一篇文,胜读十年书呀!

点赞  2024-2-18 19:38
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复