STM32 看门狗

一.WDG简介

WDG(Watchdog)看门狗

看门狗可以监控程序的运行状态,当程序因为设计漏洞、硬件故障、电磁干扰等原因,出现卡死或跑飞现象时,看门狗能及时复位程序,避免程序陷入长时间的罢工状态,保证系统的可靠性和安全性 看门狗本质上是一个定时器,当指定时间范围内,程序没有执行喂狗(重置计数器)操作时,看门狗硬件电路就自动产生复位信号 STM32内置两个看门狗     

独立看门狗(IWDG):独立工作,对时间精度要求较低     窗口看门狗(WWDG):要求看门狗在精确计时窗口起作用

键寄存器本质上是控制寄存器,用于控制硬件电路的工作 在可能存在干扰的情况下,一般通过在整个键寄存器写入特定值来代替控制寄存器写入一位的功能,以降低硬件电路受到干扰的概率

写入键寄存器的值

作用

0xCCCC

启用独立看门狗

0xAAAA

IWDG_RLR中的值重新加载到计数器(喂狗)

0x5555

解除IWDG_PRIWDG_RLR的写保护

0x5555之外的其他值

启用IWDG_PRIWDG_RLR的写保护

二.超时时间 

例如要设置超时时间是1000ms,TLSI=1/FLSI=1/40kHz=0.025ms,所以预分频系数4和8太小,达不到1000,选16分频。PR预分频16,最后算RL,1000/0.025/16-1=2499

三.窗口看门狗 

 

设置超时时间是50ms,窗口时间是30ms,因为超时时间是50ms只能选择WDGTB预分频系数是3,FPCLK1=36Mhz。算出T[5:0],这里只有5位,还要去加上一个标志位的值。

算出T[5:0]和WDGTB,在来算W[5:0],窗口时间就很轻松了。W[5:0]给21,还要去或上0x40给第六位标志位。

 四.代码

int main(void)
{    
    KEY_Init();
    OLED_Init();
    OLED_ShowString(1,1,"IWDG TEST:");
    
    if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST)==SET)
    {
        OLED_ShowString(2,1,"IWDGRST");
        Delay_ms(500);
        OLED_ShowString(2,1,"       ");
        Delay_ms(100);
        RCC_ClearFlag();       
    }
    else
    {
        OLED_ShowString(3,1,"RST");
        Delay_ms(500);
        OLED_ShowString(3,1,"   ");
        Delay_ms(100);
    }
    IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//解除写保护
    IWDG_SetPrescaler(IWDG_Prescaler_16);//配置预分频
    IWDG_SetReload(2499);//配置重装值
    IWDG_ReloadCounter();
    IWDG_Enable();
	while (1)
	{
        Key_GetNum();//按键一直按下,发生阻塞看门狗复位
        IWDG_ReloadCounter();//不断喂狗
        OLED_ShowString(4,1,"FEED");
        Delay_ms(200);
        OLED_ShowString(4,1,"    ");
        Delay_ms(600);
	}
}
int main(void)
{    
    KEY_Init();
    OLED_Init();
    OLED_ShowString(1,1,"WWDG TEST:");
    
    if(RCC_GetFlagStatus(RCC_FLAG_WWDGRST)==SET)
    {
        OLED_ShowString(2,1,"WWDGRST");
        Delay_ms(500);
        OLED_ShowString(2,1,"       ");
        Delay_ms(100);
        RCC_ClearFlag();       
    }
    else
    {
        OLED_ShowString(3,1,"RST");
        Delay_ms(500);
        OLED_ShowString(3,1,"   ");
        Delay_ms(100);
    }
    
    //超时时间50ms,窗口时间30ms,喂狗时间在30ms-50ms
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);
    
    WWDG_SetPrescaler(WWDG_Prescaler_8);
    WWDG_SetWindowValue(21|0x40);
    WWDG_Enable(0x40|54);//还有一个第六位标志位也要加上去
	while (1)
	{
        Key_GetNum();

        OLED_ShowString(4,1,"FEED");
        Delay_ms(20);
        OLED_ShowString(4,1,"    ");
        Delay_ms(20);//20+20
        WWDG_SetCounter(0x40|54);//喂狗
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值