目录
概述
1 认识独立看门狗 (IWDG)
1.1 定义独立看门狗 (IWDG)
1.2 IWDG 主要特性
2 IWDG 功能说明
2.1 IWDG 框图
2.2 IWDG 内部信号
2.3 窗口选项
2.3.1 Enable WIN IWDG
2.3.2 Disable WIN IWDG
2.4 硬件看门狗
2.5 低功耗冻结
2.6 停止和待机模式下的行为
2.7 寄存器访问保护
2.8 调试模式
3 IWDG 寄存器
3.1 键寄存器 (IWDG_KR)
3.2 预分频器寄存器 (IWDG_PR)
3.3 重载寄存器 (IWDG_RLR)
3.4 状态寄存器 (IWDG_SR)
3.5 窗口寄存器 (IWDG_WINR)
4 STM32Cube配置IWDG
4.1 配置IWDG
4.2 理解配置参数
5 IWDG库函数
5.1 初始化函数: HAL_IWDG_Init
5.2 重载计数: HAL_IWDG_Refresh
概述
本文详细介绍了STM32H7系统独立看门狗 (IWDG)的相关知识,包括IWDG的实现原理,其在STM32系统中时钟的关系,寄存器的内容和配置方法等。还使用STM32Cube配置一个简单的Demo来做验证。
1 认识独立看门狗 (IWDG)
1.1 定义独立看门狗 (IWDG)
此器件具有一个嵌入式看门狗外设,具有安全性高、定时准确及使用灵活的优点。此独立看门狗外设可检测并解决由软件错误导致的故障,并在计数器达到给定的超时值时触发系统复位。
独立看门狗 (IWDG) 由其专用低速时钟 (LSI) 驱动,因此即便在主时钟发生故障时仍然保持工作状态。
IWDG 最适合应用于需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时间精度要求较低的应用。
1.2 IWDG 主要特性
1)自由运行递减计数器
2)时钟由独立 RC 振荡器提供(可在待机和停止模式下运行)
3)复位条件
- 当递减计数器值小于 0x000 时复位(如果看门狗已激活)
- 在窗口之外重载递减计数器时复位(如果看门狗已激活)
2 IWDG 功能说明
2.1 IWDG 框图
1) 通过向键寄存器 (IWDG_KR) 中写入值 0x0000 CCCC 来启动独立看门狗时
2) 计数器开始从复位值 0xFFF 递减计数。当计数器计数到终值 (0x000) 时会产生一个复位信号 (IWDG 复位)。
3)任何时候将键值 0x0000 AAAA 写到键寄存器 (IWDG_KR) 中, IWDG_RLR 的值就会被重载到计数器,从而避免产生看门狗复位。
2.2 IWDG 内部信号
2.3 窗口选项
1)通过在窗口寄存器 (IWDG_WINR) 中设置合适的窗口, IWDG 也可以用作窗口看门狗。
2)当计数器值大于窗口寄存器 (IWDG_WINR) 中存储的值时,如果执行重载操作,则会产生复位。
3)窗口寄存器 (IWDG_WINR) 的默认值为 0x0000 0FFF,因此,如果不更新此默认值,将禁止窗口选项。
4)窗口值一经更改,便执行重载操作,以便将递减计数器复位为重载寄存器 (IWDG_RLR)值,并方便计算周期数以生成下一次重载。
2.3.1 Enable WIN IWDG
使能窗口选项时配置 IWDG方法:
1. 通过在键寄存器 (IWDG_KR) 中写入 0x0000 CCCC 来使能 IWDG。
2. 通过在键寄存器 (IWDG_KR) 中写入 0x0000 5555 来使能寄存器访问。
3. 通过将预分频器寄存器 (IWDG_PR) 编程为 0~7 中的数值来配置 IWDG 预分频器。
4. 对重载寄存器 (IWDG_RLR) 进行写操作。
5. 等待寄存器更新 (IWDG_SR = 0x0000 0000)。
6. 对窗口寄存器 (IWDG_WINR) 进行写操作。这会自动刷新重载寄存器 (IWDG_RLR) 中的
计数器值。
2.3.2 Disable WIN IWDG
不使用窗口选项时,可按以下步骤配置 IWDG:
1. 通过在键寄存器 (IWDG_KR) 中写入 0x0000 CCCC 来使能 IWDG。
2. 通过在键寄存器 (IWDG_KR) 中写入 0x0000 5555 来使能寄存器访问。
3. 通过将预分频器寄存器 (IWDG_PR) 编程为 0~7 中的数值来配置预分频器。
4. 对重载寄存器 (IWDG_RLR) 进行写操作。
5. 等待寄存器更新 (IWDG_SR = 0x0000 0000)。
6. 刷新计数器值为 IWDG_RLR 的值 (IWDG_KR = 0x0000 AAAA)。
2.4 硬件看门狗
1)如果通过器件选项位使能“硬件看门狗”功能,上电时将自动使能看门狗;
2)如果在计数器计数结束前,若软件没有向键寄存器 (IWDG_KR) 写入相应的值,或者在窗口内部重载了递减计数器,则系统会产生复位。
2.5 低功耗冻结
根据 IWDG_FZ_STOP 和 IWDG_FZ_STBY 选项配置, IWDG 可分别在停止模式和待机模式期间继续计数或停止计数。如果停止模式或待机模式期间 IWDG 保持运行,它可从此模式唤醒器件。
2.6 停止和待机模式下的行为
一旦运行, IWDG 便无法停止。
2.7 寄存器访问保护
预分频器寄存器 (IWDG_PR)、 重载寄存器 (IWDG_RLR) 和窗口寄存器 (IWDG_WINR) 寄存器具有写访问保护。若要对其进行修改,用户必须首先对键寄存器 (IWDG_KR) 写入代码0x0000 5555。 而写入其他值则会破坏该序列,从而使寄存器访问保护再次生效。这表示重载操作(即写入 0x0000 AAAA)也会启动写保护功能。
状态寄存器指示预分频值、递减计数器重载值或窗口值是否正在被更新。
2.8 调试模式
当微控制器进入调试模式时(内核停止), IWDG 计数器会根据 DBG 模块中DBG_IWDG_STOP 配置位选择继续正常工作或者停止工作。
3 IWDG 寄存器
3.1 键寄存器 (IWDG_KR)
偏移地址: 0x00
复位值: 0x0000 0000(待机模式时复位)
位 31:16 保留,必须保持复位值。
位 15:0 KEY[15:0]: 键值 (Key value)(只能写,读为 0x0000)
1)必须每隔一段时间便通过软件对这些位写入键值 0xAAAA,否则当计数器计数到 0 时,看门狗
会产生复位。
2)写入键值 0x5555 : 可使能对 IWDG_PR、 IWDG_RLR 和 IWDG_WINR 寄存器的访问
3)写入键值 0xCCCC : 可启动看门狗(选中硬件看门狗选项的情况除外)
3.2 预分频器寄存器 (IWDG_PR)
偏移地址: 0x04
复位值: 0x0000 0000
位 31:3 保留,必须保持复位值。
位 2:0 PR[2:0]: 预分频系数 (Prescaler divider)
这些位受写访问保护:寄存器访问保护。通过软件设置这些位来选择计数器时钟的预分频因子。若要更改预分频器的分频系数, 状态寄存器 (IWDG_SR) 的 PVU 位必须为 0。
000: 4 分频
001: 8 分频
010: 16 分频
011: 32 分频
100: 64 分频
101: 128 分频
110: 256 分频
111: 256 分频
注: 读取该寄存器会返回 VDD 电压域的预分频器值。如果正在对该寄存器执行写操作,则读取的值可能不是最新的/有效的。因此,只有在状态寄存器 (IWDG_SR) 中的 PVU 位为 0时,从寄存器读取的值才有效。
3.3 重载寄存器 (IWDG_RLR)
偏移地址: 0x08
复位值: 0x0000 0FFF(待机模式时复位)
位 31:12 保留,必须保持复位值。
位 11:0 RL[11:0]:看门狗计数器重载值 (Watchdog counter reload value)
这些位受写访问保护,请参见寄存器访问保护。
这个值由软件设置,每次对键寄存器 (IWDG_KR)
写入值 0xAAAA 时,这个值就会重装载到看门狗计数器中。之后,看门狗计数器便从该装载的
值开始递减计数。超时周期由该值和时钟预分频器共同决定。有关超时信息,请参见数据手册。
若要更改重载值, 状态寄存器 (IWDG_SR) 中的 RVU 位必须为 0。
注: 读取该寄存器会返回 VDD 电压域的重载值。如果正在对该寄存器执行写操作,则读取的值可能不是最新的/ 有效的。因此,只有在状态寄存器 (IWDG_SR) 中的 RVU 位为 0时,从寄存器读取的值才有效。
3.4 状态寄存器 (IWDG_SR)
偏移地址: 0x0C
复位值: 0x0000 0000(待机模式时不复位)
位 31:3 保留,必须保持复位值。
位 2 WVU: 看门狗计数器窗口值更新 (Watchdog counter window value update)
可通过硬件将该位置 1 以指示窗口值正在更新。当在 VDD 电压域下完成重载值更新操作后(需
要多达 5 个 RC 40 kHz 周期),会通过硬件将该位复位。窗口值只有在 WVU 位为 0 时才可更新。此位只有在通用“窗口” = 1 时才生成
位 1 RVU: 看门狗计数器重载值更新 (Watchdog counter reload value update)
可通过硬件将该位置 1 以指示重载值正在更新。当在 VDD 电压域下完成重载值更新操作后(需
要多达 5 个 RC 40 kHz 周期),会通过硬件将该位复位。重载值只有在 RVU 位为 0 时才可更新。
位 0 PVU: 看门狗预分频器值更新 (Watchdog prescaler value update)
可通过硬件将该位置 1 以指示预分频器值正在更新。当在 VDD 电压域下完成预分频器值更新操作后(需要多达 5 个 RC 40 kHz 周期),会通过硬件将该位复位。预分频器值只有在 PVU 位为 0 时才可更新。
3.5 窗口寄存器 (IWDG_WINR)
偏移地址: 0x10
复位值: 0x0000 0FFF(待机模式时复位)
位 31:12 保留,必须保持复位值。
位 11:0 WIN[11:0]: 看门狗计数器窗口值 (Watchdog counter window value)
这些位受写访问保护,它们包含用于与递减计数器进行比较的窗口值上限。
为防止发生复位,当递减计数器的值低于窗口寄存器值且大于 0x0 时必须重载。若要更改重载值, 状态寄存器 (IWDG_SR) 中的 WVU 位必须为 0。
4 STM32Cube配置IWDG
4.1 配置IWDG
使能IWDG
配置IWDG工作时钟
4.2 理解配置参数
使用STM32Cube配置的参数内容如下:
IWDG使用的系统时钟为 fclk= 32K Hz,分频系数为 prescaler = 4
窗口复位时钟周期为:
Tc = 4/32 000 * 4095 = 511.875 ms
5 IWDG库函数
5.1 初始化函数: HAL_IWDG_Init
函数原型:
HAL_StatusTypeDef HAL_IWDG_Init(IWDG_HandleTypeDef *hiwdg)
使用Demo:
/* IWDG1 init function */
void MX_IWDG1_Init(void)
{/* USER CODE BEGIN IWDG1_Init 0 *//* USER CODE END IWDG1_Init 0 *//* USER CODE BEGIN IWDG1_Init 1 *//* USER CODE END IWDG1_Init 1 */hiwdg1.Instance = IWDG1;hiwdg1.Init.Prescaler = IWDG_PRESCALER_4;hiwdg1.Init.Window = 4095;hiwdg1.Init.Reload = 4095;if (HAL_IWDG_Init(&hiwdg1) != HAL_OK){Error_Handler();}/* USER CODE BEGIN IWDG1_Init 2 *//* USER CODE END IWDG1_Init 2 */}
5.2 重载计数: HAL_IWDG_Refresh
函数原型:
HAL_StatusTypeDef HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg)
在4.2节中,通过使用STM32Cube配置的参数算的,一个最大复位的时间为:511.875 ms,如果该时间到了之后,没有调用 HAL_IWDG_Refresh()函数,此时MCU将复位。