今天来学习STM8的窗口看门狗。
窗口看门狗主要用来检测单片机运行有没有出错。
可能是程序逻辑错误、外部电路干扰等。
与独立看门狗不一样的是窗口看门狗的时钟来源是CPU时钟的分频,且分频无法调整。
还有一个区别是喂狗时机,也就是喂狗的时间窗口。喂狗早了和晚了都不行,都会产生复位。
其它的区别还有停机模式,启用停机复位时,一旦单片机停机就会进行复位,不会进入停机模式。
活跃停机模式除外。
在停机模式时,窗口看门狗也会停止,与独立看门狗不同。
可能停机时CPU时钟有可能也关闭了。
当单片机唤醒时看门狗会继续向下计数,为防止单片机唤醒后无法及时喂狗,在进入停机模式前应先进行喂狗。
这里有意思的地方在于喂狗早了也会复位,如果进入停机时没到喂狗窗口期就不好处理了。
先来看看结构
这个图很好的说明了产生复位的条件。
从复位信号往回退,先是一个与门,需要有WDGA和或门的输出。
再看或门一个来自T6位取反,一个来自另一个与门。
在看接下来的与门,一个条件是写WWDG_CR,另一个条件是T[6:0]>W[6:0]
其实实现的功能就是窗口期外修改WWDG_CR就会输出1.
总的来说,就是产生复位的条件是:1、WDGA置位
2、窗口期外喂狗或超时不喂狗(超时时T6被清零)
人工置位T6再清零也会产生复位。
使用步骤
喂狗周期计算
窗口
先看看不喂狗的情况,计数器最大,2M CPU时钟
t=(1288*(63+1))/2000=393ms
基本满足
窗口期最大时任何时候都能喂狗,就不展示了
下面是窗口期外喂狗
当T>W时喂狗,也就是提前喂狗
喂狗不当造成频繁复位
下面贴上测试程序代码
- #include<iostm8s105k4.h>
- void init()
- {
- WWDG_CR=0xff; //使能、初值
- WWDG_WR=0x70; //窗口值
- }
- int main( void )
- {
- init();
- while(1)
- {
- WWDG_CR=0xff; //喂狗
- }
- }
THE END!