历史上的今天
返回首页

历史上的今天

今天是:2025年06月21日(星期六)

2020年06月21日 | STM32CubeMX系列教程15:看门狗(WDG)

2020-06-21 来源:eefocus

一、看门狗简介

看门狗其实就是一个定时器,从功能上说它可以让微控制器在程序发生意外(程序进入死循环或跑飞)的时候,能重新回复到系统刚上电状态,以保障系统出问题的时候可以重启一次。说的复杂一点,看门狗就是能让程序出问题是能重新启动系统。


二、独立看门狗(IWDG)

前文再续,书接上一会,上一章说到待机模式可以通过IWDG唤醒,独立看门口功能框图如下。实际上独立看门口狗就是一个递减计数器,当计时器的值减到0时,IWDG会产生一个复位信号,系统复位重新启动。为避免产生看门狗复位,则需在计数器减到0之前重载计数器,即“喂狗”。当程序出错时没有刷新计数器,计数器递减到0,系统复位重新启动,避免程序继续错误运行。


本章程序在串口printf工程的基础上修改,复制串口printf的工程,修改文件夹名。击STM32F746I.ioc打开STM32cubeMX的工程文件重新配置,开启独立看门狗(IWDG)。

  

IWDG参数配置如下。IWDG的时钟为32kHz,此时设置计数器时钟为32分频,则分频后的时钟频率为1KHz.递减基础器重载值(down-counter reload value)配置为1000,即1000ms不刷新IWDG系统复位。IWDG窗口值(windows value)为默认不修改。当计数器的值大于窗口值时,如果执行重载操作,则会产生复位。

生成报告以及代码,编译程序。在iwdg.c文件中可以看到IWDG初始化函数。在stm32f7xx_hal_iwdg.h头文件中可以看到IWDG的操作函数。

在main()函数中开启IWDG.

1/* USER CODE BEGIN 2 */
2  /* Start the IWDG */
3  HAL_IWDG_Start(&hiwdg);
4  printf("nr***** WaveShare Open7XXI-C Board *****nr");
5/* USER CODE END 2 */


在while循环中每延时800ms刷新一次IWDG,重载计数器。

01/* USER CODE BEGIN WHILE */
02 while (1)
03 {
04 /* USER CODE END WHILE */
05
06 /* USER CODE BEGIN 3 */
07       /* Set counter reload value to obtain 1000ms IWDG TimeOut.
08       IWDG counter clock Frequency = LsiFreq / 32
09       Counter Reload Value = 1000  */
10       printf("nr Refreshes the IWDG !!!nr");
11       /* Refresh IWDG: reload counter */
12       HAL_IWDG_Refresh(&hiwdg);
13       HAL_Delay(800);
14 }
15/* USER CODE END 3 */



编译程序并下载到开发板。打开串口调试助手,设置波特率为115200,串口助手上面会显示如下信息。





当在while循环中注释掉HAL_IWDG_Refresh(&hiwdg)语句,不刷新计数器。重新编译程序时串口会输出如下信号,由于不刷新计数器,独立看门狗每1000ms复位重启一次。



再实际应用中,独立看门狗刷新操作不会再while循环中,而且也不好计算时间。一般都是通过定时器中断处理函数中刷新IWDG。


三、窗口看门狗(WWDG)


窗口看门狗相对独立看门狗对计数器的刷新时间要求更加严格。必须在限定的时间窗口内刷新计数器。


窗口看门狗激活情况下,满足以下条件会产生复位。

1.当递减计数器的值小于0x40时(即从0x40滚到0x3F)会产生复位。


2.当计数器值大于窗口寄存器的值时,如果软件重载计数器,则会产生复位。


从上面的时序图中可以看到,如果递减计数器的值(T[6:0])大于窗口寄存器(W[6:0])的值,重载计数器会产生复位。当递减计时器的值小于0x40时,也会产生复位。所以只能在W[6:0] ~ 0x3F之间刷新,在窗口之外重载递减计数器时复位。存储在窗口寄存器(WWDG_CR)中的值必须介于0xFF和0xC0之间。开启窗口看门狗中断时,当递减计数器的值等于0x40时触发中断。


复制串口printf的工程,修改文件夹名。击STM32F746I.ioc打开STM32cubeMX的工程文件重新配置,开启窗口看门狗(WWDG)。




