STM32:独立看门狗、窗口看门狗的配置.....

发布者:Xiaochen520最新更新时间:2021-08-17 来源: eefocus关键字:STM32  独立看门狗  窗口看门狗  配置 手机看文章 扫描二维码
随时随地手机看文章

STM32单片机的看门狗有独立看门狗和窗口看门狗之分,这两者的工作原理却完全不同,今天来看一下他们的具体区别和配置方法。

 

▍STM32独立看门狗由专门的低速时钟(LSI)驱动,即便是主时钟发生故障它仍能够有效,所以此狗狗可以工作在与主时钟无关的要求下,或者待机模块下等,所以它叫独立看门狗,注意一旦开启此看门狗则只能由MCU复位后才清除,让它不再工作。它的时钟是一个内部RC时钟,它会在30KHZ到60KHZ之间变化,并非是精确的40KHZ,而只是一般计算时取40KHZ。独立看门狗需设置四个寄存器如下:watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=其中,预分频寄存器(IWDG_PR),最低三位PR[2:0](Prescaler divider)有效,可设置有8种不同的计数器时钟预分频因子。重装载寄存器(IWDG_RLR)低12位RL[11:0]: 看门狗计数器重装载值 (Watchdog counter reload value) 有效,用来设置计数器的重装载值。注意要设置以上两个寄存器的值需满足两个条件,详见如下:键寄存器(IWDG_KR),用来控制去除IWDG_PR和IWDG_RLR写保护功能以便正常写值,向此寄存器写入0x5555则暂时去除IWDG_PR和IWDG_RLR的写保护功能才可向两个寄存器中写值。当向此寄存器写入0xAAAA则IWDG_RLR的值会重装载,防止MCU复位,向入0xCCCC是开启狗立看门狗动作。状态寄存器(IWDG_SR)最低两位有效RVU: 看门狗计数器重装载值更新 (Watchdog counter reload value update) 标识位和PVU: 看门狗预分频值更新 (Watchdog prescaler value update) 标识位,分别用来指示此时是否可向IWDG_RLR  和 IWDG_PR写值,此寄存器由硬件置1与清0,只有当为0时才可向上面两个寄存器写值。它的初始化过程大致如下 : //时间计算(大概):Tout=((4*2^prer)*rlr)/40 (ms)


void IWDG_Init(u8 prer,u16 rlr)
{       
        IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); 
         IWDG_SetPrescaler(prer);   
         IWDG_SetReload(rlr); 
         IWDG_ReloadCounter();      
         IWDG_Enable(); 
}

 

喂狗可通过调用如下函数进行:

 

IWDG_ReloadCounter();//reload另外要注意不要使用硬件时钟中断喂狗,因为硬件时钟中断一般都有较高优先级且独立于主控程序,这样有时会出现主控程序虽然跑飞了,但仍能够正常喂狗的现象。独立看门狗能够在一定程度上监控着程序正常运行,然而我认为更加强大,应用更灵活及更能保证程序稳定运行的还属窗口看门狗,虽然它开始时不太好理解。▍STM32窗口看门狗共三个寄存器,如下图:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

看似简单,但设置及应用起来有不少玄机。控制寄存器(WWDG_CR)中的值必须在0xFF与0xC0之间, 因为它的第0至第6位为递减计数器CNT,在它的第6位变为0时将产生复位,所以在初始化时需要为1,第7位WDGA是用来设置启动或禁止窗口看门狗的,当为1进才会启动窗口看门狗,所以第6和第7位都需为1,即WWDG_CR 的值需要大于等于0xC0 。配置寄存器(WWDG_CFR) 第0至第6位 是设置窗口边界值用的,只有当递减计数器CNT的值小于边界值时才可以喂狗,过早不行,狗还不饿,撑死了。并且7位递减计数器CNT减少到0x3F时即T6位变为0,此时MCU也会复位,过晚了,狗饿死了。所以必须在指定的时间范围喂狗,过早或过晚都将产生复位,而这样设计可以减少软件跑飞了却仍能够歪打正着地喂狗的发生概率。状态寄存器(WWDG_CFR) 只用到了第0位,EWIF(Early wakeup interrupt flag )是提前唤醒中断标识,当递减计数器CNT的值到达0X40(若再减少一次则T6位变为0,产生复位)时此位由硬件置1,且需用软件清0,注意无论中断是否使能此位都会被硬件置1。而提前唤醒中断使能设置是在配置寄存器(WWDG_CFR)第9位EWI(Early wakeup interrupt),此位需由软件置1,则会在当递减计数器CNT的值到达0X40时产生中断,并且与EWIF不同,此位是由硬件清0。另外控制寄存器(WWDG_CR)中第7位WDGA(Activation bit)激活位,需用软件来置1,以启动窗口看门狗,并且一旦启动后,只能在复位或重启后由硬件来清0。配置寄存器(WWDG_CFR)的第8位和第7位WDGTB[1:0]用来设置时基(Timer base)预分频数。 以上描述可参考下图以更清晰的理解:watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=窗口看门狗应用时还要注意算准最小与最大喂狗时间,以便正确地喂狗,如下:watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=在PCLK1频率为36MHz 时,则上窗口时间:T_min = 4096 * (2^WDGTB)*(WWDG_CR[6:0] - WWDG_CFR[6:0])/36 (us)下窗口时间:T_max = 4096 * (2^WDGTB)*(WWDG_CR[6:0] - 0x40)/36 (us) 。喂狗动作需在这段时间之间进行,而喂狗动作为向控制寄存器(WWDG_CR)中写值。窗口看门狗中断函数void WWDG_IRQHandler(void) 是用来做什么的呢?窗口看门狗中断函数是在递减计数器减少到0x40是被调用,因为它本身计数就比较慢,所以离数到0x3F复位还有一段时间,我认为这样设计是为MCU复位之前留下一点时间,能够使工程设计人员根据需要在中断函数保存一些重要的数据,这样在复位后MCU可知道系统因异常复位的某此状态,以使系统有更高稳定性。并且我觉得在窗口看门狗中断函数中喂狗没有什么意义,程序本来已经不按正常运行了,还在中断函数中喂狗防止复位只会错上加错,不好好利用它干点正事, 更是浪费资源。这点上我个人认为不要被点原子示例代码误导哦,但其还是有部分借鉴意义的,以下为初始化相关代码:  //窗口看门狗中断服务设置程序


    void WWDG_NVIC_Init()
    {
      NVIC_InitTypeDef NVIC_InitStructure;
      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);      
      NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn;       //WWDG 中断
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //抢占2 子优先级3 组2
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;    //抢占2,子优先级3,组2
      NVIC_Init(&NVIC_InitStructure);                       //NVIC 初始化
    }//保存WWDG 计数器的设置值,默认为最大.
