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

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

程序员文章站 2022-06-11 18:50:13
...

1 理论分析

1.1 CC2530 的 Timer1 介绍

定时器 1 是一个独立的 16 位定时器,支持典型的定时/计数功能,比如输入捕获,输出比较和 PWM 功能。定时器有五个独立的捕获/比较通道。每个通道定时器使用一个 I/O 引脚。定时器用于范围广泛的控制和测量应用,可用的五个通道的正计数/倒计数模式将允许诸如电机控制应用的实现。
定时器 1 的功能如下:
 五个捕获/比较通道
 上升沿、下降沿或任何边沿的输入捕获
 设置、清除或切换输出比较
 *运行、模或正计数/倒计数操作
 可被 1,8,32 或 128 整除的时钟分频器
 在每个捕获/比较和最终计数上生成中断请求
 DMA 触发功能
图1是 CC2530 的 Timer1 的所有功能图,在 CC2530 的 Timer1 的所有功能中,我们用得最多的就是:

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

图 1 CC2530 的 Timer1 功能图16 位计数器

 定时器 1 操作(查询方式)
 定时器 1 中断
其中,16 位计数器将会在红外解码(VS1838)里讲解;定时器 1 操作(查询方式) 就在本实验里讲解;定时器 1 中断将会下一讲里讲解。
最后说明一下,就是 CC2530 的 Timer1 的使用,都是要通过配置相应的寄存器来实现相应功能的,故在附录里我们给出操作 Timer1 的所有寄存器的类型及其具体内容。

2 实验详解

2.1实验目的

1)、通过实验掌握CC2530 芯片GPIO 的配置方法
2)、掌握Led 驱动电路及开关Led 的原理
3)、掌握定时器T1 的配置与使用

2.2实验设备

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

2.3实验相关电路图

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

图2 LED电路图

2.4 实验相关寄存器

(1) 首先,CC2530 的 Timer1 用于查询方式时,需要配置的寄存器有:T1CTL;而溢出标志 IRCON 是我们用于查询的。
(2) 然后,由于 CC2530 在没有配置工作时钟时默认是 2 分频,即系统将工作时钟为 16MHz。所以我们希望 Timer1 配置为:128 分频;*运行,从 0x0000 到 0xFFFF反复计数;所以,根据 T1CTL、T1STAT 的定义,控制字应该为:
T1CTL = 0x0d; //128 分频;*运行,从 0x0000 到 0xFFFF 反复计数;
需要配置三个寄存器T1CTL、T1STAT、IRCON。如表1、2、3所示:

表1 定时器1的控制与状态

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

表2 定时器1的状态

T1STAT(0xAF)-定时器1状态
第二部分 基础篇-第4章 定时器 - CC2530查询方式使用定时器T1

表3 中断标志

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

按照表格寄存器的内容,对Led1 和T1 进行配置。
Led1 配置如下:
P1SEL &=~0x01; //配置P1.0 为通用IO 口
P1DIR |= 0x01; //配置P1.0 为输出
T1 配置如下:
T1CTL = 0x0d; //128 分频,自动重装0x0000-0xFFFF
T1STAT= 0x21; //通道0,中断有效
注意: 系统在不配置工作频率时默认为 2 分频,即 32M/2=16M,所以定时器每次溢出时间 T=1/(16M/128)*65536≈0.5s, 所以总时间 Ta=T*count=0.5*1=0.5S 切换 1 次状态。 所以看起来是 1S 闪烁 1 次。

2.5参考代码

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

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

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

/**函数声明*********************************************************************/
void InitLed(void);     //初始化P1口
void InitT1();                  //初始化定时器T1


/**
  * @brief     主函数
  * @param     None
  * @retval    None
  */
void main(void)
{
  uchar count=0;
  InitLed();        //调用初始化函数
  InitT1();
  while(1)
  {
    if(T1IF>0)
    {
      T1IF=0;
      if(++count==1)      //约1s周期性闪烁
      {
        count=0;
        LED1 = !LED1;        //LED1闪烁        
      }
    }
  }
}


/**
  * @brief     初始化IO
  * @param     None
  * @retval    None
  */
void InitLed(void)
{
  P1DIR |= 0x03;  //P1_0定义为输出
  LED1 = 1;       //LED1灯初始化熄灭

}

/**
  * @brief     定时器函数
  * @param     None
  * @retval    None
  */
void InitT1() //系统不配置工作时钟时默认是2分频,即16MHz
{
  T1CTL = 0x0d;          //128分频,自动重装 0X0000-0XFFFF 
  T1STAT= 0x21;          //通道0, 中断有效   
}

注意:T1IF也可用IRCON替换。看看图3就明白了,TRCON为总中断标志位,而T1IF为分中断标志位。建议使用分中断标志位。

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

图3中断标志

2.6实验现象

通过定时器T1查询方式使得LED1定时闪烁。

2.7实验总结

通过本实验,大家需要掌握以下 3 点:
 CC2530 定时器的使用需要配置相关寄存器;
 CC2530 定时器的寄存器类型以及每个类型如何配置。
 定时器 1 的功能如下:
(1)五个捕获/比较通道
(2)上升沿、下降沿或任何边沿的输入捕获
(3)设置、清除或切换输出比较
(4)*运行、模或正计数/倒计数操作
(5)可被 1,8,32 或 128 整除的时钟分频器
(6)在每个捕获/比较和最终计数上生成中断请求
(7)DMA 触发功能

附:管理 Timer1 的寄存器类型

●T1CNTH –定时器 1 计数高位
●T1CNTL –定时器 1 计数低位
●T1CTL –定时器 1 控制
●T1STAT –定时器 1 状态
●T1CCTLn –定时器 1 通道 n 捕获/比较控制
●T1CCnH –定时器 1 通道 n 捕获/比较高位值
●T1CCnL –定时器 1 通道 n 捕获/比较低位值

本章参考代码

点击进入

相关标签: 定时器 CC2530