您好,登录后才能下订单哦!
# STM32 看门狗的示例分析
## 1. 看门狗概述
### 1.1 基本概念
看门狗定时器(Watchdog Timer,WDT)是嵌入式系统中的重要安全机制,用于检测和恢复系统异常状态。其核心原理是通过定时计数器的周期性复位来监控系统运行状态。
### 1.2 STM32中的看门狗类型
STM32提供两种看门狗:
- **独立看门狗(IWDG)**:基于独立RC振荡器,主系统故障时仍能工作
- **窗口看门狗(WWDG)**:基于APB1时钟,提供精确的时间窗口控制
## 2. 独立看门狗(IWDG)详解
### 2.1 硬件架构
```c
// 典型IWDG寄存器配置
typedef struct {
__IO uint32_t KR; // 键寄存器
__IO uint32_t PR; // 预分频寄存器
__IO uint32_t RLR; // 重装载寄存器
__IO uint32_t SR; // 状态寄存器
} IWDG_TypeDef;
IWDG->KR = 0x5555; // 解锁PR/RLR寄存器
IWDG->PR = IWDG_PRESCALER_64; // 64分频
IWDG->RLR = 625; // 约1秒超时(LSI=40kHz)
IWDG->KR = 0xAAAA; // 重载计数器
IWDG->KR = 0xCCCC; // 启动看门狗
公式:Tout = (RLR+1) * (2^PR) / LSI_freq
示例配置:
- LSI = 40kHz
- PR = 6 (64分频)
- RLR = 625
计算结果:Tout = 626 * 64 / 40000 ≈ 1秒
特性 | IWDG | WWDG |
---|---|---|
时钟源 | 独立RC振荡器 | APB1时钟 |
复位条件 | 超时未喂狗 | 过早/过晚喂狗 |
中断能力 | 无 | 有 |
典型应用 | 系统级监控 | 关键任务监控 |
// 1. 使能时钟
RCC->APB1ENR |= RCC_APB1ENR_WWDGEN;
// 2. 设置预分频
WWDG->CFR = WWDG_CFR_WDGTB1 | WWDG_CFR_WDGTB0; // 8分频
// 3. 设置窗口值
WWDG->CFR &= ~WWDG_CFR_W;
WWDG->CFR |= 0x7F; // 窗口上限值
// 4. 设置计数器初值
WWDG->CR = WWDG_CR_T | 0x40; // 使能并设置计数值
// 5. 使能中断(可选)
WWDG->CFR |= WWDG_CFR_EWI;
NVIC_EnableIRQ(WWDG_IRQn);
|--------|-------|--------|
| 0x3F | 0x40 | 0x7F |
|--------|-------|--------|
| 复位区 | 允许区 | 复位区 |
IWDG_HandleTypeDef hiwdg;
void MX_IWDG_Init(void)
{
hiwdg.Instance = IWDG;
hiwdg.Init.Prescaler = IWDG_PRESCALER_64;
hiwdg.Init.Reload = 625;
if (HAL_IWDG_Init(&hiwdg) != HAL_OK)
{
Error_Handler();
}
}
void Task_Monitor(void)
{
while(1)
{
HAL_IWDG_Refresh(&hiwdg);
osDelay(500); // 喂狗间隔小于超时时间
}
}
graph TD
A[主任务] -->|每200ms| B[更新心跳标记]
C[监控任务] -->|每1s| D[检查所有任务标记]
D --> E{所有标记更新?}
E -->|是| F[喂狗]
E -->|否| G[系统复位]
策略类型 | 优点 | 缺点 |
---|---|---|
单一任务喂狗 | 实现简单 | 无法检测其他任务挂死 |
多任务联合喂狗 | 全面监控 | 实现复杂度高 |
定时器中断喂狗 | 不依赖任务调度 | 可能掩盖真实问题 |
超时检测:在复位处理函数中添加标志位记录
void Reset_Handler(void)
{
if(RCC->CSR & RCC_CSR_IWDGRSTF)
{
__HAL_RCC_CLEAR_RESET_FLAGS();
save_reset_reason(WDT_RESET);
}
// ...其他代码
}
仿真模式:通过调试器暂停看门狗
DBGMCU->APB1FZ |= DBGMCU_APB1_FZ_DBG_IWDG_STOP;
问题1:系统频繁复位 - 可能原因: - 喂狗间隔大于超时时间 - 看门狗时钟配置错误 - 解决方案:
// 检查时钟源
if(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET)
{
// LSI启动失败处理
}
问题2:窗口看门狗误触发 - 可能原因: - 喂狗时间落在禁止窗口 - 窗口值配置不合理 - 调试建议:
// 添加时间戳记录
uint32_t last_feed = DWT->CYCCNT;
// ...喂狗操作
log_debug("Feed interval: %d", (DWT->CYCCNT - last_feed));
void Enter_Stop_Mode(void)
{
// 暂停看门狗
HAL_IWDG_Init(&hiwdg); // 重新初始化会暂停计数
// 进入STOP模式
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
// 唤醒后恢复看门狗
HAL_IWDG_Refresh(&hiwdg);
}
void LSI_Calibration(void)
{
// 使用LSE作为参考校准LSI
uint32_t lsi_freq = HAL_RCCEx_GetLSIFrequency();
hiwdg.Init.Reload = (1000 * lsi_freq) / (64 * 1000); // 调整为1秒
HAL_IWDG_Init(&hiwdg);
}
对于IEC 61508等安全关键系统: 1. 定期测试看门狗功能 2. 实现看门狗自检机制 3. 记录看门狗复位事件 4. 避免在关键代码段禁用看门狗
STM32的看门狗系统为嵌入式应用提供了可靠的故障恢复机制。合理配置IWDG和WWDG可以构建多层次的系统监控方案。实际应用中需要根据具体需求选择适当的喂狗策略和超时参数,同时注意与低功耗模式的兼容性设计。
注:本文示例基于STM32F4系列,其他系列可能存在寄存器差异。完整示例代码请参考ST官方HAL库示例。 “`
该文档共计约2750字,采用Markdown格式编写,包含: - 10个核心章节 - 6个代码示例片段 - 2个对比表格 - 1个流程图 - 3个计算公式 - 完整的配置步骤说明 - 常见问题解决方案
可根据具体STM32型号调整寄存器名称和时钟参数。建议配合STM32CubeMX生成的代码使用。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。