您当前的位置:首页 > 生活 > 内容

stm32窗口看门狗有什么用_STM32中的独立看门狗和窗口看门狗

stm32窗口看门狗有什么用_STM32中的独立看门狗和窗口看门狗

:前言

早期的MCU没有看门狗这种东西,所以产品容易死机飞。为了避免这种情况,后来的MCU集成了看门狗功能。但目前看门狗基本分为两类:独立看门狗和窗口看门狗。

独立看门狗:使用外部时钟,即使主频不工作,看门狗也能正常工作。只要在达到喂食时间上限之前给狗喂食,就说明程序正常,和窗口看门狗不一样。另外,独立看门狗是独立于整个系统的,这也是独立看门狗名字的由来。它有自己独立的时钟,不受整个系统的影响,所以独立的看门狗主要用来监控硬件错误。

窗口看门狗:使用芯片内部时钟。喂狗的时间既有上限也有下限,即不能过早也不能过晚喂狗。比如我要求你在0.8s到0.9s之内喂完狗,如果0.8s之前喂不完狗,或者0.9s之后喂不完狗,你就会认为MCU异常,重新设置MCU。窗口看门狗是系统中的故障检测器。如果系统时钟出现错误,窗口看门狗将失去作用,主要用于监控软件错误。

二、独立看门狗

从上面的简单来看,相信大家对独立看门狗都有所了解了。本部分将详细解释独立看门狗及其实现原理。

在了解独立看门狗之前,我想我们还是需要知道看门狗是干什么用的。在单片机组成的微机系统中,程序经常会因为外界电磁场的干扰而跑偏,陷入死循环——,即程序的正常运行被中断,系统无法继续工作。

在这种情况下,系统将处于停滞状态,并会发生不可预测的后果。因此,出于对单片机运行状态实时监控的考虑,产生了专门用于监控单片机程序运行状态的模块或芯片,称为看门狗。

这里以大家熟悉的STM32为例,讲解一下独立看门狗的配置和工作过程。STM32F10xxx内置两种看门狗:独立看门狗和窗口看门狗,提供了更高的安全性、时间准确性和使用灵活性。

在此插入图片说明。

STM32中的独立看门狗通过将0xCCCC写入键值寄存器(IWDG_KR)来配置。当独立看门狗开启时,其计数器从0xFFF开始递减计数。当计数器计数到0x000结束时,它将产生一个复位信号(IWDG_RESET)。每当0xAAAA被写入密钥寄存器IWDG_KR时,IWDG_RLR中的值将被重新载入计数器,以避免看门狗复位。

IWDG_PR和IWDG_RLR寄存器具有写保护功能。要修改这两个寄存器的值,必须先将0x5555写入IWDG_KR寄存器。向该寄存器中写入其他值会扰乱操作顺序,寄存器将再次受到保护。重载操作(即写入0xAAAA)也会激活写保护功能。

了解了上述配置的基本原理,我们就可以开始配置我们的看门狗了。具体配置流程和配置代码如下:

取消寄存器写保护;

设置独立看门狗的和分频系数并确定时钟;

设置看门狗重载值;

启用看门狗;

应用程序喂狗;

配置代码如下:

