8.关于看门狗

  关于看门狗啊,这个东西之前挺不常用的,因为这些东西都是一些防御型的外设什么的,平时没事谁会用
他们啊,刚开始肯定都会认为自己写的代码无懈可击,也不算是吧,反正就是绝大多数下都不会出什么问题
但是真等到出什么问题了,基本上你离换工作也就不远了,听说欧美人写代码,和我们不同,他们总是
比较喜欢写一些防御性很强的代码,万一系统出什么事情了,好歹有对应的异常处理或者是复位处理等等
我们也应该多学学别人编程的思维,其实吧,编程不仅仅是学一些技巧而已,道欧米按你越来越会发现,
一个好的习惯和一个好的编程的思维模式更有助于你的发展
  好了,话不扯远,就从看门狗开始吧,这个名字很形象啊,当初第一眼看到他的时候,觉得看门狗是什么玩意儿 
怎么还有两个?独立看门狗和窗户看门狗,好奇怪啊,直到现在才发现,这东西蛮简单的,就是一个小的定时器 ,
然后首先设定值,然后如果到时间了如果没有喂狗就会产生复位,就这么简单。其他就都是一些寄存器的设置了,
至于独立看门狗和窗户看门狗就只有一些简单的差别而已。下面详细介绍一下。

/****************************************************************************************************/

1.独立看门狗 IWDG
  下面是官方手册上对于看门狗的介绍,

/****************************************************************************************************/

此器件具有两个嵌入式看门狗外设,具有安全性高、定时准确及使用灵活的优点。两个看门
狗外设(独立和窗口)均可用于检测并解决由软件错误导致的故障;当计数器达到给定的超
时值时,触发一个中断(仅适用于窗口型看门狗)或产生系统复位。
独立看门狗 (IWDG) 由其专用低速时钟 (LSI) 驱动,因此即便在主时钟发生故障时仍然保持
工作状态。窗口看门狗 (WWDG) 时钟由 APB1 时钟经预分频后提供,通过可配置的时间窗
口来检测应用程序非正常的过迟或过早的操作。
IWDG 最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时
间精度要求较低的场合。 WWDG 最适合那些要求看门狗在精确计时窗口起作用的应用程序。

/****************************************************************************************************/
  首先就是时钟啦,独立看门狗的时钟来自于LSI的,LSI和LSE都是可以为RTC供电的,但是HSI还有个专门的功能
  就是为独立看门狗供电,这样就算是当HSE挂掉了,看门狗也能跟正常独立运转,首先就是时钟上不依赖于别人,
  很独立,然后就是应用范围啦,当然啦,时钟来自于LSI,首先我们可以考虑到精度肯定不会很高啊,我们可以大胆
  推断IWDG应用于对时间要求精度较低的场合,然后这基本就是看门狗的特性了,然后再需要注意的,就是该怎样配置
  寄存器了,这个很简单的,看一眼基本就会了,没难度的。
  然后呢,就是对IWDG的功能做一个详细的说明,就是说任何时候启动独立看门狗时,看门狗会从0XFFF开始向下计数,
  直到减到0X000的时候会产生复位,那么怎样才能避免复位呢?我们下需要不断给看门狗赋值,俗称喂狗,就是说
  只要不断喂狗,看门狗就不会复位,就会正常跑运行的程序,但是如果程序出了问题,超过了最大喂狗的时间,那么
  程序就会复位啊,注意这还有一点就是这个时间的设置,所以说喽,这个时间是需要自己来设置的,前面说过IWDG
  应用于对时间要求不高的场合,那么我们考虑一下,这个对时间要求不高到底是什么意思呢?其实就是这个最大的
  时间的设置,你大概估算一下从程序开始执行看门狗到你需要设定喂狗的地方大致需要多少时间,然后设置一下
  相对长一点的时间,如果在该时间内,程序没有执行到该处,也就是说在这个最大时间内没有喂狗,那么从就会
  触发看门狗,就会产生复位,然后程序就会重新开始执行,是吧,这样就起到了减少了程序出现错误的可能性,
  这也是我们所想要的,看门狗也确实发挥了它的作用,是吧!

  下面简单介绍一下看门狗的具体实现
  重点是有一个需要注意的地方,就是关于寄存器有一个访问保护,就是说首先对就餐器写入一定的值后才能取消访问保护
  然后才可以进行相应的寄存器设置
  重点就三个寄存器
  KR   关键字寄存器
  PR   预分频寄存器
  RLR  重载寄存器

  KR : 必须每隔一段时间便通过软件对这些位写入键值 AAAAh,否则当计数器计数到 0 时,看门狗会产生复位。
       写入键值 5555h 可使能对 IWDG_PR 和 IWDG_RLR 寄存器的访问
       写入键值 CCCCh 可启动看门狗
  PR : 就是通过设定分频从而设置时间,还有ST官方手册里面有个表,可以查你大概需要多少时间,然后设置就OK
  RLR :就是说每次喂狗后需要不是需要赋值吗?这个值就来自于这里,reload重装载值然后从装载的值然后向下计数
       直到下一次喂狗
  很简单吧!差不多就是这些,没什么需要注意的,简单又好用的独立看门狗,相比较于窗户看门狗,简直爽到爆
  但是吧,其实我觉得这两个东西是各自针对于不同的情况下,独立看门狗最长差不多可以超时30S左右,可供选择的
  范围很大,且独立看门狗主要应用于对时间要求不是很严格情况,而窗户看门狗呢?主要应用于对时间要求较为严格
  情况,然后最长超时差不多60MS左右,是吧两个一对比,简直就是各司其职,好吧,其实主要是现在没用的上
  窗户看门狗,是的,独立看门狗偶尔还能用下,重点是对时间要求不是很严格,这才是重点。
  下面简单谈下窗户看门狗

