CC2541蓝牙学习——定时器1自由运行模式

学习目标:定时器1的自由运行模式

CC2541有4个定时器,分别实现不同的功能,定时器1是一个独立的16位定时器,支持典型的定时/计数功能,比如输入捕获,输出比较和PWM功能。定时器1有5个独立的捕获/比较通道,每个通道定时器使用一个I/O引脚。

定时器1的功能如下:

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

定时器包括一个16位计数器:在每个活动的时钟边沿递增或递减活动时钟边沿周期由寄存器位CLKCON.TICKSPD 定义,他设置全球系统时钟的划分,提供了从0.25到32MHz的不同的时钟标签频率,这个在定时器1中由TICTL.DIV设置的分频器值进一步划分。这个分频器值可以从1、8、32、128,因此当32MHz晶振用作系统时钟源时,定时器可以使用的最低时钟频率为32MHz/128/128=1953.125Hz。总之:定时器的定时时钟频率由CLKCON.TICKSPD 和TICTL.DIV决定。

定时器1有三种操作模式:自由运行模式、模计数模式、正计数/倒计数模式,由TICTL寄存器MODE[1:0]选择。

自由运行模式】:

在自由运行操作模式下,计数器从0x0000开始,每个活动时钟边沿增加1。当计数器达到0xFFFF(溢出)后,计数器重新载入0x0000,继续递增它的值,如下图所示。当达到最终计数值0xFFFF,设置标志IRCON.T1IFT1STAT.OVFIF。如果设置了相应的中断屏蔽位TIMIF.OVFIM以及IEN1.T1EN和总中断IEN0.EA,计数器溢出将产生一个中断请求。自由运行模式可以用于产生独立的时间间隔,输出信号频率。

定时器1状态寄存器

中断标志4寄存器

定时器1在自由运行模式,查询方式下的初始化子函数

 1  1 /***************************************************
 2  2 *函 数  名:InitT1
 3  3 *功      能:定时器1初始化,系统不配置时钟默认2分频,即16M
 4  4 *入口参数:无
 5  5 *出口参数:无
 6  6 ***************************************************/
 7  7 void InitT1(void)
 8  8 {
 9  9   T1CTL  = 0x0d;      //定时器1设置为128分频,自由运行模式
10 10   T1STAT = 0X21;      //这一句在裸机程序中可有可无,在协议栈中有用
11 11                      //通道0,中断有效
12 12 }

主程序:查询方式,判断定时器1中断标志位

 1  1 /******************************************************************************
 2  2 *程序入口函数
 3  3 ******************************************************************************/
 4  4 int main(void)
 5  5 {
 6  6   InitClock();
 7  7   InitLED(1);                //LED初始化,熄灭LED1
 8  8   InitT1();                  //定时器1初始化
 9  9
10 10   while(1)
11 11   {
12 12     if(IRCON & (1<<1))       //检测定时器1是否溢出
13 13     {
14 14       IRCON &= ~(1<<1);      //清溢出标志
15 15       LED1 = !LED1;          //LED闪烁
16 16     }
17 17   }
18 18 }

查询方式下,我们判断IRCON.T1IF(定时器1中断标志)是否为1来确定定时器是否计数溢出,刚才说过T1STAT.OVFIF(定时器1计数器溢出中断标志)在定时器计数溢出时也会置1,那么能不能改为查询T1STAT.OVFIF呢?经过试验,答案是肯定的,程序可以改为:

 1  1 /******************************************************************************
 2  2 *程序入口函数
 3  3 ******************************************************************************/
 4  4 int main(void)
 5  5 {
 6  6   InitClock();
 7  7   InitLED(1);                //LED初始化,熄灭LED1
 8  8   InitT1();                  //定时器1初始化
 9  9
10 10   while(1)
11 11   {
12 12     if(T1STAT & (1<<5))       //检测定时器1是否溢出
13 13     {
14 14       T1STAT &= ~(1<<5);      //清溢出标志
15 15       LED1 = !LED1;          //LED闪烁
16 16     }
17 17   }
18 18 }

