「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但未及时喂狗系统复位的现象。
STC单片机的特性及缺点解析
STC单片机
说到STC单片机有人会说到,STC也能算主流,我们基于它是国内还算是比较不错的单片机来说。STC单片机是宏晶生产的单时钟/机器周期的单片机,说白了STC单片机是51与AVR的结合体,有人说AVR是51的替代单片机,但是AVR单片机在位控制和C语言写法上存在很大的差 异。而STC单片机洽洽结合了51和AVR的优点,虽然功能不及AVR那么强大,但是在AVR能找到的功能,在STC上基本都有,同时STC单片机是51内核,这给以51单片机为基础的工程师们提供了极大的方便,省去了学习AVR的时间,同时也不失AVR的各种功能。
STC单片机是高速、低功耗、超强抗干扰的新一代8051单片机51单片机,指令代码完全兼容传统8051,但速度快8-12倍,内部集成 MAX810专用复位电路。4路PWM 8路高速10位A、D转换,针对电机电机的供应商控制,强干扰场合,成为继51单片机后一个全新系列单片机。
特性
1、下载烧录程序用串口方便好用,容易上手,拥有大量的学习资料及视频,最著名的要属于昌晖仪表网的那个视频了,好多对单片机有兴趣的朋友都是通过这个视频入门的,同时具有宽电压:5.5~3.8V,2.4~3.8V, 低功耗设计:空闲模式,掉电模式(可由外部中断唤醒)。
2.STC单片机具有在应用编程,调试起来比较方便;带有10位AD、内部EEPROM、可在1T/机器周期下工作,速度是传统51单片机的8~12倍,价格也较便宜。
3、4通道捕获/比较单元,STC12C2052AD系列为2通道,也可用来再实现4个定时器或4个外部中断,2个硬件16位定时器,兼容普通8051的定时器。4路PCA还可再实现4个定时器,具有硬件看门狗、高速SPI通信端口、全双工异步串行口,兼容普通8051的串口,同时还具有先进的指令集结构,兼容普通8051指令集。
缺点
STC单片机功能虽不及AVR、STM32强大,价格也不及51和ST32便宜,但是这些并并不重要,重要的是这属于国产单片机比较出色的单片机,但愿国产单片机能一路长虹。
相关问答
at89c51是 stc 89c?AT89C51和STC89C51同属51系列单片机,引脚也相互兼容,但它们不是同一个公司生产的。AT89C是美国ATMEL的,STC89C是深圳宏晶研制的。Stc89c51可以兼容at89c51,....
STC 12C5A60S2 单片机 复位方式有哪些-ZOL问答5条回答:【推荐答案】STC12C5A60S2系列单片机有5种复位方式:外部RST引脚复位,外部低压检测复位(新增第二复位功能脚RST2复位,实现外部可调复位门槛电压复位)...
STC 芯片的RST脚的功能,具体点,谢谢?RST引脚的功能基本就是将程序计数器清零从新跑程序,因此一般都需要我们初始化寄存器的,当然,RST有时还用于做看门狗的输入端,如果指定时间没有喂狗则看门狗芯...
52 单片机 和51 单片机 有那些区别?51单片机51单片机是对所有兼容Intel8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8004单片机,后来随着Flashrom技术的发展,8004单片机取得...
stc 51和52引脚功能有区别么?高的波特率,定时...另外ram也不同,52多了一个定时器2,在串行通信中可以设置更高的波特率,定时器2的功能与其他两个定时器也不一样。52是51的增强型,S52比C51...
AT89C52芯片参数?89c52参数8k字节Flash,512字节RAM,32位I/O口线,看门狗定时器,内置4KBEEPROM,MAX810复位电路,3个16位定时器/计数器,4个外部中断,一个7向量4级中断结...
AT89S52 单片机 和 STC 89C52哪个下载程序更方便些?[最佳回答]当然是AT89S52下载程序方便些,他是在线ISP下载程序,不用频繁的插拔芯片,也省去了昂贵的编程器!STC单片机有多种类型,现以STC12系列为例说明。冷启...