说到看门狗,大部分人的第一反应是,看门狗就是用做防止系统异常时的终极对策,因为看门狗一旦启用,就得在看门狗触发时间内不断喂狗,一旦系统跑飞,则会出现无法喂狗的情况,此时看门狗就主动复位芯片,保证芯片能跑回正常状态。
众所周知,软件能做出五花八门的功能,但带来的问题也显而易见,软件或多或少的存在一些小bug,这些bug随着系统运行时间的加长,触发的概率越大。一般的程序设计,基本上都按照上电后一直保持系统运行状态,关机操作仅仅是关闭外围器件,使主控进入低功耗模式。很明显,这种设计,主控一直在跑,很难保证某部分代码写得不对导致部分数据错乱后引起系统异常。
解决对策
如果我们在关机动作完成时再使用看门狗复位一下系统,这样就可以做到对用户无感的将整个系统初始化成上电时的状态。具体操作流程为:
到这里有人会问,这是默认待机的情况,如果上电默认开机怎么办?其实也是有办法的,虽然我们平时使用的看门狗定时器大部分场景仅使用看门狗的超时复位功能,但其实,看门狗还有一个后门,一般看门狗定时器中会留一两个寄存器,此寄存器有个很关键的功能,上电时有个默认值,但是呢,一旦设置了这些寄存器,看门狗复位时并不会清掉这部分寄存器的内容,因此可以使用这部分定时器的内容进行信息传递。实际上,有芯片原厂便是使用此方法向预置的启动程序传递参数的,如瑞星微的mcu产品线系列。那修改后的操作流程如下:
写在最后
目前只要是我做的单片机的量产项目,基本上都会导入这种做法,原因无他,单片机项目一般上电到待机耗时很短,后台偷偷做看门狗复位操作对用户完全无感,也能降低系统长期运行时不稳定的概率。