STM32第6章、WWDG

一、简介

WWDG:全称Window watchdog,即窗口看门狗,本质上是一个能产生系统复位信号和提前唤醒中断的计数器。

特性:

是一个递减计数器。

看门狗被激活后,

当递减计数器值从 0x40减到0x3F时会产生复位(即T6位跳变到0)。

当计数器的值大于W[6:0]值时喂狗会产生复位。

当递减计数器等于 0x40 时可产生提前唤醒中断 (EWI)。

喂狗操作:在窗口期内重装载计数器的值,防止复位。

作用:

由于外界电磁干扰或者自身系统(硬件或软件)异常,会造成程序跑飞,如:陷入某个不正常的死循环,打断正常的程序运行。

WWDG解决的问题就是:由于软件异常导致的程序跑飞问题。

应用:

WWDG主要应用于一些需要高稳定性的产品中,并且需要精准监测程序运行时间的场合。

二、工作原理

W[6:0] < 非窗口期 <= T[6:0]

0x3F < 窗口期 <= W[6:0]

复位信号:

在非窗口期喂狗时,会生成复位信号;

当递减计数器值减到0x3F时,会产生复位信号。

提前唤醒中断:

当递减计数器值减到0x40时,可产生提前唤醒中断 (EWI)。

三、功能框图

1. 时钟信号

时钟源:

PCLK是时钟源。

PCLK时钟频率十分精确,例如:F1用36MHz,F4用42MHz。

PCLK时钟需要程序员手动开启。

WWDG时钟:

由时钟源PCLK经过分频器进行4096分频后,再经过WWDG预分频器进行分频后得到的时钟频率,就是WWDG的时钟。

WWDG时钟为递减计数器提供时钟信号,每发生一个WWDG时钟,递减计数器的值就会减1。

2. 模块

① WWDG_CFR配置寄存器:

此寄存器装载着WWDG的窗值W[6:0],用来与WWDG_CR中的T[6:0]进行比较。

② WWDG_CR控制寄存器:

一共8个bit,第7bit也就是WDGA位是WWDG开启位,当WDGA位置1时,窗口看门狗开启。如果在选项字节中使能了硬件开启窗口看门狗的功能,则WDGA位不起作用。T[6:0]位是一个7位向下递减计数器,取值范围是0x7F至0x40。如果T[6:0]由0x40变为0x3F,即T[6]变为0时,取反输入或门 ⑤ ,则或门 ⑤ 输入1,产生窗口看门狗复位。

③ 比较器:

用来比较T[6:0]是否大于W[6:0],如果是,则输出1,否则输出0。如果T[6:0]大于W[6:0],意味着计数器的值现在不在窗口内。如果T[6:0]小于W[6:0],且T[6]不为0,也就是没有递减到0x3F,则计数器的值现在在窗口内,可以重载WWDG_CR,也就是可以喂狗。

④ 二输入与门:

一个输入来自比较器 ③,另一个输入来自是否重载WWDG_CR(喂狗),是的话输入1。当T[6:0]大于W[6:0],也就是计数器的值不在窗口内,此时喂狗与门输出1,引发系统复位。

⑤ 二输入或门:

一个输入来自于与门 ④ ,另一个输入来自T[6]取反。

⑥ 二输入与门:

一个输入来自于或门 ⑤,另一个输入来自WDGA位。

3. 寄存器

3.1 控制寄存器

使能窗口看门狗工作;

以及重装载计数器值(即喂狗)。

3.2 配置寄存器

使能窗口看门狗提前唤醒中断;

设置预分频系数;

设置窗口上限值。

3.3 状态寄存器

用于判断是否发生了WWDG提前唤醒中断。

四、溢出时间计算

1. 公式

2. 最短最长溢出时间计算

五、开发流程

1. 开发步骤

2. 函数详解

2.1 HAL_WWDG_Init()函数

功能:

设置预分频系数和窗口值,并使能WWDG。

函数原型:

HAL_StatusTypeDef HAL_WWDG_Init(WWDG_HandleTypeDef *hwwdg);

参数:

hwwdg:WWDG句柄。

typedef struct

{

WWDG_TypeDef *Instance; /* WWDG寄存器基地址 */

WWDG_InitTypeDef Init; /* WWDG初始化 */

} WWDG_HandleTypeDef;

typedef struct

{

uint32_t Prescaler; /* 预分频系数 */

uint32_t Window; /* 窗口值 */

uint32_t Counter; /* 计数器值 */

uint32_t EWIMode; /* 提前唤醒中断使能 */

}WWDG_InitTypeDef;

返回值:

typedef enum