/* * *初始化独立看门狗*prer:分频数:0~7(只有低3位有效!)*分频系数=4 * 2 PRER。但是最大值只能是256!*rlr:重载寄存器值:低11位有效。*时间计算(近似):tout=((4 * 2 PRER) * RLR)/40(毫秒)。*/Voidiwdg _ init (U8 PRER,u 16 rlr){ iwdg _ writeaccmd(iwdg _。IWDG _ SetPrescaler(prer);IWDG _ Set reload(rlr);IWDG _ reload counter();IWDG_Enable()的值重载IWDG计数器;} /** * Feed独立看门狗*/void IWDG _ Feed(void){ IWDG _ reload counter();/* } /** *main main函数*/void main(void){ nvic _ configuration();//优先级配置IWDG _ Init(4625);//初始化独立看门狗,分频数为64,重载值为625,溢出时间计算为:64 * 625/40=1000 ms=1s while(1){ delay _ ms(500);//每0.5秒喂一次狗IWDG _ Feed();//喂狗}}

你可以根据下面的公式计算溢出时间:tout=((4 2 PRER ) RLR)/40 (m3)。

独立看门狗使用的库函数:

void wwdg _ de init(void);voidWWDG _ SetPrescaler(uint 32 _ tww DG _ Prescaler);voidWWDG _ SetWindowValue(uint 8 _ tWindowValue);void wwdg _ enable it(void);voidWWDG _ set counter(uint 8 _ t counter);void wwdg _ Enable(uint 8 _ t counter);flagstatuswdg _ GetFlagStatus(void);void wwdg _ clear flag(void);

三、窗口看门狗

窗口看门狗(WWDG)通常用于监控由外部干扰或不可预测的逻辑条件引起的软件故障。除非在T6位(WWDG-CR的第六位)变为0之前刷新递减计数器的值,否则看门狗电路将在达到预设时间周期时产生MCU复位。

在递减计数器达到窗口配置寄存器(WWDG-CFR)的值之前,如果7位递减计数器值(在控制寄存器中)被刷新,也将产生MCU复位。这表明递减计数器需要在有限的时间窗口内刷新。

然而,使用窗口看门狗时,应注意写入WWDG_CR寄存器时,应始终写入1至T6位,以避免产生立即复位。

我们来看看窗口看门狗的配置步骤和配置代码。

启用WWDG时钟

设置窗口值和分频数

打开WWDG中断和组。

设置计数器初始值并启用看门狗。

表单看门狗所需的库函数;

void RCC _ APB 1 periphclock cmd(RCC _ APB 1 periph _ WWDG,使能);//WWDG时钟使能void wdg _ setWindowValue(uint 8 _ TwindowValue);//设置窗口值的函数,void wdg _ set scaler(uint 32 _ tw wdg _ scaler);//设置分频数voidWWDG_EnableIT()的函数;//打开窗口看门狗中断void wdg _ enable(uint 8 _ t counter);//设置计数器初始值,使能看门狗。

注意:写中断服务函数的时候一定要快喂狗,因为窗口看门狗的时效性很强。

窗口监视器的代码如下:c

# ifndef _ _ wdg _ h # define _ _ wdg _ h # include ' sys . h '//独立看门狗voidIWDG_Init(u8prer,u 16 rlr);void iwdg _ Feed(void);//窗口看门狗voidwdg _ init (u8tr,u8wr,u 32 fprrer);//初始化WWDG void wdg _ set _ counter(u8 CNT);//设置WWDG的计数器void wdg _ nvic _ init(void);#endif。h

# include ' wdg . h ' # include ' led . h '//Window Watchdog//保存WWDG计数器的设置值,默认为最大值u8WWDG _ CNT=0x7f//初始化窗口看门狗//tr:T[6:0],计数器值//wr:W[6:0],窗口值//fprer:分频系数(WDGTB),只有最少2位有效//fwwdg=pclk1/(4096 * 2 fprer)。Voidw。//WWDG时钟使能WWDG _ CNT=trWWDG _ CNT;//初始化wwdg _ CNT . wwdg _ setprescaler(FP rer);设置IWDG预分频值WWDG _ SetWindowValue(wr);//设置窗口值WWDG _使能(WWDG _ CNT);//启用看门狗并设置计数器。WWDG _清除标志();//清除早期唤醒中断标志WWDG _ NVIC _ Init();//初始化窗口看门狗NVIC WWDG _ enable it();//打开看门狗中断}//复位WWDG计数器void wdg _ set _ counter(u8 cnt){ WWDG _使能(CNT)的值;//启用看门狗并设置计数器。} //窗口看门狗中断服务程序void wwdg _ nvic _ init(){ nvic _ inittypedefnvic _ init结构;NVIC _初始结构。NVIC _ IRQ channel=WWDG _ IRQn;//WWDG中断nvic _ init structure . nvic _ irqchannelpreemption priority=2;//抢占2,子优先级3,组2 nvic _ initstructure。nvic _ irqchannelsubpriority=3;//抢占2,子优先级3,组2 nvic _ initstructure。nvic _ irqchannelcmd=enableNVIC _初始化(NVIC _初始化结构);//NVIC初始化} void wwdg _ IRQ handler(void){ wwdg _ set counter(wwdg _ CNT);//当这句话被禁用时,窗口看门狗会生成一个reset WWDG _ clear flag();//清除早期唤醒中断标志位LED1=!LED1//LED状态翻转}

主网站

# include ' led . h ' # include ' delay . h ' # include ' key . h ' # include ' sys . h ' # include ' usart . h ' # include ' wdg . h ' int main(void){ delay _ init();delay函数初始化nvic _ priority group config(nvic _ priority group _ 2);//设置中断优先级分组为group 2: 2位抢占优先级和2位响应优先级UART _ init(115200);//串口初始化为115200 LED _ Init();KEY _ Init();//按键初始化LED0=0delay _ ms(500);WWDG _初始化(0X7F,0X5F,WWDG _预分频器_ 8);//计数器值为7f,窗口寄存器为5f,分频数为8 while(1){ led 0=1;} }

在主功能中,LED0用于指示STM32是否已经复位,如果已经复位,则点亮500 ms.LED0用来表示喂狗中断,每次给狗转一次。

结论

今天的讲解到此结束。不知道大家是否了解看门狗及其用途。如果有不明白的地方,欢迎在下方评论区留言讨论!


声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,谢谢。

上一篇: dell笔记本硬盘(DELL笔记本一般用什么牌子的硬盘)

下一篇: 涧组词拼音(涧组词拼音是什么)



猜你感兴趣

推荐阅读

网站内容来自网络,如有侵权请联系我们,立即删除! | 软文发布 | 粤ICP备2021106084号