配置WWDG计数器预分频为8,窗口寄存器的值为90,递减计数器刷新值为127。


WWDG时钟是挂接到APB1上,系统时钟为216MHz时,PCLK1时钟为54MHz。

则WWDG计数器的频率为:(PCLK1 (54MHz)/4096)/8) = 1648 Hz (~607 us) 

WWDG计数器刷新值为127,则超时时间为:~607 us * (127-63) = 39 ms



开启窗口看门狗中断。

生成报告以及代码,编译程序。在wwdg.c文件中可以看到WWDG初始化函数。在stm32f7xx_hal_wwdg.h头文件中可以看到IWDG的操作函数。

在main()函数中开启IWDG.

1/* USER CODE BEGIN 2 */
2  /*##-1- Start the WWDG #####################################################*/
3  HAL_WWDG_Start_IT(&hwwdg);
4  printf("nr***** WaveShare Open7XXI-C Board *****nr");
5/* USER CODE END 2 */

在while循环中每延时1000ms输出一次信息。

01/* USER CODE BEGIN WHILE */
02while (1)
03{
04/* USER CODE END WHILE */
05
06/* USER CODE BEGIN 3 */
07      printf("nr www.waveshare.net !!!nr");
08      HAL_Delay(1000);
09}
10/* USER CODE END 3 */


在main.c文件后面添加WWDG中断回调函数,当递减计数器的值为0x40触发中断,中断处理函数中刷新WWDG。


01/* USER CODE BEGIN 4 */
02/**
03  * @brief  Early Wakeup WWDG callback.
04  * @param  hwwdg: pointer to a WWDG_HandleTypeDef structure that contains
05  *              the configuration information for the specified WWDG module.
06  * @retval None
07  */
08void HAL_WWDG_WakeupCallback(WWDG_HandleTypeDef* hwwdg)
09{
10  /* NOTE: This function Should not be modified, when the callback is needed,
11           the HAL_WWDG_WakeupCallback could be implemented in the user file
12   */
13    /*##-2- Refresh the WWDG #####################################################*/
14    HAL_WWDG_Refresh(hwwdg, 127);
15}
16/* USER CODE END 4 */


编译程序并下载到开发板。打开串口调试助手,设置波特率为115200,串口助手上面会显示如下信息。


当在WWDG中断回调函数中注释掉HAL_WWDG_Refresh(hwwdg, 127)语句,不刷新计数器。重新编译程序时串口会输出如下信号,由于不刷新计数器,独立看门狗每39ms复位重启一次。

推荐阅读

史海拾趣

Big-Sun Electronics Co Ltd公司的发展小趣事

随着国内市场的逐步饱和,Big-Sun Electronics Co Ltd公司开始将目光投向国际市场。公司积极参与国际电子展会,与海外客户建立起了良好的合作关系。同时,Big-Sun还与国际知名电子企业开展技术合作,共同研发新产品,进一步提升了公司的国际竞争力。

Electrolube公司的发展小趣事

在电子行业的激烈竞争中,Electrolube公司始终坚持以客户需求为导向,不断创新和拓展产品线。除了UVCL涂层外,公司还推出了一系列树脂、涂料和热管理解决方案的产品组合,为EV电池提供全面保护。

这些产品不仅具有优异的性能表现,而且能够满足不同客户的需求。例如,某些产品具有优异的耐高温性能,适用于高温环境下的电子设备;而另一些产品则具有出色的耐化学腐蚀性能,能够在恶劣的工作环境中保持稳定的性能。

Electrolube公司通过不断的技术创新和产品优化,成功拓展了市场份额,并在电子行业中树立了良好的品牌形象。同时,公司还积极与各大汽车制造商合作,共同推动电动汽车产业的发展。

Good-Ark公司的发展小趣事
定期检查电路各部件的工作状态,及时更换损坏的元件,确保电路长期稳定运行。
ES Systems公司的发展小趣事

ES Systems一直将品质管理作为企业发展的重要基石。公司建立了完善的质量管理体系和检测机制,确保每一件产品都符合高标准的质量要求。此外,ES Systems还不断加强员工的质量意识和技能培训,提高全员参与质量管理的积极性。这种品质管理的提升使得ES Systems的产品在市场上获得了良好的口碑和信誉。