u8 WWDG_CNT=0x7f; //初始化窗口看门狗
    //tr  :T[6:0],计数器值
    //wr   :W[6:0],窗口值
    //fprer:分频系数(WDGTB ),仅最低2 位有效
    //Fwwdg=PCLK1/(4096*2^fprer).
    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();                //开启窗口看门狗中断
}

 

以上代码朋友们也可以跳到库函数代码中自己研究下,另外要说明下的是WWDG_EnableIT(); 函数相关代码

 

#define CFR_EWI_BB        (PERIPH_BB_BASE + (CFR_OFFSET * 32) + (EWI_BitNumber * 4))


关键字:STM32  独立看门狗  窗口看门狗  配置 引用地址:STM32:独立看门狗、窗口看门狗的配置.....

上一篇:基于STM32电源模块开发
下一篇:基于stm32的can总线彻底研究

推荐阅读最新更新时间:2024-11-13 16:10

STM32速成笔记(3)—中断
一、什么是中断 首先介绍一下什么是中断。在实际开发过程中,中断是很有必要的。比如需要针对某种特殊情况进行快速响应,单纯的使用一个while轮询似乎并不能满足。中断的概念非常好理解,举个经典例子。比如你在家里看电视,忽然有人敲门,你临时把电视暂停了,转去开门。开完门之后再次回来继续看电视。 中断也就是这种流程。看电视的行为就类似于程序中main函数的while,轮询执行业务。忽然有人敲门,对应程序运行过程中忽然产生了一个中断请求。此时暂停电视,对应于此时程序中断当前的业务,转而去处理中断业务(开门)。最后,中断业务处理完成后,再继续执行main函数while轮询中的业务。简单用一个图来表示一下 中断概念示意图 根据中文参
[单片机]
<font color='red'>STM32</font>速成笔记(3)—中断
STM32的HAL和LL库到底能不能混合使用呢?
STM32的HAL(Hardware Abstraction Layer)和LL(Low Level)库是ST公司为快速开发STM32芯片的软件驱动库。两个库的定位是不同的,HAL库旨在为开发者提供一种快速开发的方法,同时在不同的STM32芯片之间保持一致性,而LL库是一种更低层次的API,提供了尽可能接近底层芯片的操作接口。 但是,使用哪种库来进行开发取决于个人的喜好和实际需求。有的人认为HAL库足够强大,可以满足大多数开发需求,而其他人则更愿意使用LL库,这可能是因为他们更熟悉底层芯片的操作或者需要更高的性能。 在实际开发中,有时需要同时使用HAL库和LL库。比如,当您需要使用HAL库提供的一些高级功能时,而LL库中没有对应的
[单片机]
基于stm32的异步电机反嵌绕组检测方法
  1.引言   电机是在工业生产过程中普遍使用的装置,电机的故障往往会带来严重的后果与损失。定子绕组是三相异步电动机的主要组成部分,也是电动机最容易损坏而造成故障的部件。异步电机在生产过程中,由于生产工人的失误,有可能发生定子绕组反嵌的现象,发生电动机启动困难,三相电流严重失衡且电流急剧上升,接反元件的那一组绕组中的电流更大,电动机发生异常响声并剧烈振。如果不及时断电停机,电动转速下降,机定子绕组很快会被烧毁。为避免造成更大的损失,需要及时检出。   现有的检测方法在实际应用中,往往在生产应用中需要拆除电机,或者等到电机产生故障时才能够发现绕组错误。检测方法主要是在电机出现故障后,将电机定子取出,接入直流电源后,使用磁针来判断是
