深圳市航顺芯片技术研发有限公司
直播中

h1654155275.5669

7年用户 1028经验值
私信 关注
[问答]

如何利用STM32MP157A芯片的窗口看门狗复位程序

STM32CubeIDE软件的基本设计流程和设计步骤有哪些?
如何去使用窗口看门狗?
如何利用STM32MP157A芯片的窗口看门狗复位程序?

回帖(1)

李娟

2021-8-9 15:49:01
第 1 章 Cortex-M4 窗口看门狗
实验目的
熟悉STM32CubeIDE工具软件的使用。
掌握STM32CubeIDE软件的基本设计流程和设计步骤,能够使用工具进行设计、编程、仿真调试。
学习窗口看门狗的使用方法,掌握如何利用STM32MP157A芯片的窗口看门狗复位程序。
实验环境
FS-MP1A开发平台
ST-Link仿真器
STM32CubeIDE开发软件
PC机 XP、Window7/10 (32/64bit)
实验原理
看门狗其实就是一个定时器,从功能上说它可以让微控制器在程序发生意外(程序进入死循环或跑飞)的时候,能重新回复到系统刚上电状态,以保障系统出问题的时候可以重启一次。说的简单一点,看门狗就是能让程序出问题时能重新启动系统。
窗口看门狗的工作原理是一个递减计数器不断的往下递减计数,当减到一个固定值 0x40 时还不喂狗的话,产生复位,这个值叫作窗口的下限,是固定的值,不能改变。另外窗口看门狗计数器的值在减到某一个数之前喂狗的话也会产生复位,这个值叫作窗口的上限,上限值由用户独立设置。
窗口看门狗计数器的值必须在上窗口和下窗口之间才可以喂狗,这就是窗口看门狗中窗口两个字的含义。
窗口看门狗时钟:
窗口看门狗时钟来自PCLK1,由RCC时钟控制器启动。
计数器时钟:
计数器时钟由 CK计时器时钟经过预分频器分频得到,分频系数由配置寄存器 CFR 的位 8:7 WDGTB[1:0]配置,可以是[0,1,2,3],其中 CK计时器时钟=PCLK1/4096,4096对应于内部分频器的值。所以计数器的时钟CNT_CK=PCLK1/4096/(2^WDGTB),这就可以算出计数器减一个数的时间 T= 1/CNT_CK =Tpclk1 * 4096 * (2^WDGTB)。
计数器:
窗口看门狗的计数器是一个递减计数器,共有 7 位,其值存在控制寄存器 CR 的位 6:0,即 T[6:0],当 7 个位全部为 1时是 0x7F,这个是最大值,当递减到 T6 位变成 0时,即从0x40 变为0x3F时候,会产生看门狗复位。这个值 0X40 是看门狗能够递减到的最小值,所以计数器的值只能是:0x40~0x7F之间,实际上用来计数的是 T[5:0]。当递减计数器递减到 0x40 的时候,还不会马上产生复位,如果使能了提前唤醒中断:CFR 位 9 EWI 置 1,则产生提前唤醒中断,如果真进入了这个中断的话,就说明程序肯定是出问题了,那么在中断服务程序里面我们就需要做最重要的工作,比如保存重要数据,或者报警等,这个中断我们也叫它死前中断。
窗口值:
我们知道窗口看门狗必须在计数器的值在一个范围内才可以喂狗,其中下窗口的值是
固定的 0x40,上窗口的值可以改变,具体由配置寄存器 CFR 的位 6:0 W[6:0]设置。其值必须大于 0x40,如果小于或者等于 0x40就是失去了窗口的价值,而且也不能大于计数器的值,所以必须得小于 0x7F。
窗口看门狗激活情况下,满足以下条件会产生复位。
1.当递减计数器的值小于0x40时(即从0x40到0x3F)会产生复位。
2.当计数器值大于窗口寄存器的值时,如果软件重载计数器,则会产生复位。

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

WWDG时钟是挂在APB1上的,本实验配置PCLK1时钟为64MHz,预分频为8,T[5:0]最大为63。
t_WWDG=(1/64000)×4096×2^3×(63+1)=32.77 ms

实验步骤
打开STM32CubeIDE-》File-》New-》STM32 Project。
可以在左侧搜索框内输入芯片型号STM32MP157A进行搜索,选择对应芯片,点击Next。
填写工程名,点击Finsh。
点击Yes打开配置页面。

配置WWDG1,勾选Cortex-M4,勾选Activated。
配置WWDG计数器预分频为8,窗口寄存器的值为90,递减计数器刷新值为127。
Early wakeup interrupt使能 Enable,开启窗口看门狗中断。

配置UART4,勾选Cortex-M4,Mode选择Asynchronous,搜索框搜索PB2、PG11,分别配置为UART4_RX、UART4_TX 。
默认时钟配置64MHz。
在Code Generator处选择为每个外设生成单独的C和H文件,这样设置方便阅读代码。
完成以上设置后,Ctrl+S保存,会提示是否需要生成代码,选择Yes即可自动生成代码。系统会自动生成System Clock代码。

可以在左侧工程文件夹找到WDT_CM4子工程,打开main.c。
添加窗口看门狗中断回调函数,串口重定向函数。
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg){ HAL_WWDG_Refresh(hwwdg);}int __io_putchar(int ch){ HAL_UART_Transmit(&huart4, (uint8_t *)&ch, 1, 0xFFFF); return ch;} 在main函数中添加打印语句,实现程序运行正常,不断打印信息。

上述为新建工程配置过程,可参考《Cortex-M4开发篇1:STM32MP1微控制器之开发环境》章节进行导入已有工程。
配置完成或导入工程后进行程序下载,具体步骤参考《Cortex-M4开发篇1:STM32MP1微控制器之开发环境》节进行开发板连接,程序编译、下载。
实验现象
连接串口线,打开串口调试助手可以看到。
在窗口看门狗中断回调函数中注释掉HAL_WWDG_Refresh(hwwdg)后,不刷新计数器。由于不刷新计数器,看门狗每33ms复位重启一次。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分