【STM32CubeMX学习教程】——6.看门狗


一、看门狗概述

看门狗(Watchdog)是嵌入式系统中用于监测系统运行状态的重要机制,其主要作用是在系统出现异常(如程序跑飞、死循环等)时自动复位系统,使系统恢复到正常工作状态。

STM32提供了两种看门狗:
 1.独立看门狗(IWDG, Independent WatchDog)
 2.窗口看门狗(WWDG, Window WatchDog)

二、独立看门狗(IWDG)

1.特点

  • 完全独立于主系统运行,使用独立的RC振荡器(约40kHz)
  • 即使主时钟失效也能工作
  • 计数器为12位递减计数器(0x000-0xFFF)
  • 支持硬件或软件启动
  • 复位前有短暂延时,确保复位信号有效

2.工作原理

IWDG需要定期"喂狗"(重载计数器),如果在计数器减到0之前没有喂狗,系统将产生复位。

3.STM32CubeMX独立看门狗(IWDG)配置

1)新建工程

1.双击打开桌面下载好的STM32CubeMX,点击File–>New Project,或直接点击ACCEE TO MCU SELECTOR

Alt
2.在左边搜索栏里输入使用的芯片型号,右边选中并开始创建

Alt

2)设置RCC时钟源

设置高/低速时钟源都由外部晶振产生。

Alt

3)配置IWDG

Alt
提示:

超时时间 = (RLR+1) × (2^PR) / LSI频率

 假设:LSI=40kHz, PR=4(分频64), RLR=1874
    
    超时时间 = (1874 + 1) × 64 / 40000 
     		 = 1875 × 64 / 40000 
             = 3.0 秒

4)时钟配置

1.时钟源设置
默认时钟源是由内部RC振荡器产生,可通过图中按钮进行修改,外部晶振数值取决于实际电路板上的晶振大小.

Alt
提示:

  • 这里用到的芯片的最大时钟频率是100MHz,有的芯片最大只有72MHz,实际最大频率可通过查看芯片数据手册确定。

2.时钟频率设置

Alt
①PLLM—PLL输入时钟分频系数,根据自己需要的系统时钟频率来进行修改
②PLLN—主PLL倍频系数(自动计算)
③PLLP—主PLL分频系数(自动计算)
④SYSCLK—系统时钟
⑤HCLK—AHB总线时钟,由系统时钟SYSCLK 分频得到,一般不分频,等于系统时钟
⑥APB1/APB2 Prescaler—APB1/APB2总线的预分频系数,可根据需要修改

5)工程管理

1.工程设置
注:工程路径中不能有中文,否则会输出错误。
库文件要提前下载好,具体方法在 “【STM32CubeMX学习教程】——1.软件安装” 这一篇文章中有提到。

Alt

2.代码生成设置

Alt

3.点击右上角按钮生成代码,之后会出现下面的窗口,再点击打开工程即可在用keil查看工程代码。

Alt

4. 代码示例(HAL库)

// 初始化IWDG,超时时间约1s
void MX_IWDG_Init(void)
{
    hiwdg.Instance = IWDG;
    hiwdg.Init.Prescaler = IWDG_PRESCALER_64;  // 分频64
    hiwdg.Init.Reload = 625;                   // 重载值
    HAL_IWDG_Init(&hiwdg);
}

// 喂狗
void IWDG_Feed(void)
{
    HAL_IWDG_Refresh(&hiwdg);
}

三、窗口看门狗(WWDG)

1. 特点

  • 时钟来自APB1总线时钟(PCLK1)
  • 计数器为7位递减计数器(0x7F-0x40)
  • 有"窗口"限制:只能在特定时间范围内喂狗
  • 早期唤醒中断(EWI):在即将复位前产生中断

2.工作原理

WWDG要求在一个"窗口"时间内喂狗:

  • 过早喂狗(计数器值 > 窗口值):产生复位
  • 过晚喂狗(计数器值 < 0x40):产生复位
  • 正确喂狗(计数器值 ≤ 窗口值且 ≥ 0x40):计数器重载

3.STM32CubeMX窗口看门狗(WWDG)配置

1)新建工程

1.双击打开桌面下载好的STM32CubeMX,点击File–>New Project,或直接点击ACCEE TO MCU SELECTOR

