在做单片机产品开发的实际项目中,我们有时会遇到这样一个问题:软件编写完全没问题,运行也没有什么意想不到的bug,单片机十次运行中有九次都是正常的,但就是有一次,我们按照自己的意愿操作,让单片机一下子执行很多任务,让CPU同时处理大量数据。这时奇怪的事情就发生了,我们会发现系统跑飞掉了,单片机变得奇卡无比。等过了一段时间后,单片机就会把一条条刚才没处理的程序逐个执行回来。
这样我们的代码就不符合要求,为什么别人的代码不会出现这样的事故,而我们的就会发生这样的事?这就是因为我们软件编写上有些逻辑不合理导致CPU负担一时间太大,打破了原代码时序要求。
因此,特别针对汽车电子等关系到生命安全的单片机编程,看门狗的重要性可想而知。如果程序出现异常,我们需要及时复位系统。一方面代码的合理性我们不容小觑,对时序的分配一定要处理恰当,另一方面看门狗的使用也是不可或缺。
对单片机独立看门狗的开启介绍
前面文章中,我们对单片机看门狗的重要性做了一个简单介绍,本文小编向大家介绍如何开启独立看门狗。我们根据stm8芯片的datasheet来进行软件编写。
独立看门狗由一个内部的128kHz的LSI阻容振荡器作为时钟源驱动,即使是主时钟失效时它仍然照常工作。它的时钟大小为128k/2=64k。
如图1所示芯片资料的描述:
图1 独立看门狗功能说明
因此我们首先首先需要先允许对寄存器的写操作(对于寄存器的操作和定义方法,读者可以查看小编前面更早的文章http://toutiao.com/item/6494585720592663054/)。
IWDG->KR = (uint8_t)0x55; /*(1) 允许寄存器写入 */
/*,假如我们主程序时序设计为运行完所有程序需10ms,那么 我们设置看门狗复位时间为12ms(复位时间一定要小于所写代码运行一圈所需的时间,也就是说我们所写代码运行完一次一定要小于12ms,否则单片机就不停的复位了) */
IWDG->PR = (uint8_t)0x00; /* (2)不分频 */
IWDG->RLR = (uint8_t)0xC8; /* (3)看门狗重装载值设为200 */
/* 通过以上设置,看门狗时长为(4*2^0)*200/64=12.5 ms */
图2 看门狗时间设置参考
IWDG->KR = (uint8_t)0xCC; /* (4)打开看门狗定时器 */以上4步就是对独立看门狗寄存器配置的软件编写,读者可直接写入到寄存器的初始化当中。
在打开看门狗后我们就需要不断喂狗,程序没跑一圈我们就要喂一次狗,以防单片机复位。喂狗我们可以简单封装成一个函数:
void IWDG_FeedDog(void)
{
IWDG->KR = (uint8_t)0xAA; /* 对看门狗寄存器值清零 */}
通过以上配置,我们就完成对看门狗打开的操作了,喂狗函数我们放到主程序的末尾处即可。如果读者对其中寄存器的填入值不是太清楚,小编在此给出寄存器值供大家参考。图3 KR寄存器
图4 PR寄存器
图5 RLR寄存器
以上就是stm8 独立看门狗的整个配置过程,希望能够帮助到大家对单片机更好的理解和认识。