当前位置: 首页 > news >正文

MCU开发学习记录16* - 看门狗学习与实践(HAL库) - IWDG与WWDG -STM32CubeMX

名词解释:

IWDG:Independent watchdog
WWDG:Window watchdog
LSE:
Low-Speed External Clock

统一文章结构(数字后加*):

        第一部分: 阐述外设工作原理;第二部分:芯片参考手册对应外设的学习;第三部分:使用STM32CubeMX进行外设初始化;第四部分:添加应用代码;第五部分:附上本篇文章的工程代码的下载地址。

        本文将介绍IWDG、WWDG的相关概念以及STM32CubeMX生成IWDG、WWDG的配置函数,实现用IWDG、WWDG的监控程序。
        两者之间的主要区别是独立看门狗,可以在超时发生之前的任何时候重置,但是窗口看门狗只能在特定时间窗口中重置。

下面是引用野火手册的内容(IWDG WWDG 区别 ):
        RLR 是重装载寄存器,用来设置独立看门狗的计数器的值。TR 是窗口看门狗的计数器的值,由用户独立设置,WR 是窗口看门狗的上窗口值,由用户独立设置。

一、什么是IWDG?

1.1 IWDG 简介

1.1.1 IWDG介绍

        IWDG 是嵌入式系统中用于 ​检测和恢复程序异常运行​ 的硬件模块,核心功能是防止系统因意外干扰或软件错误导致“死机”。注意开启IWDG后,只有复位才能关闭。

1. IWDG的全称:
        Independent watchdog - 独立看门狗

2. IWDG的本质:
        能产生系统复位信号的计数器。

3. IWDG的特性:
        · 递减的计数器
        · 时钟由独立的RC振荡器提供(可在待机和停止模式下运行)
        · 看门狗被激活后,当递减计数器计数到0x000时产生复位

4. 喂狗:
        在计数器计数到0之前,重装载计数器的值,防止复位。

1.1.2 IWDG作用

        独立看门狗是异常处理的最后手段,不可依赖,应在设计时尽量避免异常的发生!

1. IWDG 主要针对以下两类异常:

        · 外界干扰​:电磁干扰(EMI)、电源波动等外部因素导致 CPU 程序跑飞(如跳转到错误地址或卡死在循环中)。

        · 系统自身异常​:硬件故障(如时钟失效)或软件缺陷(如堆栈溢出、死锁)导致程序无法正常执行。

2. IWDG 核心作用:

        · 程序跑飞检测​:IWDG 通过 ​定时计数器​ 机制工作,若主程序未按时“喂狗”(重置计数器),则判定系统异常,触发复位。

        · 自动恢复系统​:超时未喂狗时,IWDG 强制硬件复位 CPU,使系统从初始状态重新运行,避免永久性死机。

3. IWDG 应用场景:

        · 高稳定性需求​:工业控制、医疗设备、汽车电子等对系统可靠性要求高的领域。

        · 时间精度要求低​:IWDG 的时钟通常由独立低速 RC 振荡器(如 32kHz)提供,复位时间误差较大,适合对时序不敏感的场景。

1.2 IWDG 硬件介绍

1.2.1 IWDG功能框图

1. 独立看门狗时钟

        独立看门狗的时钟由独立的 RC 振荡器 LSI 提供,即使主时钟发生故障它仍然有效。

2. 计数器时钟 :

        递减计数器的时钟由 LSI 经过一个 8 位的预分频器得到,我们可以操作预分频器寄存器 IWDG_PR 来设置分频因子,分频因子可以是:[4,8,16,32,64,128,256,256],计数器时钟CK_CNT= 40/ 4*2^PRV,一个计数器时钟计数器就减一。

3. 状态寄存器:

        状态寄存器 SR 只有位 0PVU 和位 1:RVU 有效,这两位只能由硬件操作,软件操作不了。
        RVU(看门狗计数器重载值更新(Watchdog counter reload value update)):看门狗计数器重装载值更新,硬件置 1 表示重装载值的更新正在进行中,更新完毕之后由硬件清 0。
        PVU(看门狗预分频器值更新
(Watchdog prescaler value update)):看门狗预分频值更新,硬件置’1’指示预分频值的更新正在进行中,当更新完成后,由硬件清 0。所以只有当 RVU/PVU 等于 0 的时候才可以更新重装载寄存器/预分频寄存器。

