CC2530 定时器实验

实验内容

  • 使用IAR Embedded Workbench编写程序,使用定时器中断,使得每隔1秒四个LED灯闪烁一次。

实验目的

  • 认识定时器和定时器中断,了解和掌握其原理和应用;
  • 区别循环延时和使用定时器的区别。

实验环境

实验所需硬件

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

实验所需软件

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

实验硬件

USB线

实验硬件

实验要求

  • 认识CC2530的定时/计数器中断系统,理解CC2530的定时/计数器中断系统的不同工作方式;
  • 掌握T1CTL、T1stat、IRCON三个寄存器的功能和配置方式;
  • 相同的实验效果,区别使用延时实现LED闪烁和使用定时器实现LED闪烁的区别;
  • 画出两种方式实现LED闪烁的程序流程图。

实验原理

定时器简介

定时/计数器是一种能够对内部时钟信号或外部输入信号进行计数,当计数值达到设定要求时,向CPU提出中断请求,从而实现定时或者计数功能的外设。

定时/计数器的最基本工作原理是进行计数。不管是定时器还是计数器,本质上都是计数器,可以进行加1(减1)计数,每出现一个计数信号,计数器就会自动加1(减1),当计数值从0变成最大值(或从最大值变成0)溢出时,定时/计数器就会向CPU提出中断请求。

CC2530共有5个定时/计数器,定时器1是一个16位的定时器,为CC2530中功能最全的一个定时/计数器,在应用中应优先选用,其工作模式有三种:

  • 自由运行模式:计数器从0x0000开始,在每个活动时钟边沿增加1,当计数器达到0xFFFF时溢出,计数器重新载入0x0000并开始新一轮的递增计数。该模式的计数周期是固定值0xFFFF,当达到最终计数值0xFFFF时,标志位T1IF和OVFIF被设置。
  • 模模式:计数器从0x0000开始,在每个活动时钟边沿增加1,当计数器达到T1CC0寄存器保存的值时溢出,计数器又将从0x0000开始新一轮的递增计数, 模模式的计数周期可由用户自行设定。
  • 正计数/倒计数模式:计数器反复从0x0000 开始,正计数到TICC0保存的最终计数值,然后再倒计数回0x0000,当达到最终计数值时,标志位T1IF和OVFIF被设置。

CC2530的定时/计数器中断系统定时器有3种情况能产生中断请求:

  • 计数器达到最终计数值(溢出或回到零);
  • 输入捕获事件;
  • 输出比较事件(模模式时使用)。

使用模模式要特别注意,需要开启通道0的输出比较模式,否则计数器的值达到T1CC0后,是不会产生溢出中断的。

寄存器说明

按照表格寄存器内容,我们对LED7、LED8和定时器1寄存器进行配置,通过定时器T1查询方式控制LED闪烁。

定时器1初始化:

T1CC0L = 0x7D;//设置最大计数值的低8位
T1CC0H = 0x00;//设置最大计数值的高8位
T1CCTL0 |= 0x04;//开启通道0的输出比较模式
T1IE = 1;//使能定时器1中断
T1OVFIM = 1;//使能定时器1溢出中断
EA = 1;//使能总中断
T1CTL = 0x0e;//分频系数是128,模模式

硬件设计

连接原理图

连接原理图

实验步骤

① 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基础实验\3.定时器\Time.eww 并打开。

打开工程

选择文件

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

文件编译

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

下载程序

代码下载成功

⑨ 点击X退出仿真模式。

退出仿真

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

采用USB线供电

⑪ 观察LED模块上的实验现象:四个LED灯同时间隔1秒闪烁(即:四个LED灯同时亮,同时灭)。

代码讲解

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

代码目录结构

② main.c:主函数main(),完成硬件的初始化,及整个代码逻辑控制,Timer1_Sevice()为定时器中断服务函数,定时器中断服务函数响应定时器中断。

void main(void)
{
    uint8_t state = 0;
    Hal_Init_32M();//初始化系统时钟32M
    LED_Init();//初始化LED模块LED灯控制接口
    Init_Timer1();//定时器初始化中断周期为1000KHZ,即周期1ms
        
    while(1)
    {     
        /*count 在定时器1中断服务函数中计数*/
        if(count>=1000)//5秒
        {
            count  = 0;//清0,从0开始计数
            state = 1 - state;
            if(state == 1){
                LED_ON();
            }
            else if(state == 0){
                LED_OFF();
            }          
        }//if(count>=5000)
    }
}
#pragma vector = T1_VECTOR
__interrupt void Timer1_Sevice(void)
{
    T1STAT &= ~0x01;//清除定时器1通道0中断标志
    count++;
}

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

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

常见问题

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

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

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

实验思考

  1. 以定时器为基准使用四个LED灯5000ms周期闪烁。

  2. 以定时器为基准使用LED1使用500ms周期闪烁,LED2 2000ms闪烁。