[电源管理]
基于<font color='red'>stm32</font>的异步电机反嵌绕组检测方法
STM32-正弦波可调(50HZ~20KHZ可调、峰峰值0~3.3V可调)
1.原理: 通过定时器每隔一段时间触发一次DAC转换,然后通过DMA发送正玄波码表值给DAC. 当需要改变频率HZ时,只需要修改定时器频率即可(最高只能达到20KHz) 当需要改变正玄波的正峰峰值/负峰峰值时,只需要修改正玄波码表即可 2.实现 代码如下所示(采用的是定时器2,DAC引脚是PA4) #define HZ(x) (u16)(72000000/sizeof(Sine12bit)*2/x) //计算Hz #define DAC_DHR12R1 0x40007408 //外设DAC通道1的基地址 u16 Sine12bit = { //正弦波描点 2048, 2098, 2148, 2
[单片机]
STM32-正弦波可调(50HZ~20KHZ可调、峰峰值0~3.3V可调)
基于STM32-按键输入与八种IO口模式
按键检测使用到 GPIO 外设的基本输入功能, 按键机械触点断开、闭合时,由于触点的弹性作用,按键开关不会马上稳定接通或一下子断开,使用按键时会产生图 中的带波纹信号,需要用软件消抖处理滤波,不方便输入检测。 这里再讲下八种IO口模式: 1.模拟输入 我认为模拟输入最重要的一点就是。他不经过输入数据寄存器,所以我们无法通过读取输入数据寄存器来获取模拟输入的值,我认为这一点也是非常好理解的,由于输入数据寄存器中存放的不是0就是1。而模拟输入信号不符合这一要求,所以自然不能放进输入数据寄存器。该输入模式,使我们能够获得外部的模拟信号。 2.浮空输入 该输入状态。我的理解是。它的输入全然由外部决定,我认为在数据通信
[单片机]
基于STM32-按键输入与八种IO口模式
【菜鸟入门】stm32 之 实时时钟
经过这么10天的瞎搞,我的库已经初具规模了,于是,不用每次都把所有的文件copy过去,直接在Option里面把path给加上就ok了。 RTC的时钟配置,RTC的时间寄存器是2个32位的寄存器,无非就是一个计数器,大概可以这样理解吧,我们先看看时钟吧 RTC的时钟可以从这3路来,我们需要PTCSEL寄存器来进行设置, 上面这个图是摘自李想老师的课件里面的,我觉得这个是做的相对好的! 位了保证RTC正常工作,我们需要在系统断电时,RTC不受影响,当然我们一般都需要接一个Battery,作为rtc的后备电源,这里设计到电源管理,我们先来看看电源管理里面关于rtc的 只要我们把第八位置1我们就可以对其进行正常供电,我
[单片机]
【菜鸟入门】<font color='red'>stm32</font> 之 实时时钟
外观、配置抢眼 锤子全面屏新机确认:坚果3
    错过了3月的新机高发月,锤子将带来什么惊喜呢?   此前,锤子科技已经宣布,将于4月9日14:30在北京工业大学奥林匹克体育馆举行2018春季新品发布会。经过多番猜测,锤子科技官方终于确认了此次发布会的主角——坚果3。   今日,锤子科技官微预告称,即日起至4月9日14:30,前往锤子科技官方商城或JD官方旗舰店设置春季新品坚果3的开售提醒,即可在开售后第一时间收到短信提醒,并参与抽奖,有机会赢坚果3等惊喜礼品。   此前,一款型号为OC105的新机已经通过工信部入网许可,签发日期是2018年2月27日,从时间点来判断,应该就是坚果3了。   据此前爆料,坚果3将采用目前主流的18:9全面屏设计,外观设计风格类似小米M
[手机便携]
STM32入门-时钟篇
STM32中使用任何一个外设都必须打开相应的时钟。在STM32中有5个时钟源可供用户选择: 1.HSI高速内部时钟,RC震荡器,频率为8MHz。 2.HSE高速外部时钟,右英/陶瓷谐振器,或着外部时钟源,4MHz-16MHz. 3.LSI内部低速时钟,RC震荡器频率为40Hz。 4.LSE外部低速时钟,接频率为32.768KHz的石英晶体。 5.PLL锁相环频输出,时钟源可选为HIS/2、HSE或HSE/2。倍频可选2-16倍,但其输出频率最大不能超过72MHz。 系统时钟SYSCLK,它是供STM32中绝大部分器件工作的时钟源,系统时钟可选择为PLL输出、HSI或者HSE。系统时钟的做大频率为72MHz,它通过AHB分频器分频后
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved