stm32窗口看门狗(WWDG)
0x01 WWDG简介
窗口看门狗通常被用来监测,由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。
窗口看门狗由APB1时钟分频后得到的时钟驱动,通过可配置的时间窗口来检测应用程序非正常的过迟或过早的操作。WWDG最适合那些要求看门狗在精确计时窗口起作用的应用程序。
0x02 WWDG主要特性
● 可编程的自由运行递减计数器
● 条件复位
─ 当递减计数器的值小于0x40, (若看门狗被启动)则产生复位。
─ 当递减计数器在窗口外被重新装载, (若看门狗被启动)则产生复位。
● 如果启动了看门狗并且允许中断,当递减计数器等于0x40时产生早期唤醒中断(EWI),它可以被用于重装载计数器以避免WWDG复位。
0x03 WWDG寄存器配置
1. 控制寄存器(WWDG_CR)
2. 配置寄存器(WWDG_CFR)
WWDG配置参考代码
#include "bsp_wwdg.h"
unsigned char WWDG_CNT = 0x7F;
void WWDG_NVIC_Init(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //设置优先级分组:先占优先级和从优先级
NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn; //设置中断请求通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //从优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断请求通道
NVIC_Init(&NVIC_InitStructure);
}
void WWDG_Configuration(unsigned char tr, unsigned char wr, unsigned int pr)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG , ENABLE); //使能 RCC_APB1 中外设 WWDG 时钟
WWDG_CNT &= tr; //防止tr值超过 0x7F
WWDG_SetCounter(WWDG_CNT);
WWDG_SetWindowValue(wr); //设置 WWDG 窗口上限值
WWDG_SetPrescaler(pr); //设置 WWDG 预分频值
WWDG_Enable(WWDG_CNT); //使能 WWDG 并装入计数器值
WWDG_NVIC_Init(); //初始化内嵌向量中断控制器的 WWDG
WWDG_ClearFlag(); //清除早期唤醒中断标志位
WWDG_EnableIT(); //使能早期唤醒中断EWI,此位若置’1’,则当计数器值达到40h,即产生中断。此中断只能由硬件在复位后清除。
}
WWDG中断函数
void WWDG_IRQHandler(void)
{
WWDG_SetCounter(WWDG_CNT); //喂狗,防止CPU复位
WWDG_ClearFlag(); //清除早期唤醒中断标志位
}