目录
概述
1 认识窗口看门狗 (WWDG)
1.1 窗口看门狗定义
1.2 WWDG 主要特性
2 WWDG 功能说明
2.1 WWDG框图
2.2 WWDG 内部信号
2.3 控制递减计数器
2.4 看门狗中断高级特性
2.5 如何设置看门狗超时
3 WWDG 寄存器
3.1 控制寄存器 (WWDG_CR)
3.2 配置寄存器 (WWDG_CFR)
3.3 状态寄存器 (WWDG_SR)
4 使用STM32Cube配置WWDG参数
4.1 使能WWDG
4.2 根据参数计算复位时间
5 WWDG相关的库函数
5.1 初始化函数:HAL_WWDG_Init
5.2 喂狗函数: HAL_WWDG_Refresh
5.3 中断函数: HAL_WWDG_IRQHandler
5.4 中断回调函数:HAL_WWDG_EarlyWakeupCallback
概述
本文详细介绍了STM32H7系统窗口看门狗 (WWDG)的相关知识,包括WWDG的实现原理,其在STM32系统中时钟的关系,寄存器的内容和配置方法等。还使用STM32Cube配置一个简单的Demo来做验证。
1 认识窗口看门狗 (WWDG)
1.1 窗口看门狗定义
系统窗口看门狗 (WWDG) 通常被用来监测,由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。除非程序在(WWDG_CR) T6 位变成 0 前刷新递减计数器的
值,否则看门狗电路在达到预置的时间周期时,会产生一个复位。
如果在递减计数器达到窗口寄存器值之前刷新控制寄存器(WWDG_CR)中的 7 位递减计数器值,也会产生复位。这意味着必须在限定的时间窗口内刷新计数器。
WWDG 时钟由 APB 时钟经预分频后提供,通过可配置的时间窗口来检测应用程序非正常的过迟或过早的操作。WWDG 最适合那些要求看门狗在精确计时窗口起作用的应用程序。
1.2 WWDG 主要特性
1)可编程的自由运行递减计数器
2)复位条件
复位条件 | 说明 |
---|---|
1 | 当递减计数器值小于 0x40 时复位(如果看门狗已激活) |
2 | 在窗口之外重载递减计数器时复位(如果看门狗已激活) |
3)提前唤醒中断 (EWI):当递减计数器等于 0x40 时触发(如果已使能且看门狗已激活)
2 WWDG 功能说明
如果激活看门狗( WWDG_CR 寄存器中的 WDGA 位置 1),则当 7 位递减计数器( T[6:0]
位)从 0x40 递减到 0x3F( T6 已清零)时会引发复位。如果软件在重载计数器时,计数器
的值大于窗口寄存器,则会产生复位。
2.1 WWDG框图
2.2 WWDG 内部信号
2.3 控制递减计数器
递减计数器处于自由运行状态,即使禁止看门狗,递减计数器仍继续递减计数。当使能看门
狗时,必须将 T6 位置 1,以防止立即复位。
T[5:0] 位包含了看门狗产生复位之前的计时数目; 复位前的延时时间在一个最小值和一个最
大值之间变化,这是因为写入 WWDG_CR 寄存器时,预分频器的状态是未知的。
配置寄存器 (WWDG_CFR) 包含窗口的上限:为防止发生复位,当递减计数器的值低于窗口寄存器值且大于 0x3F 时必须重载。
注: 可使用 T6 位产生软件复位(将 WDGA 位置 1 并将 T6 位清零)。
2.4 看门狗中断高级特性
如果在产生实际复位之前必须执行特定的安全操作或数据记录,则可使用提前唤醒中断
(EWI)。通过设置 WWDG_CFR 寄存器中的 EWI 位使能 EWI 中断。
当递减计数器的值为0x40 时,将生成 EWI 中断。在复位器件之前,可以使用相应的中断服务程序 (ISR) 来触发特定操作(例如通信或数据记录)。
在某些应用中,可以使用 EWI 中断来管理软件系统检查和/或系统恢复/功能退化,而不会生
成 WWDG 复位。在这种情况下,相应的中断服务程序 (ISR) 可用来重载 WWDG 计数器以
避免 WWDG 复位,然后再触发所需操作。
通过将 0 写入 WWDG_SR 寄存器中的 EWIF 位来清除 EWI 中断。
注: 当由于在更高优先级任务中有系统锁定而无法使用 EWI 中断时,最终会产生 WWDG 复位
2.5 如何设置看门狗超时
超时值的计算方法:
3 WWDG 寄存器
3.1 控制寄存器 (WWDG_CR)
位 7 WDGA:
激活位 (Activation bit),此位由软件置 1,只有复位后才由硬件清零。当 WDGA = 1 时,看门狗可产生复位。
0:禁止看门狗
1:使能看门狗
位 6:0 T[6:0]:
7 位计数器 (7-bit counter)( MSB 到 LSB)这些位用来存储看门狗计数器的值,每隔 (4096 x ) PCLK 个周期递减一次。当它从0x40 递减到 0x3F( T6 清零)时会产生复位。
3.2 配置寄存器 (WWDG_CFR)
偏移地址: 0x04
复位值: 0x0000 007F
位 31:14 保留,必须保持复位值。
位 13:11 WDGTB[2:0]: 定时器时基 (Timer base)
可按如下方式修改预分频器的时基:
000: CK 计数器时钟 (PCLK div 4096) 分频器 1
001: CK 计数器时钟 (PCLK div 4096) 分频器 2
010: CK 计数器时钟 (PCLK div 4096) 分频器 4
011: CK 计数器时钟 (PCLK div 4096) 分频器 8
100: CK 计数器时钟 (PCLK div 4096) 分频器 16
101: CK 计数器时钟 (PCLK div 4096) 分频器 32
110: CK 计数器时钟 (PCLK div 4096) 分频器 64
111: CK 计数器时钟 (PCLK div 4096) 分频器 128
位 10 保留,必须保持复位值。
位 9 EWI: 提前唤醒中断 (Early wakeup interrupt)置 1 后,只要计数器值达到 0x40 就会产生中断。此中断只有在复位后才由硬件清零。
位 8:7 保留,必须保持复位值。
位 6:0 W[6:0]: 7 位窗口值 (7-bit window value),这些位包含用于与递减计数器进行比较的窗口值
3.3 状态寄存器 (WWDG_SR)
偏移地址: 0x08
复位值: 0x0000 0000
位 31:1 保留,必须保持复位值。
位 0 EWIF: 提前唤醒中断标志 (Early wakeup interrupt flag)当计数器值达到 0x40 时此位由硬件置 1。它必须由软件通过写入 0 来清零。写入 1 不起作用。如果不使能中断,此位也会被置 1。
4 使用STM32Cube配置WWDG参数
4.1 使能WWDG
配置参数:
使能中断:
pclk对应的APB总线时钟:
4.2 根据参数计算复位时间
根据超时值计算公式可得:
参数名称 | 数值 | 说明 |
---|---|---|
t(PCLK) | 1/100 000 | APB 时钟周期,以 ms 为测量单位: 100M |
WDGTB[2:0] | 1 | 定时器时基 |
T[5:0] | 64 | 7 位计数器 (7-bit counter)( MSB 到 LSB) |
通过以上参数计算t( WWDG) = 1/100 000 x 4096x2 x 65 = 5.3248 ms
5 WWDG相关的库函数
5.1 初始化函数:HAL_WWDG_Init
函数原型:
HAL_StatusTypeDef HAL_WWDG_Init(WWDG_HandleTypeDef *hwwdg);
使用Demo:
/* WWDG1 init function */
void MX_WWDG1_Init(void)
{/* USER CODE BEGIN WWDG1_Init 0 *//* USER CODE END WWDG1_Init 0 *//* USER CODE BEGIN WWDG1_Init 1 *//* USER CODE END WWDG1_Init 1 */hwwdg1.Instance = WWDG1;hwwdg1.Init.Prescaler = WWDG_PRESCALER_1;hwwdg1.Init.Window = 64;hwwdg1.Init.Counter = 64;hwwdg1.Init.EWIMode = WWDG_EWI_DISABLE;if (HAL_WWDG_Init(&hwwdg1) != HAL_OK){Error_Handler();}/* USER CODE BEGIN WWDG1_Init 2 *//* USER CODE END WWDG1_Init 2 */}
5.2 喂狗函数: HAL_WWDG_Refresh
函数原型:
HAL_StatusTypeDef HAL_WWDG_Refresh(WWDG_HandleTypeDef *hwwdg);
该函数主要用于重置T[5:0]的值,根据第四小节中配置的参数,该值必须在计数到达t( WWDG) 之前refresh。重置方法就是调用该函数。
5.3 中断函数: HAL_WWDG_IRQHandler
函数原型:
void HAL_WWDG_IRQHandler(WWDG_HandleTypeDef *hwwdg)
该函数主要用于清除中断标志位
5.4 中断回调函数:HAL_WWDG_EarlyWakeupCallback
函数原型:
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg);
当Wakeup中断发生后,该函数被HAL_WWDG_IRQHandler函数调用。