目录
目录
前言:
一、窗口看门狗
1.看门狗时序图
2.公式
二、窗口看门狗寄存器
三、窗口看门狗流程(HAL库)
四、窗口看门狗实验
前言:
对于一般的看门狗,程序可以在它产生复位前的任意时刻刷新看门狗,但这有一个隐患,有可能程序跑乱了又跑回到正常的地方,或跑乱的程序正好执行了刷新看门狗操作,这样的情况下一般的看门狗就检测不出来。
检测出程序没有按照正常的路径运行非正常地跳过了某些程序段的情况。
一、窗口看门狗
窗口看门狗和独立看门狗有异曲同工之妙,独立看门狗是在0-x内限制喂狗时间,x是由寄存器决定;而窗口看门狗是有上下限的范围,通过设置相关寄存器来设定上限时间(下限固定)。
1.看门狗时序图
初值到上窗口值期间,不能喂狗,喂狗就会使系统复位。上窗口值到0x3F(结束),必须喂狗,不喂狗就会使系统复位。
2.公式
其中:
:WWDG超时时间(单位:ms)
:APB1时钟频率(单位:Khz)
WDGTB:WWDG预分频器系数
t[5:0]:窗口看门狗的计数器低6位
二、窗口看门狗寄存器
控制寄存器WWDG_CR
T[6:0]:当1000000(0x40)滚动到0111111(0x3F)时就会复位。
配置寄存器WWDG_CFR
状态寄存器WWDG_SR
三、窗口看门狗流程(HAL库)
WWDG不同于IWDG,IWDG有自己的32Khz时钟,而WWDG则需要使能。
1.使能WWDG;
__HAL_RCC_WWDG_CLK_ENABLE()函数放在HAL_WWDG_MspInit()中;
HAL_WWDG_MspInit()为Init的回调函数;
2.设置窗口值,分频数和计数器初始值;
HAL_WWDG_Init();
3.开启WWDG;
HAL_WWDG_Start( 开启WWDG)
HAL_WWDG_Start_IT(启动WWDG,同时启动WWDG中断)
以上函数二选一
4.使能中断并配置优先级(如果开启WWDG中断)
HAL_NVIC_SetPriority(WWDG_IRQn,x,x);
HAL_NVIC_EnableIRQ(WWDG_IRQn);
放在HAL_WWDG_MspInit()中;
5.编写中断服务函数
中断服务函数 void WWDG_IRQHandler(void);
中断处理函数 HAL_WWDG_IRQHandler();
6.重写中断处理回调函数
HAL_WWDG_Refresh(); // 喂狗
放在void HAL_WWDG_WakeupCallback()
四、窗口看门狗实验
1.头文件(wwdg.h)
#ifndef __WWDG_H
#define __WWDG_H
#include "sys.h"
void WWDG_Init(void);
#endif
2.配置WWDG(wwdg.c)
#include "wwdg.h"
#include "led.h"
WWDG_HandleTypeDef WWDG_Handler;
// WWDG句柄
// WWDG初始化
void WWDG_Init(void)
{
WWDG_Handler.Instance = WWDG;
WWDG_Handler.Init.Prescaler = WWDG_PRESCALER_8;
// 设置分频系数
WWDG_Handler.Init.Window = 0X5F;
// 设置窗口值
WWDG_Handler.Init.Counter = 0X7F;
// 设置计数值
HAL_WWDG_Init(&WWDG_Handler);
// 初始化WWDG
// 开启WWDG+中断
HAL_WWDG_Start_IT(&WWDG_Handler);
}
// WWDG初始化回调函数
void HAL_WWDG_MspInit(WWDG_HandleTypeDef *hwwdg)
{
//时钟使能
__HAL_RCC_WWDG_CLK_ENABLE();
//设置中断优先级和使能
HAL_NVIC_SetPriority(WWDG_IRQn, 2, 3);
HAL_NVIC_EnableIRQ(WWDG_IRQn);
}
// 中断服务函数
void WWDG_IRQHandler(void)
{
HAL_WWDG_IRQHandler(&WWDG_Handler);
// 中断处理函数
}
// 中断回调函数
void HAL_WWDG_WakeupCallback(WWDG_HandleTypeDef* hwwdg)
{
HAL_WWDG_Refresh(&WWDG_Handler, 0X7F);
// 喂狗
LED1 = !LED1;
// LED1反转
}
3.主函数
#include "sys.h"
#include "usart.h"
#include "led.h"
#include "delay.h"
#include "wwdg.h"
int main(void)
{
HAL_Init();
Stm32_Clock_Init(360, 25, 2, 8);
delay_init(180);
uart_init(115200);
LED_Init();
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
// 点亮LED0
delay_ms(300);
// 延时0.3s
WWDG_Init();
// WWDG初始化
while (1)
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
// 熄灭LED0
}
}
4.实现功能
可以看到DS0就是LED0也就是红灯会亮0.3s后熄灭,之后DS1也就是绿灯在不停的闪烁。每秒闪烁20次左右。
最后
以上就是顺利翅膀最近收集整理的关于STM32429窗口看门狗(WWDG)前言:一、窗口看门狗二、窗口看门狗寄存器三、窗口看门狗流程(HAL库)四、窗口看门狗实验的全部内容,更多相关STM32429窗口看门狗(WWDG)前言内容请搜索靠谱客的其他文章。
发表评论 取消回复