大家好,我是单片机爱好者-MCU起航。这里说下使用库函数方式控制STM8S103F3P6实现独立看门狗定时复位的功能。
首先说一下什么是看门狗:看门狗一般是一个定时器电路,有的集成在单片机内部,有的是一个独立的芯片。它一般有一个输入信号,叫做喂狗。MCU正常工作时,看门狗定时器自动计时,MCU每隔一段时间喂一次狗,也就是把定时器计数清零。
如果MCU工作异常,无法清零,那么看门狗定时器计数值满了会引发MCU复位,进而重新开始执行程序。所以,这是一种自我保护机制。
那么这里说的独立看门狗又是什么?
这个问题先不解答,下一节说窗口看门狗的时候再说。
关于独立看门狗的简介,数据手册里的描述是:可以用于解决处理器因为硬件或软件的故障所发生的错误。它由一个内部的128kHz的LSI阻容振荡器作为时钟源驱动,因此即使是主时钟失效时它仍然照常工作。功能框图如下:
那么,如何使用呢?
数据手册里说的比较详细,大致意思就是:启动看门狗和喂狗操作是比较简单的,可以直接使用。除此之外,还有计时时间的修改和重装载寄存器的设置,但由于看门狗是一个保护机制,为了防止误操作,所以这两个操作是受保护的,使用之前需要先解除保护。
经过我的测试,库函数方法下,看门狗的使用步骤如下:
1、启动看门狗
2、允许写操作
3、重置时间
4、设置分频系数
5、禁止写操作
下面通过代码实现一个功能:上电后LED闪烁一下,然后启动看门狗,原地等待看门狗复位。LED依然使用PB4接口上的,原理图如下:
代码如下:
/* Includes ------------------------------------------------------------------*/
#include "stm8s.h"
/* Private defines -----------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
void iwdg_init(void)
{
IWDG_Enable(); //启动看门狗
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //允许写操作
IWDG_SetReload(0xFF); //1.02s
IWDG_SetPrescaler(IWDG_Prescaler_256); //256分频,4ms
IWDG_WriteAccessCmd(IWDG_WriteAccess_Disable); //禁止写操作
}
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);
iwdg_init();
while(1);
}
主函数部分比较简单,就是PB4的初始化,然后闪烁,然后看门狗初始化,然后原地等待。
看门狗初始化里面进行了几个操作:
1、启动看门狗
2、允许写操作
3、设置复位时间
4、设置分频系数
5、禁止写操作
编译、下载、上电!现象OK!
很简单,打完收工!
要获取该程序完整的工程文件,可以关注公众号:单片机爱好者,然后回复关键词:STM8S。可以获取完整的下载链接,里面包含工程文件、视频、PPT、数据手册等所有相关资料。