STM32H7独立看门狗 (IWDG)的应用方法介绍

本文详细阐述了STM32H7系统中的独立看门狗(IWDG)工作原理、功能、寄存器配置,以及如何通过STM32Cube进行配置和使用库函数,如HAL_IWDG_Init和HAL_IWDG_Refresh。
摘要由CSDN通过智能技术生成

目录

概述

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将复位

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值