匿名
未登录
登录
丢石头百科
搜索
查看“STM32CubeMX系列教程15:看门狗(WDG)”的源代码
来自丢石头百科
名字空间
页面
讨论
更多
更多
页面选项
查看
查看源代码
历史
←
STM32CubeMX系列教程15:看门狗(WDG)
因为以下原因,您没有权限编辑本页:
您所请求的操作仅限于该用户组的用户使用:
用户
您可以查看与复制此页面的源代码。
<b style="font-size: 14px; font-family: 'Microsoft Yahei'; line-height: 16.8px; widows: auto; background-color: inherit;">一、看门狗简介</b> 看门狗其实就是一个定时器,从功能上说它可以让微控制器在程序发生意外(程序进入死循环或跑飞)的时候,能重新回复到系统刚上电状态,以保障系统出问题的时候可以重启一次。说的复杂一点,看门狗就是能让程序出问题是能重新启动系统。 <b style="background-color: inherit;">二</b><b style="line-height: 16.8px; widows: auto; font-size: 14px; font-family: 'Microsoft Yahei'; background-color: inherit;">、</b><b style="background-color: inherit;">独立看门狗(IWDG)</b> 前文再续,书接上一会,上一章说到待机模式可以通过IWDG唤醒,独立看门口功能框图如下。实际上独立看门口狗就是一个递减计数器,当计时器的值减到0时,IWDG会产生一个复位信号,系统复位重新启动。为避免产生看门狗复位,则需在计数器减到0之前重载计数器,即“喂狗”。当程序出错时没有刷新计数器,计数器递减到0,系统复位重新启动,避免程序继续错误运行。 [[File:170206cjq4hmqj3bmi408i.png]] 本章程序在串口printf工程的基础上修改,复制串口printf的工程,修改文件夹名。击STM32F746I.ioc打开STM32cubeMX的工程文件重新配置,开启独立看门狗(IWDG)。 [[File:170207h4o3kirzoeclekgo.png]] [[File:170207wx3bpadaopno88np.png]] IWDG参数配置如下。IWDG的时钟为32kHz,此时设置计数器时钟为32分频,则分频后的时钟频率为1KHz.递减基础器重载值(down-counter reload value)配置为1000,即1000ms不刷新IWDG系统复位。IWDG窗口值(windows value)为默认不修改。当计数器的值大于窗口值时,如果执行重载操作,则会产生复位。 [[File:170208d5qps8xq501q1ffq.png]] 生成报告以及代码,编译程序。在iwdg.c文件中可以看到IWDG初始化函数。在stm32f7xx_hal_iwdg.h头文件中可以看到IWDG的操作函数。 在main()函数中开启IWDG. <syntaxhighlight lang="python"> /* USER CODE BEGIN 2 */ /* Start the IWDG */ HAL_IWDG_Start(&hiwdg); printf("\n\r***** WaveShare Open7XXI-C Board *****\n\r"); /* USER CODE END 2 */ </syntaxhighlight> 在while循环中每延时800ms刷新一次IWDG,重载计数器。 <syntaxhighlight lang="python"> /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ /* Set counter reload value to obtain 1000ms IWDG TimeOut. IWDG counter clock Frequency = LsiFreq / 32 Counter Reload Value = 1000 */ printf("\n\r Refreshes the IWDG !!!\n\r"); /* Refresh IWDG: reload counter */ HAL_IWDG_Refresh(&hiwdg); HAL_Delay(800); } /* USER CODE END 3 */</syntaxhighlight> <syntaxhighlight lang="python"> </syntaxhighlight>编译程序并下载到开发板。打开串口调试助手,设置波特率为115200,串口助手上面会显示如下信息。 <syntaxhighlight lang="python"> [[File:170208e884q70ss420gb8q.png]] </syntaxhighlight> <syntaxhighlight lang="python"> 当在while循环中注释掉HAL_IWDG_Refresh(&hiwdg)语句,不刷新计数器。重新编译程序时串口会输出如下信号,由于不刷新计数器,独立看门狗每1000ms复位重启一次。</syntaxhighlight> <syntaxhighlight lang="python"> </syntaxhighlight> [[File:170209jt7biflif7ftffvf.png]] 再实际应用中,独立看门狗刷新操作不会再while循环中,而且也不好计算时间。一般都是通过定时器中断处理函数中刷新IWDG。 <b style="background-color: inherit;">三</b><b style="line-height: 16.8px; widows: auto; font-size: 14px; font-family: 'Microsoft Yahei'; background-color: inherit;">、</b><b style="background-color: inherit;">窗口看门狗(WWDG)</b> <b style="background-color: inherit;"> </b> 窗口看门狗相对独立看门狗对计数器的刷新时间要求更加严格。必须在限定的时间窗口内刷新计数器。 [[File:170215h6uqlovvqds5y9sq.png]] 窗口看门狗激活情况下,满足以下条件会产生复位。 1.当递减计数器的值小于0x40时(即从0x40滚到0x3F)会产生复位。 2.当计数器值大于窗口寄存器的值时,如果软件重载计数器,则会产生复位。 [[File:170218o0n7p3a9qh1aa517.png]] 从上面的时序图中可以看到,如果递减计数器的值(T[6:0])大于窗口寄存器(W[6:0])的值,重载计数器会产生复位。当递减计时器的值小于0x40时,也会产生复位。所以只能在W[6:0] ~ 0x3F之间刷新,在窗口之外重载递减计数器时复位。存储在窗口寄存器(WWDG_CR)中的值必须介于0xFF和0xC0之间。开启窗口看门狗中断时,当递减计数器的值等于0x40时触发中断。 复制串口printf的工程,修改文件夹名。击STM32F746I.ioc打开STM32cubeMX的工程文件重新配置,开启窗口看门狗(WWDG)。 [[File:170155v5bvw4lvs5ye5cyn.png]] 配置WWDG计数器预分频为8,窗口寄存器的值为90,递减计数器刷新值为127。 [[File:170219j9uk1g2xurrdv74d.png]] WWDG时钟是挂接到APB1上,系统时钟为216MHz时,PCLK1时钟为54MHz。 则WWDG计数器的频率为:(PCLK1 (54MHz)/4096)/8) = 1648 Hz (~607 us) WWDG计数器刷新值为127,则超时时间为:~607 us * (127-63) = 39 ms [[File:170220zst7rc8atk7s18xs.png]] 开启窗口看门狗中断。 [[File:170221mln03mzt717tjan7.png]] 生成报告以及代码,编译程序。在wwdg.c文件中可以看到WWDG初始化函数。在stm32f7xx_hal_wwdg.h头文件中可以看到IWDG的操作函数。 在main()函数中开启IWDG. <syntaxhighlight lang="python"> /* USER CODE BEGIN 2 */ /*##-1- Start the WWDG #####################################################*/ HAL_WWDG_Start_IT(&hwwdg); printf("\n\r***** WaveShare Open7XXI-C Board *****\n\r"); /* USER CODE END 2 */</syntaxhighlight> 在while循环中每延时1000ms输出一次信息。 <syntaxhighlight lang="python"> /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ printf("\n\r {{SERVERNAME}} !!!\n\r"); HAL_Delay(1000); } /* USER CODE END 3 */</syntaxhighlight> <syntaxhighlight lang="python"> </syntaxhighlight> <syntaxhighlight lang="python"> 在main.c文件后面添加WWDG中断回调函数,当递减计数器的值为0x40触发中断,中断处理函数中刷新WWDG。</syntaxhighlight> <syntaxhighlight lang="python"> <syntaxhighlight lang="python"> /* USER CODE BEGIN 4 */ /** * @brief Early Wakeup WWDG callback. * @param hwwdg: pointer to a WWDG_HandleTypeDef structure that contains * the configuration information for the specified WWDG module. * @retval None */ void HAL_WWDG_WakeupCallback(WWDG_HandleTypeDef* hwwdg) { /* NOTE: This function Should not be modified, when the callback is needed, the HAL_WWDG_WakeupCallback could be implemented in the user file */ /*##-2- Refresh the WWDG #####################################################*/ HAL_WWDG_Refresh(hwwdg, 127); } /* USER CODE END 4 */</syntaxhighlight> </syntaxhighlight> <syntaxhighlight lang="python"> </syntaxhighlight>编译程序并下载到开发板。打开串口调试助手,设置波特率为115200,串口助手上面会显示如下信息。 [[File:170221dsjbobjo9s4bzwhw.png]] <syntaxhighlight lang="python"> 当在WWDG中断回调函数中注释掉HAL_WWDG_Refresh(hwwdg, 127)语句,不刷新计数器。重新编译程序时串口会输出如下信号,由于不刷新计数器,独立看门狗每39ms复位重启一次。</syntaxhighlight> <syntaxhighlight lang="python"> </syntaxhighlight> [[File:170222d6gehrbbrj66fcfp.png]]
返回至
STM32CubeMX系列教程15:看门狗(WDG)
。
导航
导航
首页
最近更改
随机页面
MediaWiki帮助
首页
首页
树莓派
主机
配件包
外壳
键鼠
电源
扩展板
显示屏
墨水屏
摄像模块
通信模块
继电器
电机驱动板
游戏机
产品分类
树莓派
Arduino
micro:bit
STM32
Espressif
WiFi模块
蓝牙模块
无线模块
LoRa模块
4G模块
GSM
GPRS
以太网
导航模块
北斗卫星
GPS
LCD
墨水屏
OLED
摄像头
USB模块
串口模块
RS232
RS485
CAN
传感器
温度模块
湿度模块
气压模块
继电器
电机模块
指纹模块
电平转换
音频模块
编程器
Wiki工具
Wiki工具
特殊页面
页面工具
页面工具
用户页面工具
更多
链入页面
相关更改
页面信息
页面日志