CC2541蓝牙学习——定时器1的捕获/比较功能
CC2541定时器1有5个捕获/比较通道,首先介绍什么是捕获和比较功能。
捕获通道:
设置的捕获开始的时候,CPU会将计数寄存器的值复制到捕获比较寄存器中并开始计数,当再次捕捉到电平变化时,这时
计数寄存器中的值减去刚才复制的值就是这段电平的持续时间,你可以设置上升沿捕获、下降沿捕获、或者上升沿下降沿
都捕获。捕获通道可以用来测量信号的频率周期或者波形的宽度,捕获通道类似于秒表的功能。
比较通道:
这里有两个单元:一个计数器单元和一个比较单元,比较单元就是个双缓冲寄存器,比较单元的值是可以根据不同的模式
设置的,与此同时,计数器在不停的计数,并不停的与比较寄存器中的值进行比较,当计数器的值与比较寄存器的值相等
的时候一个比较匹配就发生了,根据设置,可以产生不同的波形。对于定时器1,计数器单元就是2个8位的SFR:T1CNTH
和T1CNTL,比较单元就是2个8位的寄存器T1CCxH和T1CCxL(x:0~4)。而对于定时器3(4),计数器单元是寄存器
T3CNT(T4CNT),比较单元是寄存器T3CC0和T3CC1(T4CC0和T4CC1)。比较通道可以用来产生特定的波形,输
出PWM波,比较通道类似于闹钟的功能。
CC2541的输入捕获功能
输入捕获功能一般用的比较少,当定时器1的某一个通道被配置为输入捕获通道,那么对应的I/O引脚则自动配置为输入,不
需要再通过配置寄存器PxDIR设定为输入,在定时器开始计数后,在外部输入信号的上升沿、下降沿或者两个沿到来时触
发16位的计数器T1CNT的计数值装入对应通道的捕获/比较寄存器T1CCxH:T1CCxL。注意根据沿到来的时间间隔选择合
理的定时器时钟,假如外部信号每隔几us沿发生变化,但是定时器的时钟周期是几ms,显然捕获不到外部的沿变化。具体
应用时,可以在中断服务程序里把通道的捕获值T1CCxH:T1CCxL读到一个变量里,如果要测量一个信号的频率,可以将
第二次捕获的变量减去第一次捕获的变量,得到的是信号的周期,倒数就是频率。但是有一个问题,假如说两次捕获的上升
沿(或下降沿)的时间间隔大于时钟的周期,定时器溢出又从0x0000开始计数,那么这两次的计数值之差肯定就不对了,
所以在应用之前还得估计一下外部信号的周期以选择合适的时钟周期,太麻烦了!所以一般来说我们不用它来测量脉宽或者信号周期频
率。这个输入捕获功能当做触发用特别合适,当检测到外部信号的沿变化时,在中断服务程序里完成相应的功能,比如触发
采集。
另外注意:输入捕获功能,在读取T1CCxH:T1CCxL时,必须先读取T1CCxL,再读取T1CCxH
下面重点讲解定时器1的通道输出比较功能。
CC2541的输出比较功能:
在输出比较模式时,I/O引脚被配置为输出功能,不需要再通过配置寄存器PxDIR设定为输出引脚,在定时器开始工作后,计数
值不断和对应通道的捕获/比较寄存器T1CCxH:T1CCxL比较,如果两者相等,那么输出引脚就会根据T1CCTLn.CMP的配置发生
置1、清0、翻转等变化。T1CCTLn.CMP的定义根据通道的不同也不一样,比如通道1寄存器T1CCTL1定义如下:
T1CCTL1.MODE是选择定时器1通道的模式,1:输出比较模式,0:输入捕获模式
T1CCTL1.IM是通道的中断使能标志,1:开通道中断,0:关通道中断
T1CCTL1.CAP用来选择输入捕获沿的选择, 当通道处于输出比较模式时,T1CCTL1.CAP配置为00
- 01:上升沿捕获
- 10:下降沿捕获
- 11:上升沿和下降沿都捕获
T1CCTL1.CMP是输出比较模式的选择,对于通道1来说有7种模式,分别为
- 000:当计数值等于T1CCxH:T1CCxL时,输出引脚置1
- 001:当计数值等于T1CCxH:T1CCxL时,输出引脚清0
- 010:当计数值等于T1CCxH:T1CCxL时,输出引脚电平翻转
- 011:在正计数/倒计数模式下,在计数增加阶段,当计数值等于T1CCxH:T1CCxL时,输出引脚置1,在计数递减阶段,当计数值等于T1CCxH:T1CCxL时,输出引脚清0
- 在其他模式下,当计数值等于T1CCxH:T1CCxL时,输出引脚置1,当计数值等于0x0000时,输出引脚清0
- 100:在正计数/倒计数模式下,在计数增加阶段,当计数值等于T1CCxH:T1CCxL时,输出引脚清0,在计数递减阶段,当计数值等于T1CCxH:T1CCxL时,输出引脚置1
- 在其他模式下,当计数值等于T1CCxH:T1CCxL时,输出引脚清0,当计数值等于0x0000时,输出引脚置1
- 101:当计数值等于T1CCxH:T1CCxL时,输出引脚置1;当计数值等于T1CC0H:T1CC0L时,输出引脚清0
- 110:当计数值等于T1CCxH:T1CCxL时,输出引脚清0;当计数值等于T1CC0H:T1CC0L时,输出引脚置1
- 111:初始化输出比较引脚的电平
通道0的输出比较功能比较少,如下图所示,这是因为T1CC0H:T1CC0L在模式6和模式7下有特殊的功能,这就意味着这两种模式对于通道0不可用
所以要生成较复杂的波形,一般都不用通道0。
比较输出引脚会在下面两种情况下被初始化
- 往定时器1的计数器低字节T1CNTL 写入任何值,并且会导致计数器被清除为0x0000
- T1CCTLn.CMP设置为111
初始化值如下表,在不同模式下,初始值不同
接下来看下,定时器1在自由运行模式、模模式、正计数/倒计数模式下的输出波形
自由运行模式
我们可出,除了模式000、001、010,其他的模式输出的波形周期都是0xffff个计数时间,所以周期和定时器1的计时频率有关,也就是和T1CTL.DIV及CLKONCMD寄存器有关。
周期:0xffff
占空比:T1CCn/T1CC0或者1-T1CCn/T1CC0
模模式
我们可出,除了模式000、001、010,在定时器时钟频率一定的情况下,其他的模式输出的波形周期和寄存器T1CC0有关
周期:T1CC0
占空比:T1CCn/T1CC0或者1-T1CCn/T1CC0
正计数/倒计数模式
周期:2*T1CC0
占空比:010和100——T1CCn/T1CC0;011——1-T1CCn/T1CC0;101和110——(T1CC0-T1CCn)/2*T1CC0
程序编写
端口引脚初始化:配置引脚功能为外设I/O,外设位置选择,位置优先级选择,注:无需配置引脚方向PxDIR
例子中用到引脚P1.0,定时器1的位置2时引脚P1.0为通道2
1 /****************************************************************************** 2 *函 数 名:InitPWM 3 *功 能:PWM输出口P1.0初始化 4 *入口参数:无 5 *出口参数:无 6 ******************************************************************************/ 7 void InitPWM(void) 8 { 9 P1SEL |= 0x01; //P1.0设置为外设I/O口:定时器1通道2 10 PERCFG |= (1<<6); //定时器1为外设位置2 11 P2SEL &= ~(1<<4); //优先级控制:定时器1优先 12 }
定时器初始化配置:
- 定时器1分频值,工作模式配置,寄存器T1CTL
- 定时器1通道n输入捕获/输出比较模式选择,如果用到中断,开通道n中断,寄存器T1CCTLn
- 通道1捕获/比较寄存器值配置,先低位后高位,T1CC0L和T1CC0H
- 通道n捕获/比较寄存器值配置,先低位后高位,T1CCnL和T1CCnH
- 开定时器1溢出中断,TIMIF
- 定时器1中断使能,IEN1
- 开总中断,EA
1 /****************************************************************************** 2 *函 数 名:InitT1 3 *功 能:定时器1初始化,使用通道2 4 *入口参数:无 5 *出口参数:无 6 ******************************************************************************/ 7 void InitT1(void) 8 { 9 T1CTL = 0x0f; //定时器1设置为128分频,正计数/倒计数模式 10 T1CCTL2 = 0x6c; //定时器1通道2配置为比较输出,模式101,开通道2中断 11 T1CC0L = 0x00; //定时器1通道0捕获/比较值低位 12 T1CC0H = 0x88; //定时器1通道0捕获/比较值高位 13 T1CC2L = 0x00; //定时器1通道2捕获/比较值低位 14 T1CC2H = 0x44; //定时器1通道2捕获/比较值高位 15 TIMIF &= ~(1<<6); //定时器1溢出中断使能 16 IEN1 |= (1<<1); //定时器1中断使能 17 EA = 1; //开总中断 18 }
这样就可以输出PWM波形了,对于只输出PWM波,中断是可以不用管的,不开中断什么的都可以
本例使用的定时器主时钟是32MHz,128分频,周期是2*T1CC0H:T1CC0L(2*0x8800)计时时间,为278.528ms,频率为3.59Hz,占空比为
1-(T1CC0-T1CCn)/2*T1CC0=75%
波形用示波器看得
另外,通过实验发现,当输出频率较高的波形时,波形失真较明显,下图是输出8MHz的波形,所以cc2541不适合输出高频率的波形。