打印
[Zigbee]

CC2530查询方式使用定时器T1

[复制链接]
857|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gwsan|  楼主 | 2019-7-31 10:54 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1 理论分析
1.1 CC2530 的 Timer1 介绍
定时器 1 是一个独立的 16 位定时器,支持典型的定时/计数功能,比如输入捕获,输出比较和 PWM 功能。定时器有五个独立的捕获/比较通道。每个通道定时器使用一个 I/O 引脚。定时器用于范围广泛的控制和测量应用,可用的五个通道的正计数/倒计数模式将允许诸如电机控制应用的实现。

定时器 1 的功能如下:

        五个捕获/比较通道
        上升沿、下降沿或任何边沿的输入捕获
        设置、清除或切换输出比较
        自由运行、模或正计数/倒计数操作
        可被 1,8,32 或 128 整除的时钟分频器
        在每个捕获/比较和最终计数上生成中断请求
        DMA 触发功能


使用特权

评论回复

相关帖子

沙发
gwsan|  楼主 | 2019-7-31 10:55 | 只看该作者

图1是 CC2530 的 Timer1 的所有功能图,在 CC2530 的 Timer1 的所有功能中,我们用得最多的就是:

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

        定时器 1 操作(查询方式)

        定时器 1 中断


其中,16 位计数器将会在红外解码(VS1838)里讲解;定时器 1 操作(查询方式) 就在本实验里讲解;定时器 1 中断将会下一讲里讲解。


最后说明一下,就是 CC2530 的 Timer1 的使用,都是要通过配置相应的寄存器来实现相应功能的,故在附录里我们给出操作 Timer1 的所有寄存器的类型及其具体内容。



使用特权

评论回复
板凳
gwsan|  楼主 | 2019-7-31 10:55 | 只看该作者
2 实验详解
2.1实验目的
1)、通过实验掌握CC2530 芯片GPIO 的配置方法
2)、掌握Led 驱动电路及开关Led 的原理
3)、掌握定时器T1 的配置与使用

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

使用特权

评论回复
地板
gwsan|  楼主 | 2019-7-31 10:56 | 只看该作者
2.3实验相关电路图

图2 LED电路图

使用特权

评论回复
5
gwsan|  楼主 | 2019-7-31 10:56 | 只看该作者
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的控制与状态


表2 定时器1的状态
T1STAT(0xAF)-定时器1状态



表3 中断标志


按照表格寄存器的内容,对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=Tcount=0.5*1=0.5S 切换 1 次状态。 所以看起来是 1S 闪烁 1 次。


使用特权

评论回复
6
gwsan|  楼主 | 2019-7-31 10:57 | 只看该作者
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, 中断有效   
}

使用特权

评论回复
7
gwsan|  楼主 | 2019-7-31 10:57 | 只看该作者

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

图3中断标志

使用特权

评论回复
8
gwsan|  楼主 | 2019-7-31 10:58 | 只看该作者
2.6实验现象
通过定时器T1查询方式使得LED1定时闪烁。

使用特权

评论回复
9
gwsan|  楼主 | 2019-7-31 10:58 | 只看该作者
2.7实验总结
通过本实验,大家需要掌握以下 3 点:

        CC2530 定时器的使用需要配置相关寄存器;
        CC2530 定时器的寄存器类型以及每个类型如何配置。
        定时器 1 的功能如下:

(1)五个捕获/比较通道
(2)上升沿、下降沿或任何边沿的输入捕获
(3)设置、清除或切换输出比较
(4)自由运行、模或正计数/倒计数操作
(5)可被 1,8,32 或 128 整除的时钟分频器
(6)在每个捕获/比较和最终计数上生成中断请求
(7)DMA 触发功能

使用特权

评论回复
10
gwsan|  楼主 | 2019-7-31 11:21 | 只看该作者
附:管理 Timer1 的寄存器类型
●T1CNTH –定时器 1 计数高位
●T1CNTL –定时器 1 计数低位
●T1CTL –定时器 1 控制
●T1STAT –定时器 1 状态
●T1CCTLn –定时器 1 通道 n 捕获/比较控制
●T1CCnH –定时器 1 通道 n 捕获/比较高位值
●T1CCnL –定时器 1 通道 n 捕获/比较低位值

使用特权

评论回复
11
conjunction| | 2019-7-31 14:05 | 只看该作者
感谢楼主分享!很不错的经验

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

68

主题

3426

帖子

1

粉丝