大家好,我是单片机爱好者-MCU起航。这里说下使用库函数方式控制STM8S103F3P6实现窗口看门狗定时复位的功能。
上一节刚刚说过了独立看门狗,这一节又有了窗口看门狗,这两者都有什么关系吗?
首先,两者都是看门狗,都是单片机运行的保护机制。区别主要有两点:
1、喂狗时间
2、时钟源
先说喂狗时间,独立看门狗,启动以后,复位以前,都可以喂狗。
窗口看门狗,启动以后,不能立刻喂狗。需要等到看门狗计数器的指小于你设定的一个值以后,同时大于0x3F,才能喂狗。否则,会发生复位。
所以,它像一扇窗户一样,左边有一个限制,右边有一个限制,只有在这扇窗户中间,才能喂狗。
时钟源有什么区别?我直接放两个图,第一个是独立看门狗的时钟部分的功能框图:
它使用的是单片机内部自带的128KHZ的低速时钟。
然后是窗口看门狗,它的时钟部分功能框图如下:
从框图可以看到,窗口看门狗的时钟源来自CPU的主时钟。STM8S103F3P6单片机出厂时,时钟默认设置为2MHZ。然后做了一个12288的分频,得到一个162HZ左右的时钟。
这里主要用到两个寄存器:窗口寄存器(WWDG_WR)和控制寄存器(WWDG_CR)。窗口寄存器里存的是喂狗的上限,小于这个值才能喂狗;下限是0x3f,不能小于这个值。
窗口看门狗一旦启动,控制寄存器里的值会每过一个时钟自动减一。如果低七位的值从0x40变到0x3f,将会产生一个看门狗复位。
库函数的使用方法如下:
1、判断之前是否出现了窗口看门狗复位,如果有,清除相关标志
2、设置7位计数器的值
3、设置刷新窗口值
接下来通过代码演示如何使用窗口看门狗:
/* Includes ------------------------------------------------------------------*/
#include "stm8s.h"
/* Private defines -----------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
void Init_WWDG(void) //初始化窗口看门狗
{
//窗口看门狗在计数值降到0x3F时产生复位,而且不能在大于窗口值时喂狗,否则复位
RST_ClearFlag(RST_FLAG_WWDGF);
WWDG_Init(0x7F, 0x50);
//2Mhz 主频,计数值0x7F 最大延长时间为 (64 * (12288 / 2000000)) = 392ms
}
//喂狗
void Free_WWDG(void)
{
u8 u8_value;
u8_value = WWDG_GetCounter();
if ((u8_value & 0x7F) < 0x50) //小于窗口值才能喂狗
WWDG_SetCounter(0x7f); //重新喂狗
}
void Delay(uint16_t nCount)
{
/* Decrement nCount value */
while (nCount != 0)
{
nCount--;
}
}
void main(void)
{
GPIO_Init(GPIOB, GPIO_PIN_4, GPIO_MODE_OUT_PP_HIGH_SLOW);
GPIO_WriteLow(GPIOB, GPIO_PIN_4);
Delay(40000);
GPIO_WriteHigh(GPIOB, GPIO_PIN_4);
Delay(40000);
Init_WWDG();
while (1)
{
// Free_WWDG();
}
}
和独立看门狗类似,先进行看门狗初始化。然后在喂狗函数里判断是否符合喂狗条件,如果满足,则喂狗,不满足,退出。
主函数里面,喂狗函数(Free_WWDG();)被注释掉了。这种情况下,看到的实验现象是,LED每隔一小段时间闪烁一下。因为没有喂狗,所以单片机复位。
如果不注释,看到的实验现象是,上电后LED闪烁一次,然后就再也没反应了。因为后面会在合适的时候进行喂狗操作,无法发生复位。
很简单,打完收工!
要获取该程序完整的工程文件,可以关注公众号:单片机爱好者,然后回复关键词:STM8S。可以获取完整的下载链接,里面包含工程文件、视频、PPT、数据手册等所有相关资料。