4. 重装载寄存器:

        重装载寄存器是一个 12 位的寄存器,里面装着要刷新到计数器的值,这个值的大小决定着独立看门狗的溢出时间。超时时间 Tout = (4*2^prv) / 40 * rlv (s) prv 是预分频器寄存器的值,rlv 是重装载寄存器的值。

5. 计数器:

        独立看门狗的计数器是一个 12 位的递减计数器,最大值为 0XFFF,当计数器减到 0 时,会产生一个复位信号:IWDG_RESET,让程序重新启动运行,如果在计数器减到 0 之前刷新了计数器的值的话,就不会产生复位信号,重新刷新计数器值的这个动作我们俗称喂狗。

6. 键寄存器 (IWDG_KR)

1.2.2 IWDG 寄存器配置流程

1. 通过在键寄存器 (IWDG_KR) 中写入 0xCCCC 来使能 IWDG。
2. 通过在键寄存器 (IWDG_KR) 中写入 0x5555 来使能寄存器访问。
3. 通过将预分频器寄存器 (IWDG_PR) 编程为 0~7 中的数值来配置预分频器。
4. 对重载寄存器 (IWDG_RLR) 进行写操作。
5. 等待寄存器更新 (IWDG_SR = 0x0000 0000)。
6. 刷新计数器值为 IWDG_RLR 的值 (IWDG_KR = 0xAAAA)。

1.2.3 IWDG 溢出时间计算

引用正点原子PPT内容:

1.2.4 IWDG 最短时间/最长时间 超时时间

根据原理图可以得知,MCU的LSE

二、什么是WWDG?

2.1 WWDG 简介

2.1.1 WWDG介绍

        WWDG(窗口看门狗)是嵌入式系统中用于监控程序执行的硬件模块,其核心功能是确保程序在预定的时间窗口内执行特定操作,以防止因软件错误或意外干扰导致的异常运行。

1. WWDG的全称:
        Window watchdog,即窗口看门狗

2. WWDG的本质:
        能产生系统复位信号和提前唤醒中断的计数器

3. WWDG的特性:(具有上下限)
        · 递减的计数器
        · 当递减计数器值从 0x40减到0x3F时复位(即T6位跳变到0)
        · 计数器的值大于W[6:0]值时喂狗会复位
        · 提前唤醒中断 (EWI):当递减计数器等于 0x40 时可产生

4. 喂狗:
       在窗口期内重装载计数器的值,防止复位

2.1.2 WWDG作用

        用于监测单片机程序运行时效是否精准,主要检测软件异常。

        需要精准检测程序运行时间的场合。

2.1.3 WWDG工作原理

来源于正点原子PPT:W[6:0] - 0x40

2.2 WWDG 硬件介绍

2.2.1 WWDG时钟源

2.2.2 WWDG硬件框图

1. 窗口看门狗时钟
        
窗口看门狗时钟来自 PCLK1,PCLK1 最大是 42M,由 RCC 时钟控制器开启。

2. 计数器时钟
        
计数器时钟由 CK 计时器时钟经过预分频器分频得到,分频系数由配置寄存器 CFR 的位8:7 WDGTB[1:0] 配置,可以是 [0,1,2,3],其中 CK 计时器时钟 =PCLK1/4096,除以 4096 是手册 规定的,所以计数器的时钟 CNT_CK=PCLK1/4096/(2^WDGTB)。
        这就可以算出计数器减一个数的时间 T= 1/CNT_CK = Tpclk1 * 4096 * (2^WDGTB)。

3. 计数器
        
7 WDGA:WWDG激活位 (Activation bit) - 0:禁止看门狗;1:使能看门狗
        窗口看门狗(WWDG)通过一个7位递减计数器(T[6:0])来监控程序的运行状态,其计数值范围为0X40到0X7F(即64到127)。其工作流程如下:
        · 计数器从127的值递减到64是程序的正常运行窗口,需在此期间“喂狗”以重置计数器。
        · 如果计数器递减到0X40,可以通过启用提前唤醒中断(EWI置1)触发“死前中断”,让程序执行紧急任务。
        · 若未“喂狗”且计数器进一步递减到0X3F,则触发系统复位,强制恢复正常运行。

4. 窗口值
        
7位递减计数器的控制寄存器CR的T[6:0]中实现监控,并在程序异常时触发复位或中断。
        · 计数器范围:从最大值0X7F(127)递减到0X40(64)。
        · 窗口范围W[6:0]  - 0X40之间 进行喂狗
        · 复位触发:当计数器递减到0X3F(63)时,触发系统复位。
        · 监控目的:确保程序在规定时间窗口内完成“喂狗”操作(即重置计数器)。

