首页 > 其他分享 >STM32定时器知识——看门狗详解

STM32定时器知识——看门狗详解

时间:2024-11-21 17:47:54浏览次数:3  
标签:分频器 IWDG void 看门狗 STM32 定时器 WWDG 时钟

STM32定时器知识——看门狗详解

目录

  1. 引言
  2. STM32看门狗概述
  3. 看门狗的工作原理
  4. 看门狗的主要组成
  5. 看门狗的主要参数
  6. 看门狗的配置步骤
  7. 看门狗的数学公式解析
  8. 看门狗的应用实例
  9. 代码示例及简要解读
  10. 结语

引言

在嵌入式系统中,系统的稳定性和可靠性至关重要。看门狗(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)

  1. 启用IWDG时钟:确保IWDG时钟源开启。
  2. 设置预分频器:根据所需的超时时间,设置IWDG的预分频器。
  3. 设置重载值:根据超时时间和预分频器,设置重载值。
  4. 启动IWDG:使能IWDG,使其开始计数。

6.2 配置窗口看门狗(WWDG)

  1. 启用WWDG时钟:确保WWDG时钟源开启。
  2. 设置预分频器:根据所需的窗口期,设置WWDG的预分频器。
  3. 设置窗口值:定义喂狗操作的时间窗口。
  4. 设置重载值:定义看门狗的超时时间。
  5. 启动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​=fLSI​Prescaler×(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​=fWWDG​Prescaler×(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​=fWWDG​Prescaler×(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;
}

简要解读:

  1. LED_Config 函数配置GPIOA的PA5引脚为输出模式,用于连接LED。
  2. IWDG_Config 函数配置IWDG的预分频器和重载值,实现250秒的超时时间,并启动IWDG。
  3. 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;
}

简要解读:

  1. LED_Config 函数配置GPIOA的PA5引脚为输出模式,用于连接LED。
  2. WWDG_Config 函数配置WWDG的预分频器、窗口值和重载值,实现100毫秒的超时时间,并启动WWDG。
  3. main 函数中,通过不断喂狗操作(WWDG->CR |= WWDG_CR_WDGA)必须在窗口期内完成,防止WWDG超时,同时通过延时和切换LED状态展示系统运行状态。

结语

看门狗作为系统稳定性和可靠性的保障机制,在嵌入式系统设计中扮演着至关重要的角色。掌握看门狗的使用方法,能够有效提升系统的鲁棒性和安全性。

标签:分频器,IWDG,void,看门狗,STM32,定时器,WWDG,时钟
From: https://blog.csdn.net/qq_44648285/article/details/143926193

相关文章

  • STM32F103嵌套向量中断控制器
    一、STM32F103中断介绍1.1什么是中断中断:打断CPU执行正常的程序,转而处理紧急程序,然后返回原暂停的程序继续运行;举例:当你正在写作业时,做到一半又去吃饭,吃完饭后又回来接着原来的作业继续完成。对于单片机来说,中断是指CPU正在处理某个事件A,发生了另一件事件B,请求CPU迅速去处理......
  • STM32(hal库)中HAL_ADC_PollForConversion 是 如何执行的?
    HAL_ADC_PollForConversion 是STM32HAL库中的一个函数,用于轮询(poll)ADC(模数转换器)的转换完成状态。这个函数会阻塞调用它的线程,直到ADC转换完成。以下是该函数的工作原理和执行步骤的详细解释:函数原型c复制代码HAL_StatusTypeDefHAL_ADC_PollForConversion(ADC_HandleT......
  • STM32 HAL 库硬件 I2C 驱动 MPU6050
    MPU6050简介驱动文件mpu6050.h#ifndefINC_MPU6050_H_#defineINC_MPU6050_H_#include"i2c.h"//I2C通道配置#definehI2C&hi2c2//设备地址配置#defineMPU6050_ADDRESS_Write 0xD0//0x68左移一位补0#defineMPU6050_ADDRESS_Read0xD1//0x68左移一位补1......
  • stm32f4 使用FreeRTOS例程
    文章目录引言开发环境搭建配置STM32CubeMX编写FreeRTOS任务代码编译与调试结论stm32f4使用FreeRTOS例程引言随着物联网(IoT)和嵌入式系统的发展,实时操作系统(RTOS)在资源受限的嵌入式设备上得到了广泛应用。FreeRTOS作为一种开源的、可裁剪的RTOS,因其轻量级、高可靠......
  • STM32F103系统时钟配置
    时钟是单片机运行的基础,时钟信号推动单片机内各个部分执行相应的指令。时钟系统就是CPU的脉搏,决定CPU速率,像人的心跳一样只有有了心跳,人才能做其他的事情,而单片机有了时钟,才能够运行执行指令,才能够做其他的处理(点灯,串口,ADC),时钟的重要性不言而喻。一、STM32F103时钟介绍STM32......
  • 基于STM32的独立按键控制LED灯Proteus仿真设计(仿真+程序+设计报告+讲解视频)
    基于STM32的独立按键控制LED灯Proteus仿真设计(仿真+程序+设计报告+讲解视频)仿真图proteus8.9程序编译器:keil5编程语言:C语言设计编号:C00951.主要功能1.使用Proteus仿真软件和STM32F103系列芯片设按键扫描电路。2.开始仿真后LED1和LED2点亮,按键控制熄灭/点亮3.使用......
  • STM32(hal库)中,为什么DMA没有MSP函数?
            在STM32HAL库中,DMA(直接存储器访问)并没有像其他某些外设(如USART、SPI等)那样拥有专门的MSP(MCUServicesPackage)初始化函数,这主要是由于DMA的特性和HAL库的设计哲学所决定的。        首先,需要明确的是,MSP函数通常是由STM32CubeMX工具为特定的外设生成......
  • 【STM32】BKP备份寄存器&RTC实时时钟&PWR电源控制
    文章目录BKP备份寄存器BKP简介BKP的基本结构BKP库函数RTC实时时钟RTC简介RTC基本结构RTC操作注意事项RTC库函数PWR电源控制PWR简介STM32内部供电方案低功耗模式模式选择BKP备份寄存器对应STM32F10xxx参考手册中的第五章BKP简介BKP(BackupRegisters)备份寄存......
  • 基于STM32的四轴无人机项目
    无人机1.项目概述1.1简介本项目是基于STM32的微型四轴无人机,控制核心采用STM32F103C8T6,姿态运动传感器选择MPU6050。无人机通过Si24R1(NRF24L01)与控制器进行2.4G无线通信,实现了即时有效地接收控制器指令,通过串级PID进行姿态控制,从而在空间中实现自由移动。1.2功能描述......
  • STM32微控制器GPIO库函数
    STM32微控制器GPIO库函数目录概述GPIO库函数基础HAL库与标准外设库GPIO库函数分类GPIO数学基础电阻分压公式输入电流计算输出驱动能力功率计算RC时间常数GPIO应用实例LED控制按钮输入与中断串行通信PWM信号生成常见问题与解决方法GPIO引脚无法正确读取输入状......