/****************************************************************************************************/

2.窗户看门狗 WWDG
  老规矩,先看手册说明

/****************************************************************************************************/

窗口看门狗通常被用来监测,由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的
运行序列而产生的软件故障。除非递减计数器的值在 T6 位变成 0 前被刷新,看门狗电路在
达到预置的时间周期时,会产生一个 MCU 复位。如果在递减计数器达到窗口寄存器值之前
刷新控制寄存器中的 7 位递减计数器值,也会产生 MCU 复位。这意味着必须在限定的时间
窗口内刷新计数器。

/****************************************************************************************************/

  懂了上面那个,这个也很好懂了,因为都是一个小的定时器,就无非限制的条件不一样而已,下面简单谈下这个
  和IWDG的不同之处。这个窗户看门狗差不多稍微复杂一点,从名字上我们就可以看出,什么是窗户看门狗呢?
  就是上下都有个限制呗,但是吧,独立看门狗是不是只有一个下限?而且这是下限是0,我们只要在0之前赋值
  独立看门狗就不会复位,但是窗户看门狗不一样啊,首先有个上限,然后有个下限,这个下限还不是0,你得在
  这个上限和下限的时间内喂狗才能避免窗户看门狗被重新复位,也就是说,如果你在上限之前和下限之后赋值
  那么就会产生复位,这个对时间的要求就很严格了,没办法,窗户看门狗本来就是起的这样的作用,所以由前面
  讲的我们可以推断到窗户看门狗的时钟来源于并不是LSI,因为太不精准了,不符合我们窗户看门狗对时间要求
  严格的要求,首先窗户看门狗是一个外设,那么这个就很好猜了,不是APB1就是APB2,然后去看下RCC寄存器,很明显
  WWDG挂在APB1上,这个时钟来源是HSE,高速外部时钟,够精准吧?解决了时钟的问题然后再讲一下WWDG和IWDG
  另一个很明显的区别是在WWDG多了一个中断,这个就很高级了有木有?这个中断称为EWI 提前唤醒中断 这个中断
  有用,因为窗户看门狗对时间要求而特别严格喽,而且他的下限也不是零,所以你无法准确的确定在这个下限之前喂狗
  但是你又不喂狗吧,肯定会自动复位,所以就产生了中断,窗户看门狗下限是0X3F,但是在0X40是有个中断的
  也就是活,只要你使能中断,那么当计数器减到0X40是会自动进入中断,这就很方便了,是这样的,然后你只需要
  在中断里面喂狗就行了,然后只需要确定上限,只要不在上限之前喂狗或者是跑飞,基本上就OK。大致是这样
  但是吧,窗户看门狗还有个缺点,在我看来就是超时太短,最长只有几十MS,导致让我用的很不爽,这个再谈。
  窗户看门狗和独立看门狗的不同差不多都介绍完了,没什么好说的,接下来看下寄存器
  寄存器也蛮简单的,重点就三个寄存器
  1.CR    控制寄存器
  2.CFR   配置寄存器
  3.SR    状态寄存器

  CR  直接看寄存器说明,其实也没什么好说的,只有一个看门狗使能位和7位的计数器T[6:0]
      下面引自原话

/****************************************************************************************************/

      如果激活看门狗(WWDG_CR 寄存器中的 WDGA 位置 1),则当 7 位递减计数器(T[6:0]
      位)从 0x40 滚动到 0x3F(从 100 0000->011 1111 也就是从0x40 到 0x3f)时会引发复位。
      当计数器值大于窗口寄存器中所存 储的值时,如果软件重载计数器,则会产生复位。
      应用程序在正常运行过程中必须定期地写入 WWDG_CR 寄存器以防止 MCU 发生复位。只
      有当计数器值低于窗口寄存器值时,才能执行此操作。存储在 WWDG_CR 寄存器中的值必
      须介于 0xFF 和 0xC0 之间:
      写入 WWDG_CR 寄存器时,始终将 1 写入 T6 位,以避免生成立即复位。

/****************************************************************************************************/

     应该能看得懂的,算是比较简单的了,说白了CR寄存器就这几个功能
     1.使能看门狗
     2.每次喂狗的值要写入T[6:0]
     3.写入T寄存器的值介于0xFF 和 0xC0 之间
     4.低于0x40会复位,在窗口之前喂狗也会复位

  CFR 主要是一个EWI 唤醒中断使能位和一个分频器,就是这个超时时间了,不过不能设置太长时间,然后剩下
      W[6:0] 窗口值,就是上限那个值,很清晰明了的,没什么好讲的
  SR  就一个检查中断是否是能了的标志位,


  这个窗户看门狗也差不多介绍完了,其实这两个看门狗都一样的,只不过独立看门狗是下限,然后操作寄存器
  的时候需要先写入KEY然后才能操作,那窗户看门狗说是上限和下限但是如果你开了EWI的话,就相当于只有
  上限了,因为下限会产生中断,每次中断只需要喂狗就行了,确保喂狗的值大于0x40就OK,然后如果你再设置
  窗户上限比T[]值大1,然后我就觉得这也太无聊了,上下限基本上算是都已经确定了的,设置跟不设置还有什么
  两样,白用这个功能了,如果真要说是有一点什么功能的话,那么唯一就是却跑程序不会跑飞,如果程序跑飞
  的话,就会进不去中断,不能喂狗,就会执行复位,反正我觉得这算是ATK Demo中使用WWDG最大的用处了吧
  好吧,差不多这个看门狗到此为止!!!
  再会!!!  
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值