在逛论坛的时候,看到有人讨论看门狗的启动,点开帖子一阅。一直以为挺普通的独立看门狗(IWDG)突然变得不普通,彰显了其英雄本色。
独立看门狗的功能特性非常简单与专一。打开后,必须喂狗。未按时喂狗则会引发系统复位,很简单,很实用。用法也非常简单:计算一下while(1)中各项工作的时长,将看门狗的周期设置略大于此时长。这样就能保证在各项工作完成之后,可以喂狗成功。当意外情况发生后,看门狗也能及时响应系统的异常,实现系统复位操作。
我们以极海APM32E030为例,官方的SDK已经有现成的示例参考程序可以使用。这里简单附上代码,方便大家阅读(代码中的中文部分为我添加内容)
void IWDTInit() { /* clear IWDTRST Flag*/ if (RCM_ReadStatusFlag(RCM_FLAG_IWDTRST) != RESET) { RCM_ClearStatusFlag(); } /* set IWDT Write Access */ IWDT_EnableWriteAccess(); /* set IWDT Divider 调整喂狗周期时长 */ IWDT_ConfigDivider(IWDT_DIV_64); /* set IWDT Reloader 只有12位有效 */ IWDT_ConfigReload(40000 / 32); /* Refresh */ IWDT_Refresh(); /* Enable IWDT */ IWDT_Enable(); } void IWDT_Feed(void) { IWDT_Refresh(); }
其实以上并不是本次帖子的主要目的,主要目的是独立看门狗的配置里是分两个部分:一部分是我们现在讲到的最常见的部分,启动和周期性喂狗。而另一部分则是硬件看门狗部分,是由MCU的选项字控制的。在Flash控制器的选项字节功能描述章节,即UOB字体的bit位0: WDTSEL,来标识当前启动的硬件看门狗,还是软件看门狗。
到这里引入了“硬件看门狗”的概念,这就与看门狗章节中的“硬件看门狗”的提示内容相匹配了。如果Flash选项字配置使能了硬件看门狗(UOB.bit0=0)则在配置过程的参数全部作用于硬件看门狗。
硬件看门狗与默认的软件看门狗不同之处还在于其上电即工作,并不受IWDG模块的IWDT_KEY控制,无需写入0xCCCC启动看门狗,而且复位并不会关闭!复位并不会关闭!复位并不会关闭!
综上,如果在flash选项字配置成“硬件看门狗”则MCU的表现更像是一个外置的看门狗芯片的行为。MCU的任何行为均无法影响到看门狗。大家根据自己的实际项目需要来选择看门狗的具体行为。