STM32 WDG看门狗

在这里插入图片描述
在大型项目中,BUG根本无法避免,因为可能的状态太多了,总有那么意想不到的情况发生,
所以,对于程序员,第一要要丰富的经验,避免一些常见的bug,
第二,程序要经常迭代,发现bug,及时修补,
第三,使用看门狗,产生卡死崩溃现象后,帮我们复位
虽然不能解决bug本身,但是可以极大地提高程序地健壮性,很多bug都是偶然发生的,简单复位一下,就会有很大概率让程序走向正轨,

看门狗的结构和定时器非常相似,只不过定时器溢出,产生中断,看门狗定时器溢出,直接产生复位信号。然后喂狗,其实也是重置这个计数器,

独立看门狗只有一个最晚时间期限,喂狗时间只要不超过这个最晚界限就可以了,

窗口看门狗:喂狗有最早和最晚的期限,有对它喂狗的时间窗口可以卡的很死,快了慢了都不行,串口看门狗使用的是APB1的时钟,它没有专用的时钟,所以不算是独立

在这里插入图片描述
PR和PSC是一个意思,都是Prescaler的缩写。,因为可能不是一个人写的,所以有点区别,
IWDG_RLR 和定时器的ARR是一样的,
RLR是Reloader,ARR是Auto Reloader,

上面加黑的位于1.8V供电区,下面位于VDD供电区,

在这里插入图片描述
独立看门狗工作的环境是什么?
是程序可能跑飞,可能收到电磁干扰,程序做出任何操作都是有可能的,只设置一个位就有可能误操作,变成1或者变成0的概率比较大

在这里插入图片描述
在这里插入图片描述
这个像是一个密码,瞎试一般试不出来,
只有在键寄存器写入5555,才能解除写保护,这样PR,RLR,就跟随键寄存器一起,

独立看门狗的内容:包括硬件电路如何工作,键寄存器如何控制电路运行,和如何写入PR和RL寄存器,来确定超时时间,

窗口看门狗功能和独立看门狗比较像,只是比独立看门狗多了个最早喂狗时间的限制,
但是学的时候会发现,无论是框图设计,还是寄存器的分布和命名规则,或是程序的操作流程,和独立看门狗不一样,可能是两个看门狗侧重点不一样,可能也是因为这时两个外设。

左下角是时钟源部分PCLK1,右下角是预分频器WDGTB,实际上和独立看门狗的PR,定时器的PSC一个意思。
上面是6位递减计数器CNT,这个计时器位于控制寄存器CR里,计数器和控制寄存器合二为一了。窗口看门狗没有重装寄存器,那如何喂狗呢,直接在CNT写入数据就行了,再上一块是窗口值,也就是喂狗的最早时间界限,
左边是输出信号的操作逻辑了,

T6-T0是7个位,但是下面写的是6位递减计数器,这是因为计数器只有T5-T0,这6位是有效的计数值,最高位T6当作溢出标志位,T6=1时,表示没溢出,等于0时表示溢出,不过对于硬件电路来说,T6其实也是计数器的一部分,只不过当成单独出来当作标志位。

WDGA是窗口看门狗的激活位,也就是使能,写入1,启用窗口看门狗,使能位与这个与门,很多控制里都有。与信号相与,
下面那一路的意思是T6一旦等于0,就表示计数器溢出,就产生复位信号,必须保证T6=1才能避免复位。
至此,下面这一大块和独立看门狗基本是一样的,6位计时器减到0后,就产生复位。
首先需要计算一个最早界限的计数值。写入到W6-W 0中,这些值,写入之后是固定不变的,之后这里,一旦我们执行写入CR操作时,这个与门开关就会打开,写入CR就是写入寄存器,也就是喂狗,在喂狗时,比较器开始工作,当计数器T6:0>窗口值W6:0,比较结果就等于1,通过或门,也可以申请复位,这就是喂狗最早时间窗口的实现流程。把当前计数值和预设的窗口值进行比较,如果发现狗的余粮还非常充足,那喂的频繁就会有问题,就给你复位一下,不让你喂太早了,

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

早期唤醒中断可以执行一些紧急操作,比如保存重要数据,关闭危险设备等等,就是虽然超时喂狗了,但是我可以在中断里执行一些代码进行解决,或者这个任务不是很危险,超时了只想做一些提示,不想让它复位了,这样就可以在早期的中断里,直接执行喂狗,阻止系统复位,然后提示一些信息就完事了。
定期写入CR寄存器,进行喂狗,避免WWDG复位。

当想要功能时简单的,程序卡死或跑飞了,帮忙复位一下就行,用独立看门狗,有更高需求就用窗口看门狗,

手册需要细看

第一步:开启时钟LSI,开启LSI的时钟并不需要我们来写,由硬件选项或软件启动,LSI振荡器将被强制在打开状态,并且不能被关闭,在LSI稳定之后,时钟供应给IWDG,
第二部:不要忘了解除写保护,,要先写入键值,写入预分频器和重装寄存器,,
第三步:写入预分频和重装值,具体多少可以通过超时时间公式来计算,配置工作做完之后,执行指令,启动看门狗,来进行喂狗。
在这里插入图片描述
IWDG_WriteAccessCmd 写使能控制
IWDG_SetPrescaler 写预分频器
IWDG_SetReload 写重装值
IWDG_ReloadCounter 喂狗
IWDG_Enable 启用独立看门狗

在这里插入图片描述
WWDG_DeInit 恢复缺省配置
想要知道程序复位的时候,是看门狗导致的复位,还是上电或复位键导致的复位,可以通过RCC里的一个标志位来实现,   rcc.h 中RCC_GetFlagStatus 函数查看标志位,RCC_ClearFlag再调用这个函数清除一下,
RCC标志位对应的事件主要分为两种,一种是HSI,HSE等等,这些时钟的Ready,就是判断时钟是不是准备好了,这个功能再RTC那一节开启时钟的时候用过,接着另一种就是各种Reset标志位,其中Pin Reset就是按复位键复位的时候会置1,
POR/PDR 就是上一节讲的上电复位和掉电复位,
Software就是软件复位
Independent Watchdog 就是独立看门狗复位,
最后一个是低功耗的复位,
以此来判断,这个复位到底是不是看门狗引起的,

窗口看门狗,第一步 需要开启窗口看门狗的APB1时钟,这个不像IWDG,
第二步,配置各个寄存器,比如预分频和窗口值,串口看门狗没有写保护,所以可以直接写这些寄存器,写入控制寄存器CR,控制寄存器包含看门狗使能位,计数器溢出标志位和计数器有效位,这些东西需要一起设置。放在第三步统一执行。
不断向计数器写入想要的重装值,

WWDG_SetPrescaler 设置预分频器
WWDG_SetWindowValue 写入窗口值
初始化配置就用这两个函数,
WWDG_EnableIT 使能中断,因为它只有一个中断,所以不需要指定参数了
WWDG_SetCounter 写入计数器,喂狗就用这个函数
WWDG_Enable 使能窗口看门狗,启动看门狗用这个函数(有参数的原因是因为递减计数器是自由运行状态,计数器可能是任何值,为了避免刚一使能,就立马复位,所以在使能的时候,就喂狗一次)
WWDG_GetFlagStatus 获取标志位
WWDG_ClearFlag 清除标志位

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值