独立看门狗(IWDG,Independent watchdog),本质是一个可以定时产生系统复位信号、并且可以通过”喂狗“复位的计时器。它由独立的RC振荡器、低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效,LSI 的频率一般取 40KHZ。用通俗一点的话来解释就是一个 12 位的递减计数器,当计数器的值从某个值一直减到 0 的时候,系统就会产生一个复位信号,即 IWDG_RESET。如果在计数没减到 0 之前,重装载计数器的时钟值,那么就不会产生复位信号,这个动作就是我们经常说的喂狗。
看门狗功能由 VDD 电压域供电,在停止模式和待机模式下仍能工作。IWDG最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时间精度要求较低的场合。相比而言,窗口看门狗由从APB1时钟分频后得到的时钟驱动,通过可配置的时间窗口来检测应用程序非正常的过迟或过早的操作。
看门狗的作用是面对外界电磁干扰和内部(硬件或软件)错误,导致程序跑飞。比如程序因为一个外界的电磁干扰陷入了一个死循环,打断正常程序运行,而看门狗能通过触发系统复位来恢复程序正常运行,规避掉了程序收到外界干扰导致的错误。一般需要应用在需要高稳定性但对精度较低的硬件中。
接下来介绍我们的IWDG的工作原理。
当我们启动IWDG之后,LSI自动启动,给IWDG输入LSI的40MHz低频时钟信号,通过8位预分频器PSC,再得到我们真正的IWDG_CLK独立看门狗工作时钟信号。接下来把IWDG_CLK独立看门狗时钟信号输入递减计时器CNT,当CNT信号计数到0的时候(CNT==0),就会触发系统复位。但如果我们激活了IWDG_RLR重装载寄存器,将CNT复位,重新开始计数器计时。
密钥寄存器IWDG_KR会解锁重装载访问保护,解锁时写入0x5555,启动看门狗工作的时候写入0xCCCC。第16位WDG_SW是软件看门狗解锁寄存器位,写入0启动硬件看门狗,写入1启动软件看门狗。预分频器寄存器IWDG_PR前3位用于记录预分频因子,公式为PSC=4*2^prer,比如prer=000,则PSC=4;如果prer=101,则PSC=128。重装载器寄存器IWDG_RLR前12位记录重装载值,重装载值最大为4096,当我们向IWDG_KR密钥寄存器写入0xAAAA,重装载值会写入计数器随后开始递减计数。状态寄存器IWDG_SR第0位为PVU,用于预分频值更新,第1位为RVU,用于重装载值更新,只有IWDG_SR中的RVU为0的时候,才能去此寄存器进行修改,这两个值写入1时表示正在进行更新,写入0时表示更新完成。
接下来介绍溢出时间计算。
Tiwdg=psc*rlr/fiwdg=(4*2^prer)*rlr/fiwdg,(fiwdg的频率为40MHz)。我们对照这个表写入相应的分频系数,然后再计算相应的重装载值。比如我们需要一个间隔为1s的独立看门狗,我们可以取16、32位的预分频系数,那比如我们取16位预分频系数IWDG_PRERSCALAR_16,则我们计算重装载值rlr=1s*40000/16(1M=10^6,但为了把时间转化为ms,我们将40M取为40000),最后计算得到25000。
关于独立看门狗IWDG的一些知识点就介绍到这里。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)