{

HAL_OK = 0x00U, /* 成功 */

HAL_ERROR = 0x01U, /* 失败 */

HAL_BUSY = 0x02U, /* 忙碌 */

HAL_TIMEOUT = 0x03U /* 超时 */

} HAL_StatusTypeDef;

相关寄存器:

WWDG_CR、

WWDG_CFG。

2.2 HAL_WWDG_Refresh()函数

功能:

重装载计数器,即喂狗。

函数原型:

HAL_StatusTypeDef HAL_WWDG_Refresh(WWDG_HandleTypeDef *hwwdg);

参数:

hwwdg:WWDG句柄。

返回值:

typedef enum

{

HAL_OK = 0x00U, /* 成功 */

HAL_ERROR = 0x01U, /* 失败 */

HAL_BUSY = 0x02U, /* 忙碌 */

HAL_TIMEOUT = 0x03U /* 超时 */

} HAL_StatusTypeDef;

相关寄存器:

WWDG_CR。

六、编程实战

1. 思路

2. 代码

wwdg.c文件

cpp 复制代码
#include "./BSP/WDG/wdg.h"
#include "./BSP/LED/led.h"
#include "./SYSTEM/delay/delay.h"


WWDG_HandleTypeDef g_wwdg_handle;

/* 窗口看门狗初始化函数 */
void wwdg_init(uint8_t tr, uint8_t wr, uint32_t fprer)
{
    g_wwdg_handle.Instance = WWDG;
    g_wwdg_handle.Init.Counter = tr;
    g_wwdg_handle.Init.Window = wr;
    g_wwdg_handle.Init.Prescaler = fprer;
    g_wwdg_handle.Init.EWIMode = WWDG_EWI_ENABLE;
    HAL_WWDG_Init(&g_wwdg_handle);
}

/* WWDG MSP回调函数 */
void HAL_WWDG_MspInit(WWDG_HandleTypeDef *hwwdg)
{
    __HAL_RCC_WWDG_CLK_ENABLE();
    
    HAL_NVIC_SetPriority(WWDG_IRQn, 2, 3);
    HAL_NVIC_EnableIRQ(WWDG_IRQn);
}

/* WWDG中断服务函数 */
void WWDG_IRQHandler(void)
{
    HAL_WWDG_IRQHandler(&g_wwdg_handle);
}

/* WWDG提前唤醒回调函数 */
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
{
    HAL_WWDG_Refresh(&g_wwdg_handle);
    LED1_TOGGLE();
}

main.c文件

cpp 复制代码
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/delay/delay.h"
#include "./SYSTEM/usart/usart.h"
#include "./BSP/LED/led.h"
#include "./BSP/WDG/wdg.h"


int main(void)
{
    HAL_Init();                                 /* 初始化HAL库 */
    sys_stm32_clock_init(RCC_PLL_MUL9);         /* 设置时钟,72M */
    delay_init(72);                             /* 初始化延时函数 */
    usart_init(115200);                         /* 波特率设置为115200 */
    led_init();                                 /* 初始化LED */
    
    if(__HAL_RCC_GET_FLAG(RCC_FLAG_WWDGRST) != RESET)
    {
        printf("窗口看门狗复位\r\n");
        __HAL_RCC_CLEAR_RESET_FLAGS();
    }
    else
    {
        printf("外部复位\r\n");
    }
    
    delay_ms(500);
    printf("请在窗口期内喂狗\r\n\r\n");
    wwdg_init(0x7f, 0x5f, WWDG_PRESCALER_8);
    
    while(1)
    {
        delay_ms(90);
        HAL_WWDG_Refresh(&g_wwdg_handle);
        LED0_TOGGLE();
    }
}

七、IWDG与WWDG的主要区别

相关推荐
北京天拓四方1 小时前
边缘计算网关在PLC数据采集方面的应用
物联网·边缘计算
佳心饼干-2 小时前
单片机-定时器中断
单片机·嵌入式硬件
唐山柳林2 小时前
灌区闸门自动化控制系统-精准渠道量测水-灌区现代化建设
大数据·运维·科技·物联网·自动化
电气_空空3 小时前
基于单片机的指纹密码锁
单片机·嵌入式硬件·毕业设计·毕设
厉昱辰6 小时前
STC89C51与AT89C51芯片区别深度剖析
单片机·嵌入式硬件
美摄科技6 小时前
美摄科技PC端视频编辑解决方案,为企业打造专属的高效创作平台
物联网
jjjxxxhhh1236 小时前
MAX3232芯片介绍
stm32·单片机·fpga开发
葱8917 小时前
蓝桥杯嵌入式速通(1)
单片机·嵌入式硬件·蓝桥杯
不能只会打代码9 小时前
32单片机从入门到精通之测试与验证——性能优化(十六)
单片机·嵌入式硬件·性能优化·32单片机