引言
STM32的看门狗编程主要涉及独立看门狗(IWDG)和窗口看门狗(WWDG)。以下是这两种看门狗的编程方法:
独立看门狗(IWDG)
1. 原理:
- IWDG由内部低速时钟(LSI)驱动,通常在30~60KHz之间,一般按40KHz计算。
- 它是一个12位的递减计数器,从0xFFF开始递减到0x000,若未在计数到0之前“喂狗”(重置计数器),则产生系统复位。
2. 编程步骤:
- 取消寄存器写保护:向IWDG_KR写入0x5555,取消IWDG_PR和IWDG_RLR的写保护。
- 设置预分频器:通过IWDG_PR设置分频系数。
- 设置重装载值:通过IWDG_RLR设置重装载值。
- 启动看门狗:向IWDG_KR写入0xCCCC启动看门狗。
- 喂狗:在计数器达到0之前,向IWDG_KR写入0xAAAA重新加载IWDG_RLR的值到计数器中,避免复位。
3. 代码示例:
#include "stm32f10x.h"
void IWDG_Init(uint8_t prescaler, uint16_t reload) {
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); // 取消写保护
IWDG_SetPrescaler(prescaler); // 设置预分频系数
IWDG_SetReload(reload); // 设置重装载值
IWDG_ReloadCounter(); // 重装载计数器
IWDG_Enable(); // 启用看门狗
}
void IWDG_Feed(void) {
IWDG_ReloadCounter(); // 喂狗操作
}
在主循环中定期调用`IWDG_Feed()`以防止看门狗超时。
窗口看门狗(WWDG)
1. 原理:
- WWDG也是一个递减计数器,但其值必须在上窗口和下窗口之间才可以“喂狗”。
- 下窗口值是固定的0x40,上窗口值可以设置,如果计数器值小于0x40或在上窗口值以上喂狗,都会产生复位。
2. 编程步骤:
- 配置WWDG:设置预分频器、计数器初始值和窗口值。
- 启动WWDG:使能窗口看门狗。
- 喂狗:在计数器值在上窗口值和0x40之间时喂狗。
3. 代码示例:
#include "stm32f10x.h"
void WWDG_Init(uint8_t prescaler, uint8_t counter, uint8_t window) {
WWDG_SetPrescaler(prescaler); // 设置预分频系数
WWDG_SetWindowValue(window); // 设置窗口值
WWDG_Enable(); // 启用窗口看门狗
}
void WWDG_Feed(void) {
WWDG_Refresh(); // 喂狗操作
}
在主循环中,当计数器值在窗口范围内时,定期调用`WWDG_Feed()`以防止看门狗超时。
以上是STM32看门狗的基本编程方法,具体参数设置需要根据实际应用场景和需求进行调整。