2.2.3 WWDG 配置流程

1. WWDG工作参数初始化:HAL_WWDG_Init ()
2. WWDG Msp初始化:HAL_WWDG_MspInit ()        配置NVIC、CLOCK等
3. 设置优先级,使能中断:HAL_NVIC_SetPriority()、 HAL_NVIC_EnableIRQ()
4. 编写中断服务函数:WWDG_IRQHandler() →HAL_WWDG_IRQHandler
5. 重定义提前唤醒回调函数:HAL_WWDG_EarIyWakeupCallback ()
6. 在窗口期内喂狗:HAL_WWDG_Refresh ()

2.2.4 WWDG 溢出时间计算

引用正点原子PPT内容:

2.2.5 WWDG 最短时间/最长时间 超时时间

三、基于HAL库配置 I/W WDG

3.1 基于HAL库配置 IWDG

3.1.1 STM32CubeMX配置IWDG(下图设置喂狗时间为2s左右)

3.1.2 IWDG使用

3.2 基于HAL库配置 WWDG

3.2.1 STM32CubeMX配置WWDG

超时时间:

      T = (4096 * 2^WWDG_SCKPSC(2) * (T[5:0](95-64)+1)) / F_WWDG(42M)
           = 12.4ms

3.2.2 WWDG使用

3.3 补充

3.3.1 IWDG获取当前状态值

IWDG 的计数器值无法直接通过寄存器读取(硬件设计限制)。

野火例程给出检查RCC_CSR 的 IWDGRSTF位 查看复位是否由独立看门狗引起。

/* 检查是否为独立看门狗复位 */
if (__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST) != RESET) {/* 独立看门狗复位 *//* 亮红灯 */LED_RED;/* 清除标志 */__HAL_RCC_CLEAR_RESET_FLAGS();/* 如果一直不喂狗,会一直复位,加上前面的延时,会看到红灯闪烁在 1s 时间内喂狗的话,则会持续亮绿灯 */
} else {/* 不是独立看门狗复位 (可能为上电复位或者手动按键复位之类的) *//* 亮蓝灯 */LED_BLUE;
}

3.3.2 WWDG获取当前状态值

1. 获取 WWDG 计数器当前值

uint8_t Get_WWDG_Counter(void) {return (WWDG->CR & 0x7F);  // 返回当前计数器值(范围 0x40~0x7F)
}

2. 获取 WWDG 窗口值

uint8_t Get_WWDG_WindowValue(void) {return (WWDG->CFR & 0x7F);  // 返回窗口值(范围 0x40~0x7F)
}

四、本文的工程文件下载链接

工程Github下载链接:https://github.com/chipdynkid/MCU-DL-STM32
(国内)工程Gitcode下载链接https://gitcode.com/chipdynkid/MCU-DL-STM32

http://www.xdnf.cn/news/489331.html

相关文章:

  • java加强 -IO流
  • 基于React的高德地图api教程005:圆形标记的绘制、删除、修改
  • 【AI学习】AI大模型技术发展研究月报的生成提示词
  • 【Linux】序列化与反序列化、会话与进程组、守护进程
  • 投影仪基础知识及选购方向小记③
  • 曝光融合(Exposure Fusion)
  • 【大模型系列篇】驱动编码助手Cursor与Windsurf工作的隐藏算法解读
  • 小结:jvm 类加载过程
  • 车道线检测----Lane-ATT
  • Linux自有服务
  • LLM学习笔记(四)信息论
  • 公路水运安全员B证主要考核内容有哪些
  • 中级统计师-统计学基础知识-第一章
  • C++ lambda表达式
  • 构建稳定的金字塔模式生态:从自然法则到系统工程
  • LVGL常见面试题
  • 腾讯云MCP数据智能处理:简化数据探索与分析的全流程指南
  • S32DS中定义的全局变量对应的路径查看${ProjDirPath}
  • ConcurrentSkipListMap的深入学习
  • 中国 MRO 的市场概况及发展趋势
  • LlamaIndex 第九篇 Indexing索引
  • C# RSA加密
  • No module named‘serial‘解决办法
  • 计算机视觉----感兴趣区域(ROI)、非极大值抑制
  • 日语简单记录
  • 物联网设备远程管理:基于代理IP的安全固件更新通道方案
  • 共有四个站进行码分多址CDMA通信。四个站的码片序列为......
  • 地磁传感器RM3100简单介绍
  • Socket echo server
  • APIfox参数化配置