看门狗大家应该再熟悉不过了,一旦忘记喂狗就会导致单片机复位,而在大部分stm32中都存在两种类型的看门狗,Independent watchdog (IWDG)独立看门狗和Window watchdog (WWDG)窗口看门狗。
独立看门狗也就是常规的一种看门狗,需要定时reload计数值进入downcounter下降计数器中,否则当下降计数到0便会产生IWDG_reset信号,导致芯片复位。
通过下方原理框图可知,其有独立LSI时钟驱动,不会受到主时钟的影响,相对比较独立。
窗口看门狗与独立看门狗有所不同,该看门狗必须在所设置的窗口重载下降计数器才不会导致RESET,过早或者过晚都会导致复位。
然而有时候系统异常触发了窗口看门狗,为了便于分析想记录适当的日志,或者应对一些不能直接复位的应用场合,进行一些卸载操作,当窗口看门狗当下降计数器达到0x40后,生成一个EWI中断,并执行相应的中断服务函数,处理完中断以后,才复位系统。
那到底什么是模拟看门狗呢?
虽然名字叫看门狗,不过模拟看门狗存在的目的并不是使得芯片复位,而是对外设信号起到一个监控作用。
如下图所示,模拟看门狗在ADC外设里面:
从外设结构框图可以了解到,该看门狗主要是由一个12bit的上限值(High threshold)和一个12bit的下限值(Low threshold)构成,比较以后输出一个AWD的ADC中断信号,从而触发相应中断。
在stm32库中通过填充ADC_AnalogWDGConfTypeDef,并进行配置即可启动该功能。
模拟看门狗到底有什么用处呢?
做过控制或者数据采集的朋友都会进行信号的过低或者超高的异常处理,对于一些快速性的处理和保护,常规的处理办法就是直接在采集中断中用采集结构比较所设置的最大值或者最小值。
如果仅仅只是一个采样值的判断倒无伤大雅,当多个ADC通道都需要进行相同判断和处理,软件上就有点累赘耗时了。
硬件功底不错的伙计,可能会想到通过外部比较器+逻辑运算最终通过一个引脚接到MCU的外部中断,一旦有采样信号超范围,便会触发外部中断执行中断服务函数处理。
然而这种需要增加额外硬件的方式对于有模拟看门狗MCU等就没有必要了,因为每个ADC中的模拟看门狗都可以通过配置相应寄存器选择一系列通道进入模拟看门狗的上下限监控中。
这样看来模拟看门狗有点像窗口看门狗,只是其最终不会导致MCU复位,而是触发中断交给用户进行继续处理。
至于中断中怎么处理就非常灵活了,比如通过判断多次触发模拟看门狗中断以后才进行保护处理等,以防止一些噪声导致的误触发。