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

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

    关注

    6035

    文章

    44553

    浏览量

    634760
  • 看门狗
    +关注

    关注

    10

    文章

    560

    浏览量

    70792
  • 寄存器
    +关注

    关注

    31

    文章

    5336

    浏览量

    120259
  • STM32
    +关注

    关注

    2270

    文章

    10896

    浏览量

    355777

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

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

收藏 人收藏

    评论

    相关推荐

    什么是模拟看门狗?模拟看门狗有什么用处?

    看门狗大家应该再熟悉不过了,一旦忘记喂狗就会导致单片机复位,而在大部分stm32中都存在两种类型的看门狗,Independent watch
    的头像 发表于 11-22 09:40 1772次阅读
    什么是模拟<b class='flag-5'>看门狗</b>?模拟<b class='flag-5'>看门狗</b>有什么用处?

    单片机应用中看门狗威廉希尔官方网站

    分析研究了单片机应用系统中软件看门狗、单双时限和强制复位 看门狗 等几种常见的看门狗威廉希尔官方网站 及具体的实现方法, 从提高
    发表于 06-03 16:49 318次下载
    <b class='flag-5'>单片机</b>应用中<b class='flag-5'>看门狗</b>威廉希尔官方网站

    什么是stm32看门狗?独立看门狗和窗口看门狗工作原理解析

    stm32看门狗,独立看门狗和窗口看门狗,其实者的功能是类似的,只是喂狗的限制时间不同。
    的头像 发表于 11-06 11:48 2.7w次阅读
    什么是<b class='flag-5'>stm32</b><b class='flag-5'>看门狗</b>?独立<b class='flag-5'>看门狗</b>和窗口<b class='flag-5'>看门狗</b>工作原理解析

    STM32看门狗配置(独立看门狗IWDG和窗口看门狗WWDG)

    stm32自带看门狗模块,独立看门狗IWDG和窗口看门狗WWDG。看门狗主要作用是可用来检测
    发表于 11-09 17:17 8438次阅读
    <b class='flag-5'>STM32</b><b class='flag-5'>看门狗</b><b class='flag-5'>配置</b>(独立<b class='flag-5'>看门狗</b>IWDG和窗口<b class='flag-5'>看门狗</b>WWDG)

    STM32看门狗配置详情解说

     stm32看门狗,独立看门狗和窗口看门狗,其实者的功能是类似的,只是喂狗的限制时间不同
    发表于 11-13 11:17 4454次阅读
    <b class='flag-5'>STM32</b>的<b class='flag-5'>看门狗</b><b class='flag-5'>配置</b>详情解说

    PIC单片机看门狗_看门狗定时器工作原理

    PIC系列不同型号的单片机其,看门狗设置不同,下面是以PIC16F688单片机为例。如果配置字中的WDTE=1那么后面的看门狗开关(WDT
    发表于 05-18 01:59 8049次阅读
    PIC<b class='flag-5'>单片机</b>之<b class='flag-5'>看门狗</b>_<b class='flag-5'>看门狗</b>定时器工作原理

    基于STM32、FreeRTOS 实现硬件看门狗+软件看门狗监测多任务的方法

    基于STM32、FreeRTOS实现硬件看门狗+软件看门狗监测多任务的方法
    的头像 发表于 03-12 10:11 9383次阅读

    单片机看门狗两种:分别为独立看门狗和窗口看门狗,它们有什么区别?资料下载

    电子发烧友网为你提供单片机看门狗两种:分别为独立看门狗和窗口看门狗,它们有什么区别?资料下载的
    发表于 04-18 08:41 2次下载
    <b class='flag-5'>单片机</b><b class='flag-5'>看门狗</b>有<b class='flag-5'>两种</b>:分别为独立<b class='flag-5'>看门狗</b>和窗口<b class='flag-5'>看门狗</b>,它们有什么<b class='flag-5'>区别</b>?资料下载

    STM32L4单片机配置STOP模式下停止看门狗计数

    STM32L4系列的单片机,在stop模式或是standby模式下可以停止看门狗计数器,唤醒后,看门狗继续计数。这样,在单片机休眠期间,就可
    发表于 11-19 10:51 48次下载
    <b class='flag-5'>STM32</b>L4<b class='flag-5'>单片机</b><b class='flag-5'>配置</b>STOP模式下停止<b class='flag-5'>看门狗</b>计数

    STC单片机看门狗

    STC单片机看门狗设时钟为11.0592MHz看门狗溢出时间 = (12 Prescale32768)/11059200 = Prescale*393216/11059200也可以在下载程序里设置
    发表于 12-23 19:22 10次下载
    STC<b class='flag-5'>单片机</b><b class='flag-5'>看门狗</b>

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

    STM32单片机看门狗有独立看门狗和窗口看门狗之分,这者的工作原理却完全不同。
    发表于 02-08 16:15 18次下载
    <b class='flag-5'>STM32</b>:独立<b class='flag-5'>看门狗</b>、窗口<b class='flag-5'>看门狗</b>的<b class='flag-5'>配置</b>

    基于STM32单片机窗口看门狗使用库文件设计

    基于STM32单片机窗口看门狗使用库文件设计源代码
    发表于 04-26 14:46 0次下载

    基于STM32单片机独立看门狗实验使用库文件设计

    基于STM32单片机独立看门狗实验使用库文件设计源代码
    发表于 04-26 14:43 0次下载

    独立看门狗的一点经验

    stm32基本都内置两种看门狗(另外还有外置的看门狗芯片),窗口看门狗和独立看门狗
    的头像 发表于 05-24 16:00 1135次阅读
    独立<b class='flag-5'>看门狗</b>的一点经验

    STM32单片机看门狗配置方法

    SATM32单片机看门狗有独立看门狗和窗口看门狗之分,这者的工作原理却完全不同,今天来看一下他们的具体
    的头像 发表于 06-22 09:07 2859次阅读
    <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>