欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

第二部分 基础篇-第4章 定时器-CC2530查询方式使用定时器T3

程序员文章站 2022-06-11 18:44:31
...

1 理论分析

1.1 CC2530 的 Timer3 介绍

定时器 3 和 4 是两个 8 位的定时器。每个定时器有两个独立的比较通道,每个通道上使用一个 I/O 引脚。
定时器 3/4 的特性如下:
 两个捕获/比较通道
 设置、清除或切换输出比较
 时钟分频器,可以被 1,2,4,8,16,32,64,128 整除
 在每次捕获/比较和最终计数事件发生时产生中断请求
 DMA 触发功能
图1是 CC2530 的 Timer3、Timer4 的所有功能图,在 CC2530 的 Timer3、Timer4的所有功能中,我们用得最多的就是:
 8 位定时器计数器
 定时器 3 和定时器 4 操作(查询方式)
 定时器 3 和定时器 4 中断
其中, 8 位定时器计数器我们将不会讲解, 我们只讲解 Timer1 的 16 位计数器操作;定时器 3 和定时器 4 操作(查询方式)就在本实验里讲解;定时器 3 和定时器 4 中断将会在 Timer3+LED(中断方式)里讲解。
最后说明一下,就是 CC2530 的 Timer3、Timer4 的使用,都是要通过配置相应的寄存器来实现相应功能的,故在附录里我们给出操作 Timer3、Timer4 的所有寄存器的类型及其具体内容。

第二部分 基础篇-第4章 定时器-CC2530查询方式使用定时器T3

图 1 CC2530 的 Timer3、Timer4 功能图

2 实验详解

2.1实验目的

1)、了解 CC2530 定时器 3;
2)、初步掌握定时器 3 的应用

2.2实验设备

硬件:PC 机一台 ZB2530(底板、核心板、仿真器、USB 线) 一套
软件:2000/XP/win7 系统,IAR 8.10 集成开发环境

2.3实验相关电路图

第二部分 基础篇-第4章 定时器-CC2530查询方式使用定时器T3

图2 LED电路图

2.4 实验相关寄存器

(1) 首先,CC2530 的 Timer3 用于查询方式时,需要配置的寄存器有:T3CTL,。
(2) 然后,由于 CC2530 在没有配置工作时钟时默认是 2 分频,即系统将工作时钟为 16MHz。所以我们希望 Timer3 配置为:128 分频;启动定时器,中断使能(无影响),从 0x00 到 0xFF 反复计数。
相关寄存器如下:

表1 T3CTL控制

第二部分 基础篇-第4章 定时器-CC2530查询方式使用定时器T3

表2 中断标志

第二部分 基础篇-第4章 定时器-CC2530查询方式使用定时器T3

(3) 跟 Timer3 有关的寄存器还有 IRCON。我们在查询是否有溢出中断时就是查看它有没有置位的,在上个实验中,我们直接查询 IRCON,这是可以的,但是如果有几个定时器申请中断时,直接查询 IRCON 会有冲突,所以,本实验给出另一个更为严谨的做法,就是查询 T3IF。
按照表格寄存器的内容,对Led1 和T1 进行配置。
Led1 配置如下:
P1DIR |= 0x01; //配置P1.0 为输出
T3 配置如下:
T3CTL = 0xF8; //128分频;*运行,从0x00到0xFF反复计数

2.5 参考代码

/**Includes*********************************************************************/
#include <ioCC2530.h>

/**宏定义***********************************************************************/
//定义数据类型
#define uint unsigned int
#define uchar unsigned char

//定义控制LED1灯的端口
#define LED1 P1_0      //LED1为P1_0端口控制

/**函数声明*********************************************************************/

void InitLed(void);    //初始化LED端口
void InitT3(void);     //初始化定时器T3

/**
  * @brief     主函数
  * @param     None
  * @retval    None
  */
void main(void)
{
    uchar count=0;

    InitLed();      //LED_IO初始化
    InitT3();           //Timer3初始化

    while(1)
    {
        if(T3IF>0)    //查询溢出标志
        { 
            T3IF=0;
            if((++count)==254)      //溢出一次约为0.5s
            {
                count=0;
                LED1 = ~LED1;        //LED1取反   

            }
        } 
    }
}

/**
  * @brief     LED_IO初始化函数
  * @param     None
  * @retval    None
  */
void InitLed(void)
{
    P1DIR |= 0x01;  //P1端口定义为输出
    LED1 = 1;       //LED灯初始化熄灭

}

/**
  * @brief     Timer3初始化函数
  * @param     None
  * @retval    None
  */
void InitT3(void)        
{
    T3CTL = 0xF8;   //128分频;*运行,从0x00到0xFF反复计数 
}

2.6实验现象

编译下载程序到开发板上,可看到LED 灯每隔一定时间切换一次亮灭状态。

2.7 实验总结

通过本实验,大家需要掌握以下 3 点:
 CC2530 定时器的使用需要配置相关寄存器;
 CC2530 定时器的寄存器类型以及每个类型如何配置。
 定时器 3/4 的特性如下:
(1) 两个捕获/比较通道
(2) 设置、清除或切换输出比较
(3) 时钟分频器,可以被 1,2,4,8,16,32,64,128 整除
(4) 在每次捕获/比较和最终计数事件发生时产生中断请求
(5) DMA 触发功能

附:管理 Timer3、Timer4 的寄存器类型

●T3CNT (0xCA)–定时器 3 计数器
●T3CTL (0xCB)–定时器 3 控制
●T3CCTL0 (0xCC)–定时器 3 通道 0 捕获/比较控制
●T3CC0 (0xCD)–定时器 3 通道 0 捕获/比较值
●T3CCTL1 (0xCE)–定时 3 通道 1 捕获/比较控制
●T3CC1 (0xCF)–定时器 3 通道 1 捕获/比较值
●T4CNT (0xEA) –定时器 4 计数器
●T4CTL (0xEB)–定时器 4 控制
●T4CCTL0 (0xEC)–定时器 4 通道 0 捕获/比较控制
●T4CC0 (0xED) –定时器 4 通道 0 捕获/比较值
●T4CCTL1 (0xEE)–定时 4 通道 1 捕获/比较控制
●T4CC1 (0xEF) –定时器 4 通道 1 捕获/比较值
●TIMIF (0xD8)–定时器 1/3/4 中断屏蔽/标志

本章参考代码

点击进入