STM32F103 窗口看门狗

STM32F103C8T6 使用 HAL 库配置窗口看门狗(WWDG)

1. 硬件设计

1.1 相关硬件

  1. STM32F103C8T6 最小系统开发板
  2. STLink-V2 下载器
  3. 供电电源(USB 供电或外部 3.3V/5V)

1.2 WWDG 硬件原理

  1. STM32F103C8T6 内部集成窗口看门狗(WWDG),用于防止系统运行异常。
  2. WWDG 使用 APB1 时钟(典型值 36MHz)进行分频计数。
  3. 需要在特定时间窗口内刷新,否则会触发复位。
  4. 主要参数:
    • 预分频器:控制计数速度。
    • 计数器值:倒计时到 0 触发复位。
    • 窗口值:限制喂狗的时间范围。

2. 窗口看门狗原理

2.1 WWDG 结构

  1. 计数器:范围 0x40-0x7F,每次喂狗只能在窗口范围内进行。
  2. 预分频器:分频比影响计数器的递减速度。
  3. 复位机制:计数器降到 0x3F 时触发复位。
  4. 喂狗时机:必须在窗口值内更新计数器,否则系统复位。

2.2 WWDG 超时时间计算

超时时间计算公式如下:

Timeout = ((Counter - 0x40) * (Prescaler / Fwwdg))

例如,Fwwdg = 36MHz / 4096,预分频设为 8,窗口值设为 0x50,初始计数器设为 0x7F:

Timeout = ((0x7F - 0x40) * (8 / (36MHz / 4096)))

3. 软件设计

3.1 配置 WWDG 步骤

  1. 初始化 WWDG 结构体。
  2. 设置预分频器、窗口值、初始计数器值。
  3. 启动 WWDG。
  4. 在窗口范围内定期喂狗。

3.2 示例代码

#include "stm32f1xx_hal.h"

WWDG_HandleTypeDef hwwdg;

void SystemClock_Config(void);
void Error_Handler(void);

int main(void)
{
    HAL_Init();
    SystemClock_Config();

    // 配置 WWDG,预分频为 8,窗口值 0x50,初始计数器值 0x7F
    hwwdg.Instance = WWDG;
    hwwdg.Init.Prescaler = WWDG_PRESCALER_8;
    hwwdg.Init.Window = 0x50;
    hwwdg.Init.Counter = 0x7F;
    hwwdg.Init.EWIMode = WWDG_EWI_DISABLE;
    if (HAL_WWDG_Init(&hwwdg) != HAL_OK)
    {
        Error_Handler();
    }

    while (1)
    {
        HAL_Delay(20); // 适当延时,确保在窗口范围内喂狗
        HAL_WWDG_Refresh(&hwwdg);
    }
}

void SystemClock_Config(void)
{
    // 省略系统时钟配置代码
}

void Error_Handler(void)
{
    while (1);
}

4. 详细操作步骤

4.1 创建 STM32CubeMX 工程

  1. 打开 STM32CubeMX,选择 STM32F103C8T6 芯片。
  2. 在“Configuration”选项中,启用 WWDG。
  3. 设置预分频器、窗口值、计数器值。
  4. 生成代码,并使用 Keil 或 STM32CubeIDE 打开。

4.2 编译并下载程序

stlink

  1. 连接 STLink-V2 到开发板。
  2. 使用 STM32CubeIDE 或 Keil 进行编译。
  3. 通过 STLink-V2 烧录程序。

4.3 运行与调试

  1. 上电运行代码。
  2. 观察系统是否定期喂狗,防止复位。
  3. 若在 HAL_Delay(20); 处修改时间超过窗口值,系统会自动复位。

5. 总结

本文介绍了 STM32F103C8T6 窗口看门狗(WWDG)的原理、配置方法以及示例代码。通过配置 WWDG,可以有效防止系统卡死,提高系统的稳定性和可靠性。

posted @ 2025-02-07 16:27  jeikerxiao  阅读(420)  评论(0)    收藏  举报