小蜜蜂笔记
嵌入式开发与物联网应用教育践行者

【CC2530应用开发18】看门狗定时器间隔定时与程序监控

教学内容与重难点

【内容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】。

【视频教程】:CC2530的看门狗定时器

实训案例:看门狗定时器实现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);                 //死循环
}

【视频教程】:看门狗定时器实现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();
    }
  }
}

【视频教程】:看门狗监测程序运行

赞(3)
未经允许不得转载:小蜜蜂笔记 » 【CC2530应用开发18】看门狗定时器间隔定时与程序监控

小蜜蜂笔记 更专业 更方便 更高效

联系我们精品小店