请注意,以上故事均为虚构内容,仅用于说明电子行业公司可能的发展模式和故事框架。

Bestar Electric公司的发展小趣事

在电子行业的早期,Bestar Electric公司应运而生。作为一家初创企业,公司凭借对技术的深刻理解和市场需求的敏锐洞察,专注于电子元器件的研发与生产。通过不断的技术创新和产品优化,Bestar Electric逐渐在行业内建立起良好的声誉,并获得了初步的市场份额。

Broadcom(博通)公司的发展小趣事

2015年,博通迎来了历史性的时刻。安华高科技以170亿美元现金与200亿美元的股票,合计370亿美元并购了博通,使其成为安华高科技的子公司。这一并购不仅使博通获得了更多的资源和支持,也为其后续的快速发展奠定了坚实的基础。此后,博通通过一系列的并购活动,不断扩张其业务范围和市场份额。

问答坊 | AI 解惑

[休息一下]世界编程大赛第一名的程序(分享)

把这段代码复制下来存为文本文档,命名为1 (即1.txt)保存在C盘根目录下 附件中为程序代码  在DOS下用debug<1.txt   生成一个可执行程序。 具体给你写一下哦:点开始-》所有程序-》附件-》命令提示符出现C:\\......>cd\\(回车) ...…

查看全部问答>

分析师看好iPhone手机入华提苹果评级至看涨

国外媒体报道,美国投资机构Susquehana Financial分析师杰夫·菲达卡罗(Jeff Fidacaro)在一份投资报告中表示,苹果iphone智能手机进入中国等新兴市场后,将为苹果带来大量新商机。菲达卡罗表示,苹果iPhone进入中国等新兴市场后,该公司可推出针对 ...…

查看全部问答>

pcb封装

自己画的原件的封装 为什么在放置的时候找不到了,之后却在麽个角落?具体要怎么办啊,。急急!!!…

查看全部问答>

error LNK2019: 无法解析的外部符号 SHGetPathFromIDListW,

   我把VC6.0下的一个目录浏览程序在VS2005中打开后,移植到我的程序中!我开发的是wince下的程序,用VS2005开发!编译后出现链接错误:如下我错误信息!我已经把该包含的头文件都包含了啊!哪位知道请指教一下! 正在链接... CEView ...…

查看全部问答>

关于vxworks的任务的地址空间

关于vxworks的任务的地址空间,什么命令可以看到制定任务占用的地址范围?…

查看全部问答>

TLV数据对象

大家好,我这有些问题,希望有人给予帮助.这儿有两个数据对象的命令,主要是对TLV数据对象的操作 set data;retrive data 针对set data命令,这有一个EF文件内有三个原始数据对象   tag     length   &nbs ...…

查看全部问答>

单片机的应用的问题(紧急!!)

单片机才学没多久,写了个程序,死活有问题,头都大了,请大家帮忙啊!! 是交通灯的,要有P3.0,P3.1显示倒计时的秒数,同时红绿灯亮。并有INT0实现计时加一,INT1减一,T0确认。编写了以下的程序,可是在显示时出现问题,可以倒计时,可是灯不亮 ...…

查看全部问答>

ARM做的MP3播放器(LPC2148+VS1003+CH375+OLED)有频谱,用了操作系统uCOS-II

ARM做的MP3播放器(LPC2148+VS1003+CH375+OLED)有频谱,用了操作系统uCOS-II LPC2138模块: http://item.taobao.com/item.htm?id=7227468024…

查看全部问答>

STM32通过FSMC控制LCD的问题

最近做点小东西时用到了压箱底N久的一块屏(SED1335控制器,320×240单色),我将其挂在FSMC总线上,然后配置FSMC总线时用到如下子程序: =========================我是分割线=========================     void FSMC_Configura ...…

查看全部问答>

晒设计方案+STM32F429液晶屏基本操作

Stm32F429最突出的亮点应该就是自带LCD驱动器,看了一下官方例程stm32f429i_discovery_lcd.c里有关于液晶的操作,果然牛X,很多操作函数都没见过,比如有关层的函数和PolyLine函数,上网查了一下才发现其实这些函数st在之前的各种EVAL板子的例程中都 ...…

查看全部问答>