历史上的今天
今天是: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 */ |
| 02 | while (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 | */ |
| 08 | void 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复位重启一次。
史海拾趣
|
把这段代码复制下来存为文本文档,命名为1 (即1.txt)保存在C盘根目录下 附件中为程序代码 在DOS下用debug<1.txt 生成一个可执行程序。 具体给你写一下哦:点开始-》所有程序-》附件-》命令提示符出现C:\\......>cd\\(回车) ...… 查看全部问答> |
|
国外媒体报道,美国投资机构Susquehana Financial分析师杰夫·菲达卡罗(Jeff Fidacaro)在一份投资报告中表示,苹果iphone智能手机进入中国等新兴市场后,将为苹果带来大量新商机。菲达卡罗表示,苹果iPhone进入中国等新兴市场后,该公司可推出针对 ...… 查看全部问答> |
|
error LNK2019: 无法解析的外部符号 SHGetPathFromIDListW, 我把VC6.0下的一个目录浏览程序在VS2005中打开后,移植到我的程序中!我开发的是wince下的程序,用VS2005开发!编译后出现链接错误:如下我错误信息!我已经把该包含的头文件都包含了啊!哪位知道请指教一下! 正在链接... CEView ...… 查看全部问答> |
|
单片机才学没多久,写了个程序,死活有问题,头都大了,请大家帮忙啊!! 是交通灯的,要有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… 查看全部问答> |
|
最近做点小东西时用到了压箱底N久的一块屏(SED1335控制器,320×240单色),我将其挂在FSMC总线上,然后配置FSMC总线时用到如下子程序: =========================我是分割线========================= void FSMC_Configura ...… 查看全部问答> |
|
Stm32F429最突出的亮点应该就是自带LCD驱动器,看了一下官方例程stm32f429i_discovery_lcd.c里有关于液晶的操作,果然牛X,很多操作函数都没见过,比如有关层的函数和PolyLine函数,上网查了一下才发现其实这些函数st在之前的各种EVAL板子的例程中都 ...… 查看全部问答> |




