CC2530 看门狗实验

实验内容

  • 编写一个程序,实现LED闪烁一次后常亮,然后给这个程序添加看门狗,通过按键喂狗,按下按键完成喂狗。

实验目的

  • 了解CC2530片内看门狗的工作原理;
  • 了解看门狗的作用;
  • 学会给自己的程序添加看门狗。

实验环境

实验所需硬件

序号 名称 数量 备注
1 电脑 1台 系统Windows7及以上
2 CC2530底座模块 1个 ·
3 LED模块 1个 ·
4 CC Debugger 仿真器和连接线 1套 ·
5 USB线 1根 ·
6 配套看门狗实验代码 1份 ·

实验所需软件

CC2530底座 & LED模块 & CC Debugger 仿真器和连接线

实验硬件

USB线

实验硬件

实验要求

  • 理解CC2530片上看门狗的工作流程;
  • 掌握WDCTL寄存器的功能以及配置方法。

实验原理

看门狗介绍

看门狗提供了更高的安全性、时间的精确性和使用的灵活性。看门狗主要用来检测和解决由软件错误引起的故障;当计数器达到给定的超时值时,触发一个中断或产生系统复位。CC2530的看门狗很简单,只需要配置1个寄存器WDCTL。功能如下表所示:

WDCTL功能说明

按照上图寄存器内容,我们对WDCTL具体配置可如下:

Init_Watchdog:
WDCTL = 0x00;//这是必须的,打开 IDLE 才能设置看门狗
WDCTL |= 0x08;//时间间隔一秒,看门狗模式
FeetDog:
WDCTL = 0xa0;//按寄存器描述来喂狗
WDCTL = 0x50;

硬件设计

连接原理图

连接原理图

实验步骤

① CC2530底座模块安装LED模块,用CC Debugger连接底座与计算机:

模块组装

② 轻按CCDebugger复位按键,指示灯变绿,表示连接正常。如下图:

模块组装

③ 访问github,进入github界面后点击Code,Clone HTTPS安全链接,如下图所示:

操作步骤

④ 打开电脑终端,进入工作目录workspace (workspace 为工程文件夹所在目录):

$ cd workspace

⑤ 运行clone命令:

$ git clone https://github.com/aiotcom/eps.git

下载目录至指定文件夹下。
如果提示“command not found”表示电脑没有安装Git,请至Git官网下载。
如果电脑没有安装 Git 软件,也可以进入Github,点击 Code -> DownLoad ZIP 下载所有工程代码。如下图所示:
下载代码
如果电脑没有公网,可以进:D盘\实验教程与代码选择相应的代码。

⑥ 打开 IAR Embedded Workbench 工程软件,点击工具栏: File -> Open -> Workspace,选择工程文件:CC2530基础实验\5.独立看门狗\IWDG.eww 并打开。

打开工程 选择文件

⑦ 点击Make按钮,重新编译文件,显示没有错误。

文件编译

⑧ 点击Download and Debug按钮,将程序下载到模块中。

下载程序

代码下载成功

⑨ 点击X退出仿真模式。

退出仿真

⑩ 移除CC Debugger仿真器,采用USB线供电。

采用USB线供电

⑪ 程序运行后,四个LED灯间隔500ms闪烁一次,因单片机看门狗没有喂狗,导致程序一直在复位。快速不间断的按下按键S1,LED灯会常亮,喂狗成功,程序没有复位。

代码讲解

① 程序目录结构,如下图。主要的工程文件是delay.c、KEY.c、IWDG.c、LED.c、main.c。

代码目录结构

② main.c:主函数main(),完成硬件的初始化,及整个代码逻辑控制。

void main(void)
{
    Hal_Init_32M();//初始化32M时钟
    LED_Init();//LED初始化
    KEY_Init();//按键初始化
    Init_Watchdog();//看门狗初始化(喂狗间隔1s)

    delay_ms(500);
        
    while(1)
    {
        if(KEY_Scan(0) == S1_PRES)//按键S1按下,进行喂狗
        {
            FeetDog();//看门狗喂狗  
        }
        LED_ON();
    }
}

③ LED.c为LED驱动代码,代码实现对LED灯控制的IO进行初始化设置IO口输出模式。

void LED_Init(void)
{
    P0DIR |= 0x0C;//P0.2、P0.3定义为输出
    P1DIR |= 0xC0;//P1.6、P1.7定义为输出
    LED_OFF(); 
}

④ IWDG.c为看门狗驱动。初始化化看门狗溢出复位时间1秒,即1秒内没有喂狗单片机复位,FeetDog()喂狗函数,调用该函数清除看门狗计数器。

void Init_Watchdog(void) 
{ 
    WDCTL = 0x00;//这是必须的,打开IDLE才能设置看门狗
    WDCTL |= 0x08;//时间间隔一秒,看门狗模式  
}
void FeetDog(void) 
{
    WDCTL = 0xa0; 
    WDCTL = 0x50; 
}

⑤ KEY.c为LED模块上的按键驱动,在Key_Init()函数中初始化按键的IO为输入上拉。

void KEY_Init(void)
{
    P0SEL &= ~0x03;//设置P0.0、P0.1为普通IO口  
    P0DIR &= ~0x03;//按键接在P0.0、P0.1口上,设P0.0、P0.1为输入模式 
    P0INP &= ~0x03;//打开P0.0、P0.1上拉电阻
        
    P1SEL &= ~0x30;//设置P1.4、P1.5为普通IO口  
    P1DIR &= ~0x30;//按键接在P1.4、P1.5口上,设P1.4、P1.5为输入模式 
    P1INP &= ~0x30;//打开P1.4、P1.5上拉电阻
}

⑥ 按键扫描函数Key_Scan(),完成按键的扫描,当按键按下,返回按键的键值。

uint8_t KEY_Scan(uint8_t mode)
{
    static uint8_t key_up=1;//按键松开标志
    if(mode==1)key_up=1;//支持连按
    if(key_up&&(S1_Read()==0||S2_Read()==0||S3_Read()==0||S4_Read()==0))
    {
        delay_ms(10);
        key_up=0;
        if(S1_Read()==0)       return S1_PRES;
        else if(S2_Read()==0)  return S2_PRES;
        else if(S3_Read()==0)  return S3_PRES;  
        else if(S4_Read()==0)  return S4_PRES;
    }else if(S1_Read()==1&&S2_Read()==1&&S3_Read()==1&&S4_Read()==1)key_up=1;
            
    return 0;//无按键按下
}

常见问题

  1. 弹出警告窗口,不能下载程序。

    • 请确认CCDebugger驱动否安装。
    • 轻按CCDebugger仿真器的按键,指示灯不是绿色连接有问题。
    • CCDebugger仿真器是否正常接入到底座,参考实验步骤第一步。
  2. 下载代码后程序没观察到实验现象。

    • 请重新上电,或者按下底座上的复位按键。
    • 模块没有安装稳妥。

实验思考

  1. 实现代码自动喂狗,当按键S1按下后,停止喂狗。