1.看门狗简介
在工业控制/汽车电子/航空航天等需要高可靠性的系统中,为了防止“系统在异常情况 下,受到干扰,MCU/CPU 程序跑飞,导致系统长时间异常工作”的情况发生,而设计了一 种用于检测程序运行状态的芯片或电路,俗称看门狗(即 Watchdog)。
看门狗有一个输入信号和一个输出信号。输入信号也称“喂狗”,输出信号关联 MCU 的复位端。系统运行后启动看门狗计数器,看门狗开始计数,当计数满后未收到清零信号(喂 狗),看门狗计数器溢出,触发看门狗中断,输出控制 MCU 复位。
2.IWDG和WWDG看门狗
独立看门狗 IWDG(全称是 Independent watchdog)最适合应用于那些需要看门狗作为 一个在主程序之外,能够完全独立工作,并且对时间精度要求较低的场合。独立看门狗是在计数器递减到 0 之前必须喂狗,否 则复位。
窗口看门狗 WWDG(全称是 Window watchdog) 最适合那些要求看门狗在精确计时窗口起作用的应用程序。窗口看门狗是在计数器递减到固定值 0x40 之前一个区段必须喂狗,否则复位。 之所以说窗口看门狗必须在计数器递减到固定值 0x40 之前一个区段必须喂狗,是因为如果 在计数器递减到某一个数 WR 之前喂狗,也会导致系统复位。这个 WR 叫窗口的上限值。
窗口看门狗和独立看门狗还一个重要区别是窗口看门狗有早期唤醒中断(EWI),通 过设置 WWDG_CFR 寄存器中的 WEI 位可以开启该中断。独立看门狗是没有中断的。
3.看门狗超时时间计算
1 .IWDG 独立看门狗超时时间计算
RLR 表示重装载值(低 11 位有效),PRER 表示预分频系数值(范围是 0~6)。例 如,按 RLR 为 625、PRER 为 4 来计算可得 IWDG 看门狗超时时间为 1000ms 即 1s。
2.WWDG 窗口看门狗超时时间计算
Fpclk1 表示 APB1 的时钟频率(单位为 KHZ),WDGTB 表示 WWDG 的预分频系 数,T[5:0]表示 WWDG 的计数器低 6 位。
4.程序举例说明
1、IWDG使用
#include "IWDG.h"
//初始化
void Iwdg_Init(void){
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
IWDG_SetReload(625);
//IWDG_Prescaler_64对应的预分频系数值4
IWDG_SetPrescaler(IWDG_Prescaler_64);
IWDG_Feed();
IWDG_Enable();
}
void IWDG_Feed(void){
IWDG_ReloadCounter();
}
由公式及代码可以看到RLR设置为625, 预分频系数为4,则可以得到IWDG 看门狗超时时间为 1000ms。
#include "public.h"
int main(void)
{
led_init();
Iwdg_Init();
sw_delay_ms(500);
Led_On(LED_1);
//主循环
while(1)
{ //延时530毫秒
sw_delay_ms(530);
//喂狗
IWDG_Feed();
//延时500毫秒
sw_delay_ms(500);
}
}
在while循环中共延时了1030毫秒,属于延时喂狗,当计数满后未收到清零信号(喂 狗),看门狗计数器溢出,触发看门狗中断,输出控制 MCU 复位。
2、WWDG使用
#include "wwdg.h"
//初始化
void Wwdg_Init(uint8_t tr, uint8_t tt, uint32_t td){
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);
WWDG_SetCounter(tr);
WWDG_SetWindowValue(tt);
WWDG_SetPrescaler(td);
WWDG_Enable(WWDG_CNT);
WWDG_ClearFlag();
WWDG_EnableIT();
//优先级
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
//喂狗函数
void WWDG_Feed(void){
WWDG_SetCounter(WWDG_CNT);
}
//中断函数
void WWDG_IRQHandler(void){
WWDG_ClearFlag();
Led_On(LED_2);
GPIO_SetBits(GPIOG, GPIO_Pin_7);
}
#include "public.h"
int main(void)
{ SystemInit();
led_init();//led初始化
Wwdg_Init(0x7F,0x5F,WWDG_Prescaler_8);
Beep_Init();//蜂鸣器初始化
sw_delay_ms(20);
Led_On(LED_1);
//主循环
while(1)
{
sw_delay_ms(8);
WWDG_Feed();
sw_delay_ms(47);
}
}
/********************************************END FILE********************/
按照程序和上面的公式可以计算得到WWDG 超时计算公式 可计算出超时时间约为 58.25ms。(ABP1的时钟频率为36MHZ)。通过设置与延时函数就可以按时、延时、提前喂狗。