您的位置 首页 硬件

STM32之窗口看门狗(WWDG)

前几天学习STM32的两条狗,先学习了宠物狗(IWDG),和其它MCU差不多,不多说了。学到警犬(WWDG)的时候,问题来了,没有IWDG那么好理解了

前几天学习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无变化。
实验现象阐明:在规则的时刻段及时的喂狗了,程序没有进入中止函数。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/yingjian/259755.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部