×
单片机 > 单片机程序设计 > 详情

STM32之窗口看门狗(WWDG)

发布时间:2020-06-16 发布时间:
|
前几天学习STM32的两条狗,先学习了宠物狗(IWDG),和其它MCU差不多,不多说了。学到警犬(WWDG)的时候,问题来了,没有IWDG那么好理解了,看了半天没有搞懂是怎么回事,计数器值、窗口值、在什么时候喂狗、什么时候产生中断等等,一头雾水。


经过两天的推敲,个人理解如下:

1、有个7位递减计数器(WWDG->CR),就这个计数器和窗口计数器(WWDG->CFR)决定什么时候喂狗。

     狗喂早了,复位——“早”体现在计数器值(tr)>窗口值(wr),也就是计数器值还没有减到窗口值以下;

2、当 0x40 < 计数器值(tr) < 窗口值(wr) 时,这时候最适合喂狗了,也只有在这时候喂狗才合适;

3、当计数器的值从0x40变到0x3F的时候,将产生看门狗复位;当然在要产生复位的前一段时间,如果开启了提前唤醒中断,那么就会进入中断,在中断函数里,我们需要及时喂狗,否则会产生复位;

4、据网上资料介绍,在这个中断里面一般不进行喂狗,一般是系统去世前的“遗嘱”,比如存储重要的数据等。这个就需要根据个人需要设计。
 

下面择取部分程序,可以根据程序说明,计算出喂狗的时间,大家注意推敲,欢迎交流!


u8 WWDG_CNT = 0x7F;


void WWDG_Init(u8 tr, u8 wr, u32 fprer)

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);    // WWDG时钟使能
   
    WWDG_CNT = tr & WWDG_CNT;   // 初始化WWDG_CNT
   
   
   
   
    WWDG_SetPrescaler(fprer);   // 设置IWDG预分频值
   
   
   
    WWDG_SetWindowValue(wr);    // 设置窗口值
   
   
    WWDG_Enable(WWDG_CNT);      // 使能看门狗, 设置 counter
   
    WWDG_ClearFlag();           // 清除提前唤醒中断标志位
   
    WWDG_NVIC_Init();           // 初始化窗口看门狗 NVIC
   
   
    WWDG_EnableIT();            // 开启窗口看门狗中断
}
 



void WWDG_IRQHandler(void)
   
    WWDG_ClearFlag();           // 清除提前唤醒中断标志位
   
    LED1 = !LED1;               // LED1 状态翻转
    printf("进入中断!rn");
}
 

int main(void)
{
    u8 tr, wr;
   
    delay_init();
    NVIC_Configuration();   // 设置NVIC中断分组2:2位抢占优先级, 2位响应优先级
    LED_Init();
    KEY_Init();
    uart_init(9600);
   
    LED0 = 0;
    delay_ms(300);
   
    WWDG_Init(0x7F, 0x5F, WWDG_Prescaler_8);    // 计数器值为7f, 窗口寄存器值为5f, 分频数为8
   
    while(1)
    {
        LED0 = 1;
       
        wr=WWDG->CFR&0X7F;      // 窗口值
        tr=WWDG->CR&0X7F;       // 计数器值


        
        if(tr  // 计数器值tr必须小于窗口值wr时才能喂狗,在之前喂狗则太早,会产生看门狗复位
        {
            WWDG_SetCounter(WWDG_CNT);
            printf("正在喂狗!rn");
        }
       
       
    }
   
}

 

实践出真知!
试验现象:DS0(红灯)先亮,再灭,DS1无变化。
试验现象说明:在规定的时间段及时的喂狗了,程序没有进入中断函数。

关键字:STM32  窗口看门狗  WWDG

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
AVR熔丝位操作时的要点和需要注意的相关事项