看门狗

一、

独立看门狗一般用来检测和解决由程序引起的故障,比如一个程序正常运行的时间是50ms,在运行完这个段程序之后紧接着进行喂狗,我们设置独立看门狗的定时溢出时间为60ms,比我们需要监控的程序 50ms 多一点,如果超过 60ms 还没有喂狗,那就说明我们监控的程序出故障了,跑飞了,那么就会产生系统复位,让程序重新运行。

STM32 有两个看门狗,一个是独立看门狗另外一个是窗口看门狗,独立看门狗号称宠物狗,窗口看门狗号称警犬,本章我们主要分析独立看门狗的功能框图和它的应用。独立看门狗用通俗一点的话来解释就是一个 12 位的递减计数器,当计数器的值从某个值一直减到0的时候,系统就会产生一个复位信号,即 IWDG RESET。如果在计数没减到 0之前,刷新了计数器的值的话,那么就不会产生复位信号,这个动作就是我们经常说的喂狗。看门狗功能由 VDD 电压域供电,在停止模式和待机模式下仍能工作。

 

 

 

二、

void iwdg_init()
{
    
    if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST) != RESET)
    {
        RCC_ClearFlag();                             //清除标志
    }
    
     //溢出时间 Tout = prv/40 * rlv = 64/40 * 625 = 1000 ms = 1s
    //使能预分频寄存器PR和重装载寄存器RLR可写
    IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);    
    IWDG_SetPrescaler(IWDG_Prescaler_64);    //prv
    //设置重装载寄存器值
    IWDG_SetReload(625);//rlv
    //把重装载寄存器的值放到计数器中
    IWDG_ReloadCounter();    //喂狗
    IWDG_Enable();            //使能独立看门狗


}

void iwdg_feed()
{
    //把重装载寄存器的值放到计数器中,喂狗,防止IWDG复位
    //当计数器的值减到0的时候会产生系统复位
    IWDG_ReloadCounter();
}

int main(void)
{

    Init_GPIO();
    iwdg_init();
    LED_R_ON;    
    while(1)
    {
            
        if(KEY_0_READ)//按键喂狗
        {
            //喂狗,如果不喂狗,系统则会复位,红灯闪烁
            //在时间准时喂狗的话,则绿灯会常亮
            iwdg_feed();
            LED_G_ON;
        }
    
    }

}

 

posted @ 2022-12-02 15:51  ike_li  阅读(768)  评论(0编辑  收藏  举报