Alt
2.在左边搜索栏里输入使用的芯片型号,右边选中并开始创建

Alt

2)设置RCC时钟源

设置高/低速时钟源都由外部晶振产生。

Alt

3)配置WWDG

1.配置参数

Alt
提示:

    假设:PCLK1 = 48MHz
          预分频 = 8(WWDG_PRESCALER_8)
          计数器初始值 = 0x7F(127)
          上窗口值 = 0x70(112)
          下窗口值 = 0x3F(固定值)
          
	计算关键时间点:
	    总超时时间:(0x7F-0x3F)×8/48MHz=10.67μs
	    窗口起始时间:(0x7F-0x70)×8/48MHz=1.5μs
	    有效窗口时间:(0x70-0x3F)×8/48MHz=9.17μs
	    窗口关闭到复位时间:(0x3F-0x3F)×8/48MHz=0μs
	
	时序特性图示:
	    计数器值: 0x7F ──────┬────── 0x70 ──────── 0x3F
                    │          │           │
                    │ 1.5μs    │ 9.17μs    │
                    ▼          ▼           ▼
                    禁止喂狗   允许喂狗     系统复位

2.使能中断

Alt

4)时钟配置

1.时钟源设置
默认时钟源是由内部RC振荡器产生,可通过图中按钮进行修改,外部晶振数值取决于实际电路板上的晶振大小.

Alt
提示:

  • 这里用到的芯片的最大时钟频率是100MHz,有的芯片最大只有72MHz,实际最大频率可通过查看芯片数据手册确定。

2.时钟频率设置

Alt
①PLLM—PLL输入时钟分频系数,根据自己需要的系统时钟频率来进行修改
②PLLN—主PLL倍频系数(自动计算)
③PLLP—主PLL分频系数(自动计算)
④SYSCLK—系统时钟
⑤HCLK—AHB总线时钟,由系统时钟SYSCLK 分频得到,一般不分频,等于系统时钟
⑥APB1/APB2 Prescaler—APB1/APB2总线的预分频系数,可根据需要修改

5)工程管理

1.工程设置
注:工程路径中不能有中文,否则会输出错误。
库文件要提前下载好,具体方法在 “【STM32CubeMX学习教程】——1.软件安装” 这一篇文章中有提到。

Alt

2.代码生成设置

Alt

3.点击右上角按钮生成代码,之后会出现下面的窗口,再点击打开工程即可在用keil查看工程代码。

Alt

4. 代码示例(HAL库)

// 初始化WWDG
void MX_WWDG_Init(void)
{
    hwwdg.Instance = WWDG;
    hwwdg.Init.Prescaler = WWDG_PRESCALER_8;  // 预分频8
    hwwdg.Init.Window = 0x70;                 // 窗口值
    hwwdg.Init.Counter = 0x7F;                // 计数器初始值
    hwwdg.Init.EWIMode = WWDG_EWI_ENABLE;     // 使能EWI中断
    HAL_WWDG_Init(&hwwdg);
}

// 喂狗
void WWDG_Feed(void)
{
    HAL_WWDG_Refresh(&hwwdg);
}

// EWI中断处理
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
{
    // 即将复位前的最后处理机会
}

四、两种看门狗对比

特性IWDGWWDG
时钟源独立RC振荡器(~40kHz)PCLK1
复位条件计数器减到0过早或过晚喂狗
精度较低(受RC振荡器影响)较高(使用系统时钟)
中断有(EWI早期唤醒中断)
配置灵活性简单复杂(需设置窗口)
适用场景对时间要求不高的简单监测需要精确监测的复杂系统

五、使用建议

1.IWDG适用场景:

  • 需要简单可靠的看门狗功能
  • 主时钟可能失效的情况
  • 对时间精度要求不高的应用

2.WWDG适用场景:

  • 需要精确监测代码执行时间
  • 需要在复位前进行一些清理操作(通过EWI中断)
  • 防止代码执行过快或过慢的情况

3.使用注意事项:

  • 喂狗操作应放在主循环的关键路径上
  • 避免在中断中频繁喂狗
  • 对于关键任务,可以在多个位置喂狗
  • 调试时可暂时禁用看门狗

