
六、独立看门狗1. IWDG简介独立看门狗Independent Watchdog通常缩写为IWDG主要作用是主要用于检测外界电磁干扰或硬件异常导致的程序跑飞问题。IWDG本质上是一个12位的递减计数器。当计数器的值从某个初始值开始递减并一直减到0时系统会产生一个复位信号IWDG_RESET。CPU在接收到这个复位信号后会重新启动系统以确保系统从可能的错误或死锁状态中恢复(不是100%)。在计数器的值减到0之前如果程序通过特定的“喂狗”操作即重置计数器的值来刷新计数器那么就不会产生复位信号系统将继续正常运行。这种“喂狗”操作通常是由程序在正常运行时定期执行的以确保IWDG不会因计数器超时而产生复位信号。它使用专用的低速内部时钟LSI作为时钟源即使在主时钟发生故障时IWDG仍然能够继续运行。 IWDG可以在停止模式和待机模式下工作确保在这些模式下系统仍然受到保护。2. IWDG工作原理及框图3. IWDG寄存器及函数介绍在中文参考手册中有独立看门狗寄存器的介绍317页。首先键寄存器32位但只有低16位有效。0xAAAA就是说的“喂狗”。0x5555表示允许访问预分频和重装载寄存器否则就只是只读的状态。0xCCCC启动看门狗一旦启动就停不下来。那么为什么不是普通的设置0和1而是这么复杂奇葩的数字呢?你要想如果我们要用到看门狗一定代表说这个环境没有那么安全可能因为外界因素比如说磁场的干扰导致我们的内存改变。如果说单纯用0/1去控制很容易被影响则会发生一些错误。使用上述那种数字就不会随便的受到影响。在通用定时器中就是PSC仅仅低三位有效。重装载寄存器设置看门狗从多少数往下去递减。低十二位有效。状态寄存器只有低二位有效。RVU是管重装载计时器的更新PVU是预分频值的更新。库函数的话呢仅仅只有两个。首先看init函数中都做了些什么。首先是start这个宏函数F12进去发现实际操作的是KR这个寄存器key_enable就是0xCCCC。接下来就是使能ENABLE_WRITE_ACCESS,F12。之后就是将预分频系数和重装载值赋值到PR和RLR寄存器当中。之后while部分sr就是状态寄存器的部分。最后就是 __HAL_IWDG_RELOAD_COUNTER(hiwdg);喂狗。之后看一下refresh这个函数的作用。也是一个喂狗的操作。4. IWDG溢出时间计算rlr1一共要数多少个数psc/flWDG记一个数花多久时间。Tout看门狗溢出时间fIWDG看门狗的时钟源频率 30KHZ----60KHZ。一般40KHZ进行计算。psc看门狗预分频系数rlr看门狗重装载值看表第一个4预分频为例4/40K0.1ms1/1M1us最长时间就是0xFFF4096*0.1。0xFFF十六进制f15,1515*1615*16*164095。5. IWDG配置步骤小实验独立看门狗喂狗实验硬件清单上官二号ST-LinkUSB转TTL实验目的配置IWDG溢出时间为1秒左右并验证未及时喂狗时系统将被复位。在这之前根据1s的溢出时间去确定pscPR和rlr到底是多少。首先看最长时间首要的就是最长时间得超过一秒要么就没有什么意义了从表中能够看出16分频往后都是可以的。这里我们选择32分频根据公式的计算可以得出rlr1250。老规矩 “品”魔法棒头文件。开门狗的驱动也要加进来。·#include iwdg.h编译 .h后。根据配置步骤开始编写.c中的内容。这两个函数不要忘了在.h中声明一下。Init.Prescaler成员变量 选32分频。如果超时复位的话 那么我们怎么判断是看门狗复位的呢手册上我们可以看到有如下几个复位。这些复位都标注在这个寄存器中的高级位中。如果是独立开门狗的复位的话就是第29位置1。七、窗口看门狗1. WWDG简介窗口看门狗用于监测单片机程序运行时效是否精准主要检测软件异常一般用于需要精准检测程序运行时间的场合。窗口看门狗的本质是一个能产生系统复位信号和提前唤醒中断的6位计数器。产生复位条件当递减计数器值从0x40减到0x3F时复位即T6位跳变到0当递减计数器在窗口期外被重新装载(若看门狗被启动)则产生复位。产生中断条件当递减计数器等于0x40时可产生提前唤醒中断(EWI)。在窗口期内重装载计数器的值防止复位也就是所谓的喂狗。2. WWDG工作原理及框图T[6:0]最大可设置为1272的7次方T0-T6为一位置1。窗口上限值在这一段可以任意的设置但不要太靠边导致窗口的值太短了喂狗会更加的严苛。计数到0x40会提前唤醒中断可以做一些保存数据的操作在重启之前赶紧把数据保存起来以至于不会因为重启而导致数据的丢失。/4096为第一个固定的分频器在原本图中没有显示。之后再经过一个分频器再给我们的计数器进行使用计数器适合WWDG_CR状态寄存器是一起的。T0----T6共有七位那为什么说是一个6位的呢因为起作用的只有0-5T6可以理解为是一个状态为正常来讲T6就等于1。当七位为100 0000时这是一个关键点对应的十六进制就是0x40再减1的话就是0x3F对应0111111所以说T6这一位从1变到0他就产生一个复位。看下图WDGA是一个使能位狗工作就置1当T6变为0时经过或非门输出为1就与之前的WDGA的1共同进入与门达成复位条件1。如果在窗口期外喂狗那就是WWDG_CR置1同时呢进行一个比较。喂狗的时间窗口上限值。之后经过与门或门就达成了复位条件2。3. WWDG寄存器及函数介绍要开门狗工作的话WDGA激活位就需要置1。EWI确定0x40时是否发生中断。WDGTB预分频器。为2的几次方。00就是2的0次1 11就是2的3次8。接下来看一下库函数。首先看init函数HAL_StatusTypeDef HAL_WWDG_Init(WWDG_HandleTypeDef *hwwdg)4. WWDG溢出时间计算PCLK-36M。TPCLK1/36M4096*2WDGTB*1/36M记一个数要花多长时间T[5:0]1总共要记多少个数。其中最大超时数和最小超时数只计一个数之间的倍数关系是64倍的关系。T[6:0]最高为127每一位都置1最小的数0x3F十进制为63最多计127-6364个数。5. WWDG配置步骤小实验窗口看门狗喂狗实验实验目的开启窗口看门狗计数器值设置为0X7F窗口值设置为0X5F预分频系数为8。在while循环里喂狗同时翻转 LED1状态在提前唤醒中断服务函数进行喂狗同时翻转LED2状态。硬件清单上官二号ST-LinkUSB转TTL根据公式计算一下溢出时间是多少。首先计算一下从开始计数到窗口值经过计多少数0X7F--0X5F 127-95-1132个数。根据公式一算就是29.13ms如果是记到0x3F也就是64个数基本就是32个数的2倍。58.26ms左右。老规矩 “品”魔法棒头文件。开门狗的驱动也要加进来。·#include wwdg.h编译根据步骤流程。开始.c文件的编写。这里延时在50ms超过了28.13ms即喂狗是在窗口期内则不产生复位。如果改成10ms小于28.13则喂狗是在窗口期外则一直产生复位。独立看门狗与窗口看门狗的区别