STM32开发,使用HAL库函数实现窗口看门狗WWDG功能
1 概述
1.1 资源概述
开发板:ST官方NUCLEO-F103RB开发板
CUBEMX版本:1.3.0
MDK版本:5.23
主控芯片型号:STM32F103RBT6
1.2 引脚资源分配
序号 | 引脚 | 资源 | 备注 |
---|---|---|---|
1 | PA13 | SWDIO | SWD输入输出信号 |
2 | PA14 | SWDCLK | SWD时钟信号 |
3 | PC13 | BUTTON | 用户按键 |
4 | PA5 | LED2 | 指示灯 |
1.3 窗口看门狗概述
窗口看门狗通常被用来监测,由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。除非递减计数器的值在T6位变成0前被刷新,看门狗电路在达到预置的时间周期时,会产生一个MCU复位。在递减计数器达到窗口寄存器数值之前,如果7位的递减计数器数值(在控制寄存器中)被刷新, 那么也将产生一个MCU复位。这表明递减计数器需要在一个有限的时间窗口中被刷新。
WWDG主要特性
● 可编程的自由运行递减计数器
● 条件复位
─ 当递减计数器的值小于0x40,(若看门狗被启动)则产生复位。
─ 当递减计数器在窗口外被重新装载,(若看门狗被启动)则产生复位。
● 如果启动了看门狗并且允许中断,当递减计数器等于0x40时产生早期唤醒中断(EWI),它可以被用于重装载计数器以避免WWDG复位。
1.4 实现功能
1、窗口看门狗功能。
2、使用HAL的窗口回调函数EWI,在0X40点喂狗。
3、while(1)设置LED灯闪烁,间隔时间1S。
4、当及时喂狗,没有窗口看门狗复位产生时,LED会不停的闪烁。
5、当没有及时喂狗,系统会不停复位,导致LED2灯常亮。
2 软件开发
2.1 CUBEMX配置
计数器时钟分频设为8,窗口值设为113,计数器设置为127(最大7位1111111)。计数器的值必须大于窗口值。使能早期唤醒中断。
2.2 WWDG原理框图和时序图
原理框图如下,三个门电路从左到右分别为与门,或门和与门。
时序图如下,依据CUBEMX的配置可以得到三个点的值
最早允许刷新的时间计算
最晚允许刷新时间(超时时间)计算
也就是程序不得早于14.336ms进行刷新,不得晚于65.536ms进行刷新。否则系统将会产生复位。在窗口刷新喂狗示意图如下。
2.3 程序设计
在此次试验中,我们并不使用计算得到的时间去执行喂狗操作,我们采用EWI功能函数HAL_WWDG_EarlyWakeupCallback()。这个中断函数在当向下计数器记到0X40时将会生效(产生复位0x3F的上一个状态),我们在此函数中进行喂狗即可。
1、使用CUBEMX生成代码,系统会自动生成WWDG的相关初始化函数;
MX_WWDG_Init();
2、将LED灯初始化,亮灯。
HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_SET);// 点亮LED灯
3、编写while(1)函数,每隔一秒钟闪烁LED灯。
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_Delay(1000);//延时1000ms
HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin); //LED翻转
}
4、编写回调函数EWI。
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)//当向下计数器到0X40时,会执行此中断函数
{
HAL_WWDG_Refresh(hwwdg);//喂狗
}
3、实验结果
将程序编译后,下载如官方开发板中。单板LED灯每隔1S进行闪烁。
将喂狗代码注释掉后,再编译下载,LED灯常亮,系统不停复位,