定时器1自由运行模式中断程序,初始化程序

  • 定时器1分频器设置、运行模式设置:配置寄存器T1CTL
  • 定时器1中断使能:配置寄存器IEN1
  • 定时器1溢出中断使能:TIMIF
  • 开总中断

中断初始化程序:

 1 /******************************************************************************
 2 *函 数 名:InitT1
 3 *功    能:定时器1初始化,系统不配置时钟默认2分频,即16M
 4 *入口参数:无
 5 *出口参数:无
 6 ******************************************************************************/
 7 void InitT1(void)
 8 {
 9   T1CTL  = 0x0d;     //定时器1设置为128分频,自由运行模式
10   T1STAT = 0X21;     //通道0,中断有效。这一句在裸机程序中可有可无
11   TIMIF |= (1<<6);   //定时器1溢出中断使能
12   IEN1  |= (1<<1);   //定时器1中断使能
13   EA = 1;            //开总中断
14 }

中断服务程序中要清除定时器1中断标志和定时器1溢出标志:

 1 /******************************************************************************
 2 *函 数 名:Timer1_ISR
 3 *功    能:定时器1中断服务程序
 4 *入口参数:无
 5 *出口参数:无
 6 ******************************************************************************/
 7 #pragma vector = T1_VECTOR
 8 __interrupt void Timer1_ISR(void)
 9 {
10   LED1 = !LED1;
11   IRCON &= ~0x02;
12   T1STAT &= ~0x20;
13 }
时间: 2024-10-14 03:45:39

CC2541蓝牙学习——定时器1自由运行模式的相关文章

CC2541蓝牙学习——定时器1的捕获/比较功能

CC2541定时器1有5个捕获/比较通道,首先介绍什么是捕获和比较功能. 捕获通道: 设置的捕获开始的时候,CPU会将计数寄存器的值复制到捕获比较寄存器中并开始计数,当再次捕捉到电平变化时,这时 计数寄存器中的值减去刚才复制的值就是这段电平的持续时间,你可以设置上升沿捕获.下降沿捕获.或者上升沿下降沿 都捕获.捕获通道可以用来测量信号的频率周期或者波形的宽度,捕获通道类似于秒表的功能. 比较通道: 这里有两个单元:一个计数器单元和一个比较单元,比较单元就是个双缓冲寄存器,比较单元的值是可以根据不

CC2541蓝牙学习——定时器3和定时器4

定时器3和定时器4与定时器1功能类似,都有三种模式:自由运行模式.模模式.正计数/倒计数模式,都有输入捕获和输出比较功能,不同的是定时器3和定时器4是8位计数器,而定时器1是16位的,另外定时器3和定时器4只有2个通道,定时器多了一个模式:倒计数模式.由于定时器3和定时器4相似,下面以定时器3为例说明. 定时器3和定时器4是两个8位定时器,每个定时器有两个独立的捕获/比较通道,每一通道使用一个I/O引脚. 定时器3/4有以下特点: 两个捕获/比较通道: 设置,清除或切换输出比较: 每时钟可以被以

CC2541蓝牙学习——外设I/O

学习目标:I/O口的配置,掌握I/O外设功能及位置分布,寄存器“PERCFG”.“P2SEL”和“P2DIR”. 前面CC2541蓝牙学习——I/O口介绍过CC2541有21个I/O引脚,这些引脚可以作为通用I/O引脚,同时通过独立编程还可以作为外设I/O引脚用作ADC.串口.定时器和调试接口.当设置为外设I/O时,需要将对应的寄存器位PxSEL置1,每个外设单元对应两组可以选择的I/O引脚,即“外设位置1”和“外设位置2”,如下表所示. 从表中我们可以看出整个P0口都可作为ADC使用,因此可以

CC2541蓝牙学习——看门狗

