「STC8A8K64S4A12开发板」—学习WDT看门狗
前言
本次讲解STC8A8K64S4A12系列单片机系统复位的方式,掌握看门狗定时器的原理;掌握单片机看门狗定时器的寄存器配置及程序设计。
一、硬件设计
1.单片机系统复位
STC8A8K64S4A12系列单片机的复位分为硬件复位和软件复位两种。
硬件复位时,所有寄存器的值会复位到初始值,系统会重新读取所有的硬件选项。同时根据硬件选项所设置的上电等待时间进行上电等待。
软件复位时,除与时钟相关的寄存器保持不变外,其余的所有寄存器的值会复位到初始值,软件复位不会重新读取所有的硬件选项。
图1:STC8A8K64S4A12系列单片机复位分类
STC8A8K64S4A12系列单片机软件复位是通过IAP控制寄存器IAP_CONTR的SWRST使能的,IAP_CONTR寄存器具体如下。
图2:IAP控制寄存器IAP_CONTR
☆注:如果开启软件复位后,还需操作寄存器SWBS位以确定开始执行代码的区域。
2.单片机看门狗简介
在工业控制/汽车电子/航空航天等需要高可靠性的系统中,为了防止“系统在异常情况下,受到干扰,MCU/CPU程序跑飞,导致系统长时间异常工作”的情况发生,而设计了一种用于检测程序运行状态的芯片或电路,俗称看门狗(即Watchdog)。
看门狗通常有一个输入信号和一个输出信号。输入信号也称“喂狗”,输出信号关联MCU的复位端。系统运行后启动看门狗计数器,看门狗开始计数,当计数满后未收到清零信号(喂狗),看门狗计数器溢出,触发看门狗中断,输出控制MCU复位。
看门狗可分为独立于单片机芯片外的看门狗芯片和集成于单片机芯片内的看门狗外设两种。按照工作原理,独立看门狗和窗口看门狗是最为常见的两种看门狗类型。
☆注:以上描述是针对看门狗的通用性描述,不同型号的单片机看门狗可能会有差异。
3.STC8A8K64S4A12系列单片机看门狗介绍
STC8A8K64S4A12系列单片机看门狗实际上是一个15位的定时器或计数器,简称WDT。单片机运行工作中,如果开启了看门狗外设,则看门狗会对单片机机器周期脉冲不停计数,单片机程序如果不能及时对看门狗的定时器复位(俗称“喂狗”),看门狗就会在其定时器计满溢出时产生一个复位信号,从而使系统重启。
下图可比较形象的诠释看门狗原理,单片机CPU必须在看门狗计数器没有溢出前喂狗,否则计数器一旦溢出,则系统重启。
图3:看门狗工作原理示意图
☆注:所谓的喂狗,就是将看门狗计数器计数清零。
1.1.看门狗控制寄存器WDT_CONTR
看门狗控制寄存器WDT_CONTR不支持位寻址,该寄存器的B0~B2位用于设置看门狗定时器时钟分频系数,寄存器B3位是单片机空闲模式时的看门狗控制位,寄存器B4位是清零看门狗计数器计数控制位,寄存器B5位是看门狗使能控制位,寄存器B7位是看门狗溢出标志位。
图4:看门狗控制寄存器WDT_CONTR
1.2.看门狗溢出时间计算
下面给出看门狗溢出时间计算公式:
图5:看门狗溢出时间计算公式
☆注:STC官方手册上面没有给出看门狗溢出时间的推导过程,也没有明确说明看门狗定时器的时钟频率,以系统时钟12分频后给看门狗定时器提供时钟是最合理的解释。
举例,配置WDT_CONTR寄存器B2位PS2为0,配置WDT_CONTR寄存器B1位PS1和B0位PS0均为1,系统时钟为11.0592MHZ,计算看门狗溢出时间。
1)看门狗定时器时钟分频系数PS[2:0]值为011,转成十进制是3,进而得出分频因子PSC值为16。
2)看门狗溢出时间:(161232768)/11059200=0.5688s=568.8ms。
4.看门狗溢出时间计算
针对STC8A8K64S4A12系列单片机看门狗配置过程如下:
图6:看门狗配置步骤
☆注:实验例程即是按照上述配置步骤操作寄存器相关位实现,后有详述。
二、软件设计
1.看门狗实验实验(及时喂狗)
1.1.工程需要用到的c文件
本例需要用到的c文件如下表所示,工程需要添加下表中的c文件。
表1:实验需要用到的c文件
序号文件名后缀功能描述
1led.c包含与用户led控制有关的用户自定义函数
2wdt.c看门狗有关的用户自定义函数
3delay.c包含用户自定义延时函数
1.2.头文件引用和路径设置
■ 需要引用的头文件
#include "delay.h"
#include "wdt.h"
#include "led.h"
1
2
3
■ 需要包含的头文件路径
本例需要包含的头文件路径如下表:
表2:头文件包含路径
序号路径描述
1…\ Sourceled.h、wdt.h和delay.h头文件在该路径,所以要包含
2…\UserSTC8.h头文件在该路径,所以要包含
MDK中点击魔术棒,打开工程配置窗口,按照下图所示添加头文件包含路径。
图7:添加头文件包含路径
1.3.编写代码
首先,在wdt.c文件中编写看门狗初始化函数WDT_Init,代码如下。
程序清单:看门狗初始化函数
/***************************************************************************
* 描 述 : 看门狗初始化
* 入 参 : 无
* 返回值 : 无
**************************************************************************/
void WDT_Init(void)
{
WDT_CONTR &= 0xF7; //IDLE_WDT位置0,看门狗定时器在空闲模式下不计数
WDT_CONTR &= 0xFB; //PS2位置0,设置看门狗定时器预分频值
WDT_CONTR |= 0x03; //PS1、PS0位置1,设置看门狗定时器预分频值
WDT_CONTR &= 0x7F; //WDT_FLAG位置0,看门狗溢出标志位清零
WDT_CONTR |= 0x20; //EN_WDT位置1,开启看门狗定时器
}
1
2
3
4
5
6
7
8
9
10
11
12
13
然后,编写喂狗函数,代码如下。
程序清单:喂狗函数
/***************************************************************************
* 描 述 : 喂狗
* 入 参 : 无
* 返回值 : 无
**************************************************************************/
void WDG_Feed(void)
{
WDT_CONTR |= 0x10; //CLR_WDT位置1,看门狗定时器重新计数
}
1
2
3
4
5
6
7
8
9
最后,在主函数中先控制用户指示灯D3亮,主循环中有软件延时和喂狗操作,喂狗之后会翻转用户指示灯D4并熄灭用户指示灯D3,以方便观察实验现象。
代码清单:主函数
int main()
{
leds_off(); //熄灭开发板上的4个指示灯(D1、D2、D3、D4)
WDT_Init(); //看门狗初始化,看门狗溢出时间约568.8ms(11.0592MHZ)
delay_ms(200);
led_on(LED_3); //点亮用户指示灯D3
while(1)
{
//软件延时200ms,该延时是模拟喂狗前实际执行用户应用代码所用时长
delay_ms(200);
//喂狗
WDG_Feed();
led_off(LED_3); //熄灭用户指示灯D3
led_toggle(LED_4); //翻转用户指示灯D4
//软件延时200ms,该延时是模拟喂狗后实际执行用户应用代码所用时长
delay_ms(200);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2.看门狗实验(未及时喂狗)
2.1.工程需要用到的c文件
本实验需要用到的头文件以及添加头文件包含路径的方法请参考“实验2-7-1:WDT看门狗实验(及时喂狗)”部分。
2.2.编写代码
首先,在wdt.c文件中编写看门狗初始化函数WDT_Init,代码如下。
程序清单:看门狗初始化函数
/***************************************************************************
* 描 述 : 看门狗初始化
* 入 参 : 无
* 返回值 : 无
**************************************************************************/
void WDT_Init(void)
{
WDT_CONTR &= 0xF7; //IDLE_WDT位置0,看门狗定时器在空闲模式下不计数
WDT_CONTR &= 0xFB; //PS2位置0,设置看门狗定时器预分频值
WDT_CONTR |= 0x03; //PS1、PS0位置1,设置看门狗定时器预分频值
WDT_CONTR &= 0x7F; //WDT_FLAG位置0,看门狗溢出标志位清零
WDT_CONTR |= 0x20; //EN_WDT位置1,开启看门狗定时器
}
1
2
3
4
5
6
7
8
9
10
11
12
13
然后,编写喂狗函数,代码如下。
程序清单:喂狗函数
/***************************************************************************
* 描 述 : 喂狗
* 入 参 : 无
* 返回值 : 无
**************************************************************************/
void WDG_Feed(void)
{
WDT_CONTR |= 0x10; //CLR_WDT位置1,看门狗定时器重新计数
}
1
2
3
4
5
6
7
8
9
最后,在主函数中先控制用户指示灯D3亮,主循环中有软件延时和喂狗操作,喂狗之后会翻转用户指示灯D4并熄灭用户指示灯D3,以方便观察实验现象。
代码清单:主函数
int main()
{
leds_off(); //熄灭开发板上的4个指示灯(D1、D2、D3、D4)
WDT_Init(); //看门狗初始化,看门狗溢出时间约568.8ms(11.0592MHZ)
delay_ms(200);
led_on(LED_3); //点亮用户指示灯D3
while(1)
{
//软件延时200ms,该延时是模拟喂狗前实际执行用户应用代码所用时长
delay_ms(200);
//喂狗
WDG_Feed();
led_off(LED_3); //熄灭用户指示灯D3
led_toggle(LED_4); //翻转用户指示灯D4
//软件延时500ms,该延时是模拟喂狗后实际执行用户应用代码所用时长
delay_ms(500);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
总结
以上就是今天要讲的内容,本文简单介绍了:1、编写程序观察开启看门狗WDT后及时喂狗系统正常运行的现象。2、编写程序观察开启看门狗WDT但未及时喂狗系统复位的现象。
常见的单片机复位方式及其原理分析
为确保设计出的电路系统稳定可靠的工作,必须在电路中加入复位电路——将电路恢复到初始状态。类似于我们使用的电脑,一旦我们电脑死机或发生其他问题,我们会利用重启按钮重启我们的电脑。复位电路亦是如此,一旦我们按下复位按键,复位电路就会将系统恢复到初始状态。复位电路的一般组成是电容和电阻组合形式,少部分会用到三极管。
复位方式
1、上电复位/掉电复位
上电复位
当电源电压VCC低于上电/掉电复位电路的门槛电压时,所有的逻辑电路都会被复位。当VCC重新恢复到正常电压时,单片机延迟32768个时钟后,上电复位/掉电复位状态结束。
2、按键复位
3、软件复位
涉及的单片机系统在运行过程中,有时难免会遇到需要软件复位的情况。有些古老的单片机在硬件上可能不支持软件复位功能,所以我们就需要去模拟软件复位的过程。比较常用的方法是跳转到程序的入口地址,利用汇编LJMP、JMP等跳转语句跳到程序的初始入口。但是现在常用的一些单片机(8051、STM32等)在硬件上都支持软件复位,配置专门的寄存器就可以实现复位功能。例如常用的8051单片机,有专门的ISP_CONTER寄存器来支持复位。寄存器的具体配置参考如下。
ISP_CONTER
4、看门狗(WDT)复位
在工业应用中,绝大多数应用系统都会用到看门狗(Watch Dog Timer)。在工业控制/汽车电子/航空航天等高可靠系统中,为了防止系统在异常情况下受到干扰导致MCU长时间异常工作、程序跑飞,通常是引进看门狗。如果CPU不在规定时间内访问看门狗,看门狗就认为系统出了问题,会强制将系统进行复位,使系统从头开始执行程序。现在绝大多数的单片机都支持看门狗功能,例如STC89C52、STM32等。STC89C52单片机有专门的看门狗寄存器WDT_CONTER,配置相应的位即可启动看门狗。
看门狗
复位原理
无论使用上面的哪种复位方式,其本质都是在操作RST复位引脚。用8051单片机按键复位方式的图来说明复位电路的原理。8051单片机的RST引脚只需要保持2个机器周期的高电平即可产生复位。利用电容电压不可突变的性质,适当选取电容充放电的参数(电容值、电阻值)即可达到要求。刚开始上电时,由于电容电压(0V)不能突变,所以电容两端电压为0V,RST此时的电压为VCC。电容慢慢充电,充电结束后,电容两端的电压为VCC,所以此时RST的电势为0V。电容的这一段充电时间要大于单片机的2个机器周期。
软件复位和看门狗复位方式的原理都是使RST的高电平持续时间能够维持2个机器周期。
相关问答
STC单片机 如何禁止 看门狗 ?上电时只要不给看门狗初始化,就不会启动看门狗,启动看门狗后就不能关闭。上电时只要不给看门狗初始化,就不会启动看门狗,启动看门狗后就不能关闭。
51内核 单片机 几种类型的比较51内核 单片机 的几种型号都有什么...[最佳回答]它们各有各的特点,比如有各种增强功能,有的I/O口超多,有的有看门狗且防干扰,有的内嵌数模转换器,有的内含各种总线,等等等等,各有各的奇特功能.像你...
stc 15w408as用户手册?不知道你想问什么,stc15w408as单片机的isp接口可以理解为串口使用,在P3.0和P3.1上,需要配合STC_ISP软件使用,可以在软件上配置一些设置,如时钟,看门狗系数...
stc 15 单片机 的七种复位方式?51单片机复位的方法有哪些51单片机有五种常用的复位方法:1.上电制动复位,注意:只要电源的的上升时间不超过1ms,就可以实现自动上电复位。2.软...51单片机...
ATmega16 单片机 和PIC16F877 单片机 哪个更常用?选择哪个入门更好?但只针对这个问题,初学单片机编程,我推荐ATmega16单片机。其实单纯从变成角度来说,学那种单片机都可以,但是针对这个问题,我简单说一下选择AVR单片机的原因...
OLED 11C和12C有什么不同?-ZOL问答详情在众多的51系列单片机中,要算国内STC公司的1T增强系列更具有竞争力,因他不但和8051指令、管脚完全兼容,而且其片内的具有大容量程序存储器且是FLASH工艺的...
请问学习 单片机 用51 单片机 开发板好还是arm的开发板好?[回答]反之,如果你对一件事非常感兴趣,又愿意坚持去做这件事,那么你离成功不远了。学习单片机有一个特点:就是有很多“趣味性”,比如:点亮一个灯、显示一...
跪求:青龙湖预售中骏云景台89平,中骏云景台89平需要抢购吗??[回答]STC89C52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得STC89C52为...