教学内容与重难点
【内容01】了解看门狗的基本工作原理。
【内容02】掌握CC2530看门狗定时器的特性与寄存器定义。
【内容03】完成实训项目:看门狗定时器实现1秒定时。
——–学生实践实操,老师讲解演示。
【内容04】完成实训项目:看门狗监测程序运行。
——–学生实践实操,老师讲解演示。
【重点】实训项目:看门狗定时器实现1秒定时 。
【重点】实训项目:看门狗监测程序运行 。
【难点】CC2530看门狗定时器的喂狗参数设置和喂狗序列的实现。
教学单元核心内容与学习资源
看门狗的工作原理
【1】WDT:WatchDog Timer,本质上是一个计数器,可以监测系统的运行情况,在程序“跑飞”的情况下,实现自动复位。
【2】程序正常运行过程中,每隔一段时间内核发出指令让看门狗重新开始计数,也称为喂狗。只要在设定的最大间隔时间内,通过喂狗复位计数器,系统就不会复位。
【3】当系统受到干扰导致程序跑飞,或者软件存在漏洞没有按预定设计执行,设定的最大喂狗时间内没有进行定时器复位,看门狗则溢出,系统自动复位。
CC2530的看门狗定时器
【1】15位计数器,工作在32KHz的时钟频率,系统复位时禁用。
【2】4个定时间隔:1s、0.25s、15.625ms、1.9ms。
【3】2种工作模式:看门狗模式、定时器模式。
【喂狗序列】:在一个看门狗时钟周期内,写入0xA到WDCTL.CLR[3:0],然后写入0x5到同一个寄存器位。
看门狗控制寄存器 WDCTL。
详见:【工作手册】《CC2530微控制器应用开发速查宝典》【45】。
实训案例:看门狗定时器实现1秒定时
新建工程,编写代码,在XMF09B/XMF09C开发套件上,完成以下任务:
1-将看门狗定时器设置成定时器模式。
2-定时周期选择1秒。
3-在看门狗中断服务函数中,切换D4灯的开关状态。
/*===================看门狗定时器初始化函数====================*/
void Init_WDT()
{
//看门狗设置为通用定时器模式,间隔时间1秒
WDCTL = 0x0C; //0000 1100
//使能看门狗定时器中断
IEN2 |= 0x20; //0010 0000
//使能总中断
EA = 1;
}
/*=================看门狗定时器中断服务函数====================*/
#pragma vector = WDT_VECTOR
__interrupt void Service_WDT()
{
WDTIF = 0; //清除看门狗中断标志位
D4 = ~D4;
}
/*==========================主函数============================*/
void main()
{
Init_Port(); //端口初始化
Init_WDT(); //看门狗定时器初始化
while(1); //死循环
}
实训案例: 看门狗监测程序运行
新建工程,编写代码,在XMF09B/XMF09C开发套件上,完成以下任务:
1-初始化看门狗定时器为看门狗模式,喂狗时间为1秒。
2-设计LED灯检测函数,4个灯同时点亮,延时,再同时熄灭。
3-设计带喂狗功能的闪灯函数,D4亮,延时,D4灭,延时,喂狗。
4-设计不带喂狗功能的闪灯函数,D6亮,延时,D6灭,延时。
5-在主函数中,首先检测LED的工作状态,然后进入死循环,先执行8次带喂狗功能的闪灯函数,再执行8次不带喂狗功能的闪灯函数。
/*===================看门狗定时器初始化函数====================*/
void Init_WDT()
{
//看门狗设置为看门狗模式
WDCTL = 0x08; //0000 1000
}
/*========================喂狗序列函数=========================*/
void Feed_Dog()
{
WDCTL |= 0xA0;
WDCTL |= 0x50;
}
/*=====================带喂狗的闪灯函数========================*/
void Shan_Feed()
{
D4 = 1;
Delay(60000);
Delay(60000);
D4 = 0;
Delay(60000);
Delay(60000);
Feed_Dog();
}
/*=======================普通闪灯函数==========================*/
void Shan()
{
D6 = 1;
Delay(60000);
Delay(60000);
D6 = 0;
Delay(60000);
Delay(60000);
}
/*==========================主函数============================*/
unsigned int i;
void main()
{
Init_Port(); //端口初始化
Init_WDT(); //看门狗初始化
LED_Check(); //灯光检测
while(1)
{
for(i = 0; i < 8; i++) //执行8次带喂狗的闪灯函数
{
Shan_Feed();
}
for(i = 0; i < 8; i++) //执行8次普通闪灯函数,无喂狗
{
Shan();
}
}
}