本篇文章是对STM32单片机**"独立看门狗(IWDG)"**的原理进行讲解。希望我的分享对你有所帮助!
目录
一、什么是独立看门狗
(一)简介
单片机的独立看门狗(Independent Watchdog Timer,简称 IWDG)是一种用于监控和保护微控制器(MCU)系统的硬件组件。它的主要功能是检测系统是否在正常工作,并在发现系统出现故障时自动进行复位操作,以确保系统的稳定性和可靠性。
(二)、独立看门狗的原理
基本概念
独立看门狗是一个专门的计时器,与主处理器的时钟源和其他外设通常是独立的。它通过定期的"喂狗"操作(即向看门狗计时器中写入特定的值)来保持系统的正常运行状态。如果系统出现问题,无法进行正常的"喂狗"操作,看门狗计时器会超时,从而触发系统复位。
工作机制
计时器设置:独立看门狗通常有一个可配置的计时周期,这个周期可以是几个秒钟到几分钟不等。这个计时周期是由硬件定义的,通常是通过一个独立的、具有稳定性的时钟源来驱动,如内部振荡器或外部晶振。
喂狗操作:为了防止看门狗计时器超时,系统需要定期向看门狗发送"喂狗"信号。这通常是**通过向特定寄存器写入值来实现。**每当"喂狗"操作成功,计时器的计数会被重置,从而重新开始计时。
超时与复位:如果在看门狗的计时周期内没有收到"喂狗"信号,计时器会达到预设的超时值。此时,看门狗会触发一个复位信号,将系统重新启动,试图恢复系统到正常的工作状态。
独立性
与主系统时钟和处理器的运行状态无关,看门狗的独立性是其关键特性。即使主处理器由于某种原因停止工作或进入无响应状态,看门狗仍会正常计时并执行其监控功能。这种独立性使得看门狗在系统出现故障时仍能有效地执行复位操作。
应用
系统保护:独立看门狗主要用于保护系统在遇到软件死锁、程序崩溃等异常情况时能自动复位,恢复到正常状态,确保系统的可靠性和稳定性。
安全性:在一些安全关键的应用场景中,例如汽车电子、工业控制系统等,独立看门狗可以提供额外的安全保障,避免因系统失效导致的安全隐患。
(三)、具体操作说明
STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然
有效。这里需要注意独立看门狗的时钟是一个内部 RC 时钟,所以并不是准确的 40Khz,而是在 30~60Khz 之间的一个可变化的时钟,只是我们在估算的时候,以 40Khz 的频率来计算,看门狗对时间的要求不是很精确,所以,时钟有些偏差,都是可以接受的。独立看门狗有几个寄存器与我们这节相关,我们分别介绍这几个寄存器,首先是键值寄存器 IWDG_KR,该寄存器的各位描述如图
在键寄存器(IWDG_KR)中写入 0xCCCC,开始启用独立看门狗;此时计数器开始从其复位
值 0xFFF 递减计数。当计数器计数到末尾 0x000 时,会产生一个复位信(IWDG_RESET)。 无论何时,只要键寄存器 IWDG_KR 中被写入 0xAAAA, IWDG_RLR 中的值就会被重新加载到计数器中从而避免产生看门狗复位 。
IWDG_PR 和 IWDG_RLR 寄存器具有写保护功能。要修改这两个寄存器的值,必须先向IWDG_KR 寄存器中写入 0x5555。 将其他值写入这个寄存器将会打乱操作顺序,寄存器将重新被保护。重装载操作(即写入 0xAAAA)也会启动写保护功能。
接下来,我们介绍预分频寄存器(IWDG_PR),该寄存器用来设置看门狗时钟的分频系数,最低为 4,最高位 256,该寄存器是一个 32 位的寄存器,但是我们只用了最低 3 位,其他都是保留位。预分频寄存器各位定义如图
在介绍完 IWDG_PR 之后,我们介绍一下重装载寄存器。该寄存器用来保存重装载到计数器中的值。该寄存器也是一个 32 位寄存器,但是只有低 12 位是有效的,该寄存器的各位描述如图
只要对以上三个寄存器进行相应的设置,我们就可以启动 STM32 的独立看门狗,启动过程可以按如下步骤实现:
1)向 IWDG_KR 写入 0X5555。
通过这步,我们取消 IWDG_PR 和 IWDG_RLR 的写保护,使后面可以操作这两个寄存器。
设置 IWDG_PR 和 IWDG_RLR 的值。
这两步设置看门狗的分频系数,和重装载的值。由此,就可以知道看门狗的喂狗时间(也
就是看门狗溢出时间),该时间的计算方式为:
Tout=((4× 2^prer) × rlr) /40
其中 Tout 为看门狗溢出时间(单位为 ms); prer 为看门狗时钟预分频值(IWDG_PR 值),范围为 0~7; rlr 为看门狗的重装载值(IWDG_RLR 的值);
比如我们设定 prer 值为 4, rlr 值为 625,那么就可以得到 Tout=64× 625/40=1000ms,这样,看门狗的溢出时间就是 1s,只要你在一秒钟之内,有一次写入 0XAAAA 到 IWDG_KR,就不会导致看门狗复位(当然写入多次也是可以的)。这里需要提醒大家的是,看门狗的时钟不是准确的 40Khz,所以在喂狗的时候,最好不要太晚了,否则,有可能发生看门狗复位。
2) 向 IWDG_KR 写入 0XAAAA。
通过这句,将使 STM32 重新加载 IWDG_RLR 的值到看门狗计数器里面。 即实现独立看门
狗的喂狗操作。
3)向 IWDG_KR 写入 0XCCCC。
通过这句,来启动 STM32 的看门狗。 注意 IWDG 在一旦启用,就不能再被关闭!想要关
闭,只能重启,并且重启之后不能打开 IWDG,否则问题依旧,所以在这里提醒大家,如果不用 IWDG 的话,就不要去打开它,免得麻烦。
通过上面 3 个步骤,我们就可以启动 STM32 的看门狗了,使能了看门狗,在程序里面就必须间隔一定时间喂狗,否则将导致程序复位。利用这一点,我们本章将通过一个 LED 灯来指示程序是否重启,来验证 STM32 的独立看门狗。
在配置看门狗后, DS0 将常亮,如果 KEY_UP 按键按下,就喂狗,只要 KEY_UP 不停的
按,看门狗就一直不会产生复位,保持 DS0 的常亮,一旦超过看门狗定溢出时间(Tout)还没按,那么将会导致程序重启,这将导致 DS0 熄灭一次。
二、结语
关于"单片机独立看门狗"的知识就介绍到这里了,下一篇文章将通过实践代码来说明。