今天来学习STM8的独立看门狗。
看门狗就是用来监测单片机运行是否正常的,程序是否运行正常,是否进入死循环等。
原理就是定时计数器。
计数器向下计数,到零时触发单片机复位。
正常运行时就需要在复位前给计数器写入新值,也就是喂狗。
先看看结构
这里可以看到,看门狗的时钟是来源于内部128K低速震荡时钟的2分频。
也就是输入时钟是64k。
再经过一个分频器变成计数器时钟。
与独立看门狗相关的寄存器有IWDG_KR键寄存器,IWDG_PR分频寄存器,IWDG_RLR重装载寄存器。
分频器寄存器如下
显示了分频系数及喂狗周期
下图是计算方式
T为喂狗周期,超时产生复位
D为喂狗后到复位的时长,比喂狗周期长一些。
独立看门狗的启用流程如下
先开启独立看门狗功能
再解锁相关寄存器设置
再写入分频和重装载值
最后执行刷新,使分频和重装载值生效
喂狗就是执行刷新,要改变分频值和重装载值则先解锁,再修改,再刷新。
执行刷新后IWDG_RLR的值会重新装载到计数器。
这里以分频256、重装载17计算
T=(2*256*17)/128=68ms
D=68+6/128=68.05ms
看复位引脚波形
基本满足,因为频率误差和执行指令时间,所以有点误差
停机模式下的看门狗复位
这里比不停机多了零点几毫秒的时间,可能是带有唤醒单片机的操作吧
贴上程序
- #include<iostm8s105k4.h>
- void init()
- {
- IWDG_KR=0xcc; //启用看门狗
- IWDG_KR=0x55; //解锁寄存器
- IWDG_PR=0x06; //分频值
- IWDG_RLR=0x10;//重装载值
- IWDG_KR=0xaa; //数据刷新
- }
- int main( void )
- {
- init();
- while(1)
- {
- //IWDG_KR=0xaa; //喂狗
- //asm("halt"); //进入停机模式
- }
- }
THE END!