0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32单片机两种看门狗的区别和配置方法

Q4MP_gh_c472c21 来源:玩转嵌入式 作者:玩转嵌入式 2020-10-10 11:27 次阅读

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

STM32独立看门狗 由专门的低速时钟(LSI)驱动,即便是主时钟发生故障它仍能够有效,所以此狗狗可以工作在与主时钟无关的要求下,或者待机模块下等,所以它叫独立看门狗,注意一旦开启此看门狗则只能由MCU复位后才清除,让它不再工作。 它的时钟是一个内部RC时钟,它会在30KHZ到60KHZ之间变化,并非是精确的40KHZ,而只是一般计算时取40KHZ。 独立看门狗需设置四个寄存器如下:

其中,预分频寄存器(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) voidIWDG_Init(u8prer,u16rlr) { IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); IWDG_SetPrescaler(prer); IWDG_SetReload(rlr); IWDG_ReloadCounter(); IWDG_Enable(); }

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

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

看似简单,但设置及应用起来有不少玄机。 控制寄存器(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)预分频数。 以上描述可参考下图以更清晰的理解:

窗口看门狗应用时还要注意算准最小与最大喂狗时间,以便正确地喂狗,如下:

在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可知道系统因异常复位的某此状态,以使系统有更高稳定性。 并且我觉得在窗口看门狗中断函数中喂狗没有什么意义,程序本来已经不按正常运行了,还在中断函数中喂狗防止复位只会错上加错,不好好利用它干点正事, 更是浪费资源。 这点上我个人认为不要被点原子示例代码误导哦,但其还是有部分借鉴意义的,以下为初始化相关代码:

//窗口看门狗中断服务设置程序 voidWWDG_NVIC_Init() { NVIC_InitTypeDefNVIC_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计数器的设置值,默认为最大. u8WWDG_CNT=0x7f;//初始化窗口看门狗 //tr:T[6:0],计数器值 //wr:W[6:0],窗口值 //fprer:分频系数(WDGTB),仅最低2位有效 //Fwwdg=PCLK1/(4096*2^fprer). voidWWDG_Init(u8tr,u8wr,u32fprer) { 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(); 函数相关代码

#defineCFR_EWI_BB(PERIPH_BB_BASE+(CFR_OFFSET*32)+(EWI_BitNumber*4))

用到位带操作,具体理解可参照《Cortex-M3权威指南》第五章的位带操作相关介绍(具体89页)。

责任编辑:YYX

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6001

    文章

    43970

    浏览量

    620793
  • 看门狗
    +关注

    关注

    10

    文章

    540

    浏览量

    70253
  • 寄存器
    +关注

    关注

    30

    文章

    5027

    浏览量

    117711
  • STM32
    +关注

    关注

    2239

    文章

    10671

    浏览量

    348725

原文标题:STM32单片机:独立看门狗、窗口看门狗的配置

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    单片机STM32F107独立看门狗单片机不断复位

    目前有一问题,一直受困,请大家帮帮忙!使用单片机STM32F107,目前使用功能独立看门狗,串口,问题如下1. 有独立看门狗时,正常运行下,串口可以发送数据,但是
    发表于 03-18 08:03

    STM32F0xx_看门狗(独立+窗口)配置详细过程 精选资料推荐

    Ⅰ、概述对于看门狗,我觉得做单片机或者嵌入式开发的人员来说并不陌生,今天总结STM32F0看门狗的功能,F0的看门狗
    发表于 07-22 09:10

    STM32窗口看门狗和独立看门狗区别看门狗介绍及代码演示 精选资料分享

    一、介绍:STM32看门狗分为独立看门狗和窗口看门狗两种,其者使用调条件如下所示,IWDG和W
    发表于 07-22 06:41

    单片机看门狗工作原理

    单片机看门狗工作原理,目的看门狗又叫watchdog timer 是一计时器,为了防止单片机程序跑飞。原理
    发表于 07-22 07:52

    stm32看门狗的定义是什么

    的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一专门用于监测单片机程序运行状态的模块或者芯片,俗称看门狗”(watchdog) 。二、分类
    发表于 07-30 06:08

    为什么要看门狗

    为什么要看门狗:单片机的工作常常会受到来自外界磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常允许被打断。会造成整个系统的停滞状态。处于对单片机运行状态进行实时监测的考虑,用一
    发表于 07-30 07:02

    看门狗是什么 看门狗的功能

    STM32的独立看门狗概述看门狗是什么看门狗的功能独立看门狗所需的环境独立看门狗工作原理
    发表于 07-30 08:07

    看门狗是什么 看门狗分哪几类

    单片机自身运行状态的东西,看看程序是不是正常跑完。这个东西就叫看门狗看门狗类:独立看门狗和窗口看门
    发表于 08-02 09:20

    STM32Lx在低功耗下使用软件看门狗 精选资料分享

    看门狗对于防止程序跑死是很关键的,很多时候我们的产品需要进入低功耗,而且唤醒间隔也比较长,此时如果看门狗启动了,那么就会导致处在低功耗的MCU发生复位。解决这个问题的方法两种:一
    发表于 08-02 07:24

    STM32 HAL库 看门狗 精选资料分享

    STM32之CubeL4独立看门狗文章目录STM32之CubeL4独立看门狗看门狗简介二STM32
    发表于 08-02 06:08

    stm32——独立看门狗 精选资料分享

    出于对单片机运行状态进行实时监测的考虑,便产生了一专门用于监测单片机程序运行状态的模块或者芯片,俗称“看门狗”(watchdog) 。STM32
    发表于 08-02 08:00

    【转载】STM32窗口看门狗和独立看门狗区别看门狗介绍及代码演示 精选资料推荐

    找到一个看门狗的详细介绍,特此记录。一,介绍STM32看门狗分为独立看门狗和窗口看门狗两种,其
    发表于 08-02 09:29

    看门狗解决的问题是什么

    单片机运行状态进行实时监测的考虑,便产生了一专门的用于检测单片机程序运行状态的模块或者芯片,俗称“看门狗(watchdog)”。看门狗
    发表于 08-02 07:10

    如何为STM32单片机配备独立看门狗

    如何为STM32单片机配备独立看门狗?如何为STM8单片机配备独立看门狗
    发表于 09-18 06:50

    STM32单片机看门狗配置方法

    SATM32单片机看门狗有独立看门狗和窗口看门狗之分,这两者的工作原理却完全不同,今天来看一下他们的具体区别
    的头像 发表于 06-22 09:07 2092次阅读
    <b class='flag-5'>STM32</b><b class='flag-5'>单片机</b><b class='flag-5'>看门狗</b>的<b class='flag-5'>配置</b><b class='flag-5'>方法</b>