《ZigBee开发笔记》第二部分 基础篇-第4章 定时器-CC2530查询方式使用定时器T3

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u013162035/article/details/78918657

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 的所有寄存器的类型及其具体内容。

这里写图片描述

图 1 CC2530 的 Timer3、Timer4 功能图

2 实验详解

2.1实验目的

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

2.2实验设备

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

2.3实验相关电路图

这里写图片描述

图2 LED电路图

2.4 实验相关寄存器

(1) 首先,CC2530 的 Timer3 用于查询方式时,需要配置的寄存器有:T3CTL,。

(2) 然后,由于 CC2530 在没有配置工作时钟时默认是 2 分频,即系统将工作时钟为 16MHz。所以我们希望 Timer3 配置为:128 分频;启动定时器,中断使能(无影响),从 0x00 到 0xFF 反复计数。

相关寄存器如下:

表1 T3CTL控制

这里写图片描述

表2 中断标志

这里写图片描述

(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 中断屏蔽/标志

本章参考代码

点击进入

展开阅读全文

没有更多推荐了,返回首页