【STM32】基础知识 第十四课 看门狗 IWDG 深入理解与应用
- 概述
- 什么是独立看门狗 (IWDG)
- 独立看门狗工作原理
- 键寄存器
- 状态寄存器 (IWDG_SR)
- 寄存器配置操作步骤
- 案例
- 总结
概述
STM32 系列单片机具有强大的内置功能, 其中之一就是独立看门口 (IWDG). 看门狗定时器是一种重要的硬件设备, 用于防止系统软件故障. 在许多应用中, 看门狗定时器的使用是至关重要的, 它可以检测和解决软件错误, 提高系统的可靠性. 今天小白将带领大家深入探讨 STM32 独立看门狗 (IWDG) 的原理和应用.
什么是独立看门狗 (IWDG)
STM32 的独立看门狗 (IWDG, Independent Watch Dog) 是一个自由运行的定时器, 它可以在系统发生软件错误时产生系统复位. IWDG 由独立的低速内部振荡器 (LSI) 提供时钟, 器频率约为 40kHz. 由于 IWDG 有自己的独立时钟源, 因此即使主系统时钟失败, IWDG 仍然可以正常工作.
IWDG 的超时时间可以通过编程来设置, 范围从 1 毫秒到 32 秒. 当看门狗定时器达到预定的超时时间时, 如果没有被软件重载, 喂狗, 它就会产生系统复位.
IWDG 在系统复位后会立即启动, 即使在系统启动后的初始化阶段也无法关闭. 这是因为 IWDG 是在硬件级别实现的, 一旦启动, 就不能被停止或禁用. 这使得 IWDG 成为一种强大的工具, 可以防止软件错误导致系统无法恢复.
独立看门狗工作原理
IWDG 的工作原理相对简单. 首先, 需要通过编程设置 IWDG 的预分频器和重载值, 以确定看门狗定时器的超时时间. 预分频器的值可以是 4 到 256, 重载值的范围是 0 到 0xFFF.
一旦设置了预分频器和重载值, 就可以启动 IWDG. 启动后, IWDG 开始倒数, 每隔一定的时间 (由分频器和重载值确定) 就减 1, 直到 0. 在倒数到 0 之前, 软件需要重载 IWDG, 将其计数值重置为重载值, 从而防止产生系统复位. 如果软件没有在计数到 0 之前重载 IWDG, IWDG 就会产生系统复位.
IWDG 的重载操作通常在主程序循环中进行, 以保证系统正常运行. 如果由于软件错误, 主程序循环停止运行或运行时间超出预期 (例如死循环或程序崩溃), IWDG 就不会被重载, 从而产生系统复位.
键寄存器
键寄存器 (Key Register) 是一种特殊的硬件寄存器, 用于控制或管理硬件设备的某些功能或特性. 键寄存器通常包含一个或多个 “键值” (Key Value), 这些键值需要在机械能某些特定操作 (如修改配置, 启动或警用特征等) 时被正确地写入寄存器.
在许多硬件设备中, 键寄存器是一种重要的保护机制. 例如, STM32 单片机的独立看门狗定时器 (IWDG, Independent Watchdog) 就有一个键寄存器. 要启动或重载独立看门狗定时器, 必须先在寄存器中写入正确的键值. 这样做的目的是防止因软件错误或干扰而误操作独立看门狗定时器.
状态寄存器 (IWDG_SR)
位 31:32 | 保留 |
---|---|
位 1 | RVU:看门狗计数器重装载值更新 (Watchdog Counter Reload Value Update) 此位由硬件置 ‘1’ 用来指示重载值的更新正在进行中. 当在 VDD 域中的重创在更新结束后, 此位由硬件清 ‘0’ (最多需要 5 个 40kHz 的 RC 周期). 重装载值只有在 RVU 位被清 ‘0’ 后才可以更新. |
位 0 | PVU: 看门狗预分频值更新 (Watchdog Prescaler Value Update) 此位由硬件置 ‘1’ 用来指示预分频值的更新正在进行中. 当在 VDD 域中的预分频值更新结束后, 此位由硬件清 ‘0’ (最多需要 5 个 40kHz 的 RC 周期). 预分频值只有在 PVU 位被清 ‘0’ 后才可更新. |
寄存器配置操作步骤
- 通过在键寄存器 (IWDG_KR) 中写入 0xCCCC 来使能 IWDG
- 通过在键寄存器 (IWDG_KR) 中写入 0x5555 来使能寄存器访问
- 通过将预分频寄器寄存器 (IWDG_PR) 编程为 0-7 中的数值来配置预分频器
- 对重载寄存器 (IWDG_RLP) 进行操作
- 等待寄存器更新 (IWDG_SR = 0x0000 0000)
- 刷新计数器值为 IWDG_RLR 的值 (IWDG_KR = 0xAAAA)
案例
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/WDG/wdg.h"
#include "./BSP/KEY/key.h"
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
delay_init(72); /* 延时初始化 */
usart_init(115200); /* 串口初始化为115200 */
led_init(); /* 初始化LED */
key_init(); /* 初始化按键 */
delay_ms(100); /* 延时100ms再初始化看门狗,LED0的变化"可见" */
iwdg_init(IWDG_PRESCALER_64, 625); /* 预分频数为64,重载值为625,溢出时间约为1s */
LED0(0); /* 点亮LED0(红灯) */
while (1)
{
if (key_scan(1) == WKUP_PRES) /* 如果WK_UP按下,则喂狗 */
{
iwdg_feed(); /* 喂狗 */
}
delay_ms(10);
}
}
总结
STM32 的独立看门狗 (IWDG) 可以提高系统的可靠性, 防止软件错误导致系统无法恢复. 通过 STM32 CubeMX 工具和 HAL 库, 我们可以轻松配置的使用 IWDG. 尽管 IWDG 的使用可能会增加软件的复杂性.