看门狗是在软件跑飞的情况下CPU自恢复的一个方式,看门狗分为硬狗和软狗,硬狗就是由专门的看门狗硬件电路实现看门狗功能,看门狗芯片也比较多,比如DS1232,除了看门狗功能外还有电源电压监测功能.软狗就是由软件实现的看门狗功能,现在很多CPU都自带了软狗,很难说硬狗好还是软狗好,如果软狗够用,尽量使用软狗简化设计,看门狗说白了就是一个定时器!,当软件在选定的时间间隔内不能置位看门狗定时器(WDT),WDT就复位系统.看门狗可用于电噪声,电源故障或静电放电等恶劣工作环境或高可靠性要求的环境.如果系统

CC2541蓝牙学习——ADC

CC2541的ADC支持多达14位的模拟数字转换与高达12位的有效位数.它包括一个模拟多路转换器,具有多达8个各自可独立配置的通道,一个参考电压发生器.转换结果通过DMA写入存储器.还具有若干运行模式. ADC主要特性如下: 可选的抽取率,设置了7~12位的分辨率: 8个独立输入通道,可接受单端或差分信号: 参考电压可选为内部,外部单端,外部差分,或AVDD5: 产生中断请求: 转换结束时的DMA触发: 温度传感器输入: 电池测量功能. 图1 P0引脚上的信号可以作为ADC输入来使用.在下面,这

CC2541蓝牙学习——时钟设置

CC2541有四个振荡器,分别是: 32MHz外部晶振 16MHz内部RC振荡器 32kHz外部晶振 32kHz内部RC振荡器 由此可以看出,CC2541内部自带了振荡器,也就是说即使外部电路不接振荡器,CC2541也可以工作,答案是肯定的,但是作为无线RF收发,只能使用外部32MHz晶振,除非准备将CC2541当做一个普通的增强型51单片机来用,否者32MHz外部晶振是必不可少的,那么这4个晶振有什么区别和用途呢? 32MHz的外部晶振有两个作用:为内部时钟提供时钟源和用于RF收发器 16MH

CC2541蓝牙学习——通用I/O口中断

学习目标:掌握中断使能寄存器IEN0.IEN1.IEN2,中断标志寄存器PxIFG.IRCON.IRCON2,端口中断触发沿控制寄存器PICTL CC2541有18个中断源,每个中断源都可以产生中断请求,这18个中断源如下 中断请求通过SFR寄存器IEN0.IEN1.IEN2使能或禁止,定义如下: 其中IEN0和IEN1可以位寻址,寄存器IEN2不可以位寻址 EA:1开总中断 IEN1.P0IE:P0端口中断使能 IEN2.P1IE:P1端口中断使能 IEN2.P2IE:P2端口中断使能 IEN

TI CC2530基础实验(定时器3中断方式——自由运行模式)

本实验实现通过CC2530的定时器3(8位)查询方式控制LED1以1S的周期性闪烁,此实验使用有关定时器3的2个寄存器T3CTL(定时器3控制寄存器),IEN1(中断使能1寄存器). 有关CC2530的GPIO基本知识.普通GPIO操作有关寄存器的介绍.IAR Embedded Workbench IDE软件使用:TI CC2530基础实验(普通GPIO操作--点亮led灯) 原理图: 寄存器分析: 程序: #include <ioCC2530.h> /********************

TI CC2530基础实验(定时器1查询方式——自由运行模式)

本实验实现通过CC2530的定时器1(16位)查询方式控制LED1以1S的周期性闪烁,此实验使用的三个寄存器T1CTL(定时器1控制寄存器),T1STAT(定时器1状态寄存器),IRCON. 有关CC2530的GPIO基本知识.普通GPIO操作有关寄存器的介绍.IAR Embedded Workbench IDE软件使用:TI CC2530基础实验(普通GPIO操作--点亮led灯) 电路原理图: 寄存器分析: 1.定时器1控制寄存器 定时器1的T1CTL寄存器下的模式分析: [自由运行模式]: