STM32定时器知识——看门狗详解
目录
- 引言
- STM32看门狗概述
- 看门狗的工作原理
- 看门狗的主要组成
- 4.1 独立看门狗(IWDG)
- 4.2 窗口看门狗(WWDG)
- 看门狗的主要参数
- 看门狗的配置步骤
- 6.1 配置独立看门狗(IWDG)
- 6.2 配置窗口看门狗(WWDG)
- 看门狗的数学公式解析
- 7.1 IWDG超时时间计算
- 7.2 WWDG窗口期计算
- 看门狗的应用实例
- 8.1 配置独立看门狗实现系统复位
- 8.2 配置窗口看门狗实现任务监控
- 代码示例及简要解读
- 9.1 独立看门狗(IWDG)配置代码
- 9.2 窗口看门狗(WWDG)配置代码
- 结语
引言
在嵌入式系统中,系统的稳定性和可靠性至关重要。看门狗(Watchdog)是一种硬件或软件机制,用于检测系统是否出现异常(如死循环、挂起等),并在检测到异常时采取复位等措施,确保系统能够恢复正常运行。STM32系列微控制器提供了两种主要的看门狗:独立看门狗(IWDG)和窗口看门狗(WWDG)。本文将详细介绍STM32看门狗的工作原理、配置方法、数学计算及实际应用。
STM32看门狗概述
STM32微控制器集成了独立看门狗(IWDG)和窗口看门狗(WWDG)两种看门狗。独立看门狗由独立的低速时钟驱动,不依赖于主系统时钟,具有更高的可靠性。窗口看门狗则允许在特定时间窗口内喂狗(刷新),以防止看门狗被意外喂狗。
看门狗的工作原理
看门狗的核心思想是通过定期喂狗(刷新看门狗计数器),防止看门狗计数器溢出。如果系统在预定时间内未能喂狗,看门狗计数器将溢出,触发系统复位。窗口看门狗在此基础上增加了时间窗口的概念,要求喂狗操作在特定的时间范围内完成,进一步提高系统的安全性。
看门狗的主要组成
4.1 独立看门狗(IWDG)
独立看门狗(IWDG)由一个独立的低速时钟(LSI,低速内部时钟)驱动,不依赖于主系统时钟。IWDG具有独立的寄存器和控制机制,能够在主系统时钟异常时仍然有效。
4.2 窗口看门狗(WWDG)
窗口看门狗(WWDG)使用主系统时钟(通常是APB时钟)作为时钟源。WWDG要求喂狗操作在一个预定的时间窗口内完成,既不能太早也不能太晚,以确保系统的正常运行。
看门狗的主要参数
5.1 时钟源
- IWDG:由低速内部时钟(LSI)提供,通常为32 kHz。
- WWDG:由主系统时钟(APB1或APB2)提供,频率较高,取决于系统配置。
5.2 预分频器
预分频器用于降低时钟频率,以延长看门狗的超时时间。预分频器的值决定了看门狗计数器的实际计数频率。
5.3 重载值
重载值(Reload Value)决定了看门狗计数器从最大值开始倒计时的周期。当计数器达到0时,触发复位。
看门狗的配置步骤
6.1 配置独立看门狗(IWDG)
- 启用IWDG时钟:确保IWDG时钟源开启。
- 设置预分频器:根据所需的超时时间,设置IWDG的预分频器。
- 设置重载值:根据超时时间和预分频器,设置重载值。
- 启动IWDG:使能IWDG,使其开始计数。
6.2 配置窗口看门狗(WWDG)
- 启用WWDG时钟:确保WWDG时钟源开启。
- 设置预分频器:根据所需的窗口期,设置WWDG的预分频器。
- 设置窗口值:定义喂狗操作的时间窗口。
- 设置重载值:定义看门狗的超时时间。
- 启动WWDG:使能WWDG,使其开始计数。
看门狗的数学公式解析
7.1 IWDG超时时间计算
IWDG的超时时间( T I W D G T_{IWDG} TIWDG)由低速内部时钟(LSI)、预分频器( P r e s c a l e r Prescaler Prescaler)和重载值( R e l o a d Reload Reload)决定。
T I W D G = P r e s c a l e r × ( R e l o a d + 1 ) f L S I T_{IWDG} = \frac{Prescaler \times (Reload + 1)}{f_{LSI}} TIWDG=fLSIPrescaler×(Reload+1)
其中, f L S I f_{LSI} fLSI 通常为32 kHz。
7.2 WWDG窗口期计算
WWDG的窗口期( T W W D G _ w i n d o w T_{WWDG\_window} TWWDG_window)和超时时间( T W W D G _ t i m e o u t T_{WWDG\_timeout} TWWDG_timeout)由主时钟、预分频器和窗口值、重载值决定。
T W W D G _ w i n d o w = P r e s c a l e r × ( W i n d o w + 1 ) f W W D G T_{WWDG\_window} = \frac{Prescaler \times (Window + 1)}{f_{WWDG}} TWWDG_window=fWWDGPrescaler×(Window+1)
T W W D G _ t i m e o u t = P r e s c a l e r × ( R e l o a d + 1 ) f W W D G T_{WWDG\_timeout} = \frac{Prescaler \times (Reload + 1)}{f_{WWDG}} TWWDG_timeout=fWWDGPrescaler×(Reload+1)
7.3 预分频器值计算
根据所需的超时时间和重载值,预分频器的值可以通过以下公式计算:
KaTeX parse error: Extra } at position 47: …\times f_{LSI}}}̲{Reload + 1}
看门狗的应用实例
8.1 配置独立看门狗实现系统复位
通过配置IWDG,使系统在发生异常时能够自动复位,确保系统的稳定运行。
8.2 配置窗口看门狗实现任务监控
通过配置WWDG,监控系统任务的执行情况,防止任务进入死循环或挂起状态。
看门狗的数学公式解析
7.1 IWDG超时时间计算
假设系统使用的低速内部时钟(LSI)频率为32 kHz,预分频器(Prescaler)设置为256,重载值(Reload)设置为31249。
T I W D G = 256 × ( 31249 + 1 ) 32000 = 256 × 31250 32000 = 8000000 32000 = 250 秒 T_{IWDG} = \frac{256 \times (31249 + 1)}{32000} = \frac{256 \times 31250}{32000} = \frac{8000000}{32000} = 250 \text{秒} TIWDG=32000256×(31249+1)=32000256×31250=320008000000=250秒
7.2 WWDG窗口期计算
假设主时钟(WWDG时钟)为84 MHz,预分频器设置为8,窗口值设置为80,重载值设置为127。
T W W D G _ w i n d o w = 8 × ( 80 + 1 ) 84000000 = 8 × 81 84000000 = 648 84000000 ≈ 7.714 × 1 0 − 6 秒 T_{WWDG\_window} = \frac{8 \times (80 + 1)}{84000000} = \frac{8 \times 81}{84000000} = \frac{648}{84000000} \approx 7.714 \times 10^{-6} \text{秒} TWWDG_window=840000008×(80+1)=840000008×81=84000000648≈7.714×10−6秒
T W W D G _ t i m e o u t = 8 × ( 127 + 1 ) 84000000 = 8 × 128 84000000 = 1024 84000000 ≈ 1.219 × 1 0 − 5 秒 T_{WWDG\_timeout} = \frac{8 \times (127 + 1)}{84000000} = \frac{8 \times 128}{84000000} = \frac{1024}{84000000} \approx 1.219 \times 10^{-5} \text{秒} TWWDG_timeout=840000008×(127+1)=840000008×128=840000001024≈1.219×10−5秒
7.3 预分频器值计算
若需实现超时时间为1秒,重载值设置为31249,LSI频率为32 kHz。
P r e s c a l e r = 1 × 32000 31249 + 1 = 32000 31250 ≈ 1.024 Prescaler = \frac{1 \times 32000}{31249 + 1} = \frac{32000}{31250} \approx 1.024 Prescaler=31249+11×32000=3125032000≈1.024
由于预分频器只能设置为特定值(如4、8、16、32、64、128、256),选择最接近的值为256。
看门狗的应用实例
8.1 配置独立看门狗实现系统复位
通过配置IWDG,使系统在1秒内未喂狗,则触发系统复位。
8.2 配置窗口看门狗实现任务监控
通过配置WWDG,要求系统在特定时间窗口内喂狗,否则触发复位,以监控任务的执行状态。
代码示例及简要解读
9.1 独立看门狗(IWDG)配置代码
以下示例代码展示了如何配置STM32的独立看门狗(IWDG),实现每250秒触发一次复位。
#include "stm32f4xx.h"
void IWDG_Config(void);
void LED_Config(void);
int main(void)
{
LED_Config();
IWDG_Config();
while(1)
{
// 喂狗操作,防止IWDG超时
IWDG->KR = 0xAAAA;
// 执行其他任务
for(int i = 0; i < 1000000; i++); // 延时
// 切换LED状态
GPIOA->ODR ^= GPIO_ODR_OD5;
}
}
void IWDG_Config(void)
{
// IWDG是独立的,不需要使能APB时钟
// 使能访问IWDG寄存器
IWDG->KR = 0x5555;
// 设置预分频器,Prescaler = 256
IWDG->PR = 0x04;
// 设置重载值,Reload = 31249
IWDG->RLR = 31249;
// 启动IWDG
IWDG->KR = 0xCCCC;
}
void LED_Config(void)
{
// 启用GPIOA时钟
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
// 配置PA5为输出模式
GPIOA->MODER &= ~(3 << (5 * 2));
GPIOA->MODER |= (1 << (5 * 2));
// 初始关闭LED
GPIOA->ODR &= ~GPIO_ODR_OD5;
}
简要解读:
- LED_Config 函数配置GPIOA的PA5引脚为输出模式,用于连接LED。
- IWDG_Config 函数配置IWDG的预分频器和重载值,实现250秒的超时时间,并启动IWDG。
- main 函数中,通过不断喂狗操作(IWDG->KR = 0xAAAA)防止IWDG超时,同时通过延时和切换LED状态展示系统运行状态。
9.2 窗口看门狗(WWDG)配置代码
以下示例代码展示了如何配置STM32的窗口看门狗(WWDG),实现每100毫秒触发一次复位。
#include "stm32f4xx.h"
void WWDG_Config(void);
void LED_Config(void);
int main(void)
{
LED_Config();
WWDG_Config();
while(1)
{
// 喂狗操作,必须在窗口期内完成
WWDG->CR |= WWDG_CR_WDGA;
// 执行其他任务
for(int i = 0; i < 500000; i++); // 延时
// 切换LED状态
GPIOA->ODR ^= GPIO_ODR_OD5;
}
}
void WWDG_Config(void)
{
// 使能WWDG时钟,通常不需要单独使能
// 设置预分频器,Prescaler = 8
WWDG->CFR &= ~WWDG_CFR_WDGTB;
WWDG->CFR |= WWDG_CFR_WDGTB_0; // Prescaler = 8
// 设置窗口值,Window = 80
WWDG->CFR &= ~WWDG_CFR_W;
WWDG->CFR |= (80 << 0);
// 设置重载值,Reload = 127
WWDG->CR &= ~WWDG_CR_T;
WWDG->CR |= (127 << 0);
// 启动WWDG,WDGA = 1
WWDG->CR |= WWDG_CR_WDGA;
}
void LED_Config(void)
{
// 启用GPIOA时钟
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
// 配置PA5为输出模式
GPIOA->MODER &= ~(3 << (5 * 2));
GPIOA->MODER |= (1 << (5 * 2));
// 初始关闭LED
GPIOA->ODR &= ~GPIO_ODR_OD5;
}
简要解读:
- LED_Config 函数配置GPIOA的PA5引脚为输出模式,用于连接LED。
- WWDG_Config 函数配置WWDG的预分频器、窗口值和重载值,实现100毫秒的超时时间,并启动WWDG。
- main 函数中,通过不断喂狗操作(WWDG->CR |= WWDG_CR_WDGA)必须在窗口期内完成,防止WWDG超时,同时通过延时和切换LED状态展示系统运行状态。
结语
看门狗作为系统稳定性和可靠性的保障机制,在嵌入式系统设计中扮演着至关重要的角色。掌握看门狗的使用方法,能够有效提升系统的鲁棒性和安全性。
标签:分频器,IWDG,void,看门狗,STM32,定时器,WWDG,时钟 From: https://blog.csdn.net/qq_44648285/article/details/143926193