4.调试技巧:

  • 使用调试器暂停时,IWDG会继续运行可能导致意外复位
  • 可以通过DBGMCU寄存器配置调试时冻结看门狗
#include "stm32fxxx_hal.h"  // 根据芯片型号替换 xxx

int main(void) {
    // 调试模式下冻结看门狗
    __HAL_DBGMCU_FREEZE_IWDG();
    __HAL_DBGMCU_FREEZE_WWDG();

    // 其他初始化代码...
    while (1) {
        // 主循环
    }
}

以上就是本章的全部内容,如果对你有帮助,欢迎点赞支持,谢谢!

### STM32L431通过STM32CubeMX配置看门狗的方法 在STM32L431微控制器中,可以通过STM32CubeMX工具轻松完成独立看门狗(IWDG)或窗口看门狗(WWDG)的配置。以下是具体的配置过程以及注意事项。 #### 一、硬件与软件环境准备 - **硬件平台**:STM32L431开发板。 - **软件工具**:STM32CubeMX用于初始化配置,Keil MDK作为编译和调试环境,串口调试助手用于测试通信功能。 --- #### 二、独立看门狗(IWDG)配置流程 ##### 1. 初始化时钟源 独立看门狗依赖内部低速振荡器(LSI)。默认情况下,LSI频率约为32 kHz[^5]。如果需要精确调整时间间隔,可以在此基础上进一步校准。 ##### 2. 设置预分频系数 预分频系数决定了计数器的下降速度。假设目标超时时间为T秒,则计算公式如下: \[ T_{\text{timeout}} = \frac{\text{Prescaler} \times (\text{Reload Value} + 1)}{\text{LSI Frequency}} \] 对于STM32L431,默认LSI为32 kHz。例如,要设置4秒的超时时间,可以选择以下参数组合: - 预分频值设为`32`(即32分频后得到约1 kHz信号)[^2]; - 重载寄存器值设为`3999`(对应倒计数值范围内的最大有效值)。 最终计算结果验证: \[ T_{\text{timeout}} = \frac{(32 \times (3999 + 1))}{32000} = 4 \, \text{s} \][^4] ##### 3. 启动看门狗并生成代码 在STM32CubeMX界面中启用IWDG模块,并按照上述设定填写对应的预分频值和重载值。随后生成初始化代码,在HAL库函数中调用 `HAL_IWDG_Init()` 完成具体初始化操作。 ```c // IWDG初始化结构体定义 IWDG_HandleTypeDef hiwdg; void MX_IWDG_Init(void) { hiwdg.Instance = IWDG; hiwdg.Init.Prescaler = IWDG_PRESCALER_32; // 设定预分频因子为32 hiwdg.Init.Reload = 3999; // 设定重加载值为3999 if (HAL_IWDG_Init(&hiwdg) != HAL_OK) { Error_Handler(); // 错误处理机制 } } ``` ##### 4. 实现定期喂狗逻辑 为了防止因程序卡死而导致设备无法正常运行,需周期性执行刷新命令以避免触发复位动作: ```c #include "stm32l4xx_hal.h" void FeedDog(void) { __HAL_IWDG_RELOAD_COUNTER(); // 刷新看门狗计数器 } int main(void) { /* 初始化外设 */ HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_IWDG_Init(); while (1) { FeedDog(); // 每次循环均重新启动计数器 HAL_Delay(100); // 添加适当延时模拟实际工作负载 } } ``` --- #### 三、窗口看门狗(WWDG)配置说明 相比独立看门狗,窗口看门狗提供了更加严格的监控条件——不仅要求应用程序及时响应中断请求,还限定其必须处于指定的时间范围内才能成功更新状态。这种特性适用于对实时性能有较高需求的应用场景。 同样借助STM32CubeMX图形化界面来简化配置步骤,主要包括以下几个部分: - 确认外部晶振输入频率; - 调整上下限边界阈值; - 编写相应的ISR服务例程捕获可能发生的异常事件。 更多细节可参阅官方文档资料获取深入理解[^3]。 --- #### 四、常见问题排查建议 当遇到预期行为不符的情况时,请逐一核查下列要点: 1. 是否正确启用了LSI时钟资源? 2. 参数设定是否满足设计需求? 3. 主线程是否存在阻塞现象影响到喂狗时机? ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玥山山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值