要永远保持一颗好奇心。
最近因为一些原因,需要了解下STM32的内置看门狗怎么使用,说实话其实我刚开始并不知道STM32还有个内置看门狗,虽然我做了很多年的嵌入式软件开发了。
然后想着趁这个机会,梳理和学习下STM32的内置看门狗有哪些特点、与外置看门狗相比又有什么不同。
看门狗实际上是一种计数器,类似于咱们现实中的倒计时,我们通过初始化看门狗预先设置一个倒计时时间,如果在倒计时之前我们重置了计时器,那么它永远不会到0。(重置的操作就是喂狗)
如果倒计时结束之前没有重置计时器,那么当计时器运行到0时,就会产生一个异常信号。
接收到该信号后系统会重启。
外置看门狗一般是使用独立的时钟源。因此外置看门狗的倒计时功能不受系统的影响,即使系统重启期间,外置看门狗依然会计时。
外置看门狗如SP706S,通常需要STM32的一个GPIO引脚作为输出,以定期变化电平来“喂狗”。如果STM32程序出现故障,无法定期变化GPIO引脚电平,外置看门狗将触发复位信号,使STM32复位。
外置看门狗的信号触发时,会有一个引脚产生一个高/低电平,实际使用过程中我们会将该电平信号传递到STM32的复位引脚,控制STM32在喂狗超时时进行复位。
因为除初始化外,全程没有软件的参与,所以外置看门狗的可靠性很高。
外置看门狗因为基本上是纯硬件配置,==一些外置看门狗的超时时间还是通过调整电阻值来设置。==所以可想外置看门狗的灵活性比较差。
提供可靠的看门狗功能,市面上大多数设备为了能够在故障状态下恢复,都会加入看门狗这个功能,如果有些芯片本身不带有看门狗或者芯片提供的只有窗口看门狗的功能,不符合安全性要求。那么加入一个额外的硬件看门狗是第一选择。
STM32 有两个内置看门狗,分别是独立看门狗(IWDG)和窗口看门狗(WWDG)
使用一个独立的低速时钟(LSI),通常约为40KHz,即使主系统时钟发生故障,它仍然有效。因此程序跑飞了,它还是能够正常运行,有点外置看门狗的意思了。
是一个递减计数器,当计数器减到0之前如果没有通过“喂狗”操作(向看门狗计时器中写入特定的值)重置计数器,就会触发系统复位。
IWDG没有中断功能
取值范围
提供了一个固定的时间窗口,初始化设置完时间之后,就不允许更改了。除非是系统复位了,否则运行过程中直接进行更改好像会触发重启。
一些对安全性要求比较高的场景,因为和MCU使用不同的时钟源,所有MCU崩溃、跑飞等情况下其依然能够正常工作。
使用系统时钟(APB1时钟),这意味着如果系统时钟出现问题,WWDG将无法正常工作。
WWDG主要用于软件级别的监控,确保程序在预定的时间内完成特定任务
也是一个递减计数器,但它有一个固定的下限(0x40)和一个可配置的上限窗口值。如果在计数器减到下限之前或低于上限窗口值时没有进行喂狗操作,就会触发系统复位。
WWDG具有中断功能,可以在计数器达到下限时产生一个早期唤醒中断(EWI),允许在系统复位前进行一些紧急处理,如数据保存等
取值范围:
提供了一个可配置的时间窗口,在软件运行过程中允许开发者根据具体应用场景设置喂狗的上限和下限,从而更灵活地适应不同的监控需求。
一般是用于检测系统有没有在正常运行,如果没有那么触发复位之前会产生个中断,开发者可以在该中断中保存一些重要数据再进行复位。
特性 | 独立看门狗(IWDG) | 窗口看门狗(WWDG) | 外置看门狗(如SP706S) |
---|---|---|---|
时钟源 | 内部约40KHz RC振荡器 | APB1时钟(由系统时钟决定) | 外部时钟源 |
独立性 | 高,即使主系统时钟故障也有效 | 低,依赖于系统时钟 | 高,依赖于外部时钟源 |
喂狗机制 | 需要在计数器递减至0前喂狗 | 需要在设定的窗口范围内喂狗 | 需要在超时前变化输出引脚状态喂狗 |
超时时间设置 | 通过预分频器和重载值设置 | 通过预分频器和窗口值设置 | 通过外部时钟源和喂狗周期设置 |
中断功能 | 无中断功能 | 有提前唤醒中断(EWI) | 取决于实现方式,可有可无 |
应用场景 | 需要高可靠性和稳定性的场合,如汽车电子、工业控制系统等 | 需要监控任务执行时间的实时系统 | 适用于需要长时间稳定运行的系统,或内置看门狗不适用的场合 |
复位行为 | 计数器递减至0时触发复位 | 计数器低于窗口下限时触发复位 | 超时未变化输出引脚状态时触发复位 |
灵活性 | 相对较低,适合简单的监控需求 | 较高,适合需要精确控制的任务监控 | 最高,可以根据外部电路设计调整 |