【BLE】CC2541之timer1

本篇博文最后修改时间:2016年11月11日,08:58。


一、简介

本文介绍如何在SimpleBLEPeripheral工程中,使用timer1进行精确定时100Hz(10ms)。


二、实验平台

协议栈版本:BLE-CC254x-1.4.0

编译软件:IAR 8.20.2

硬件平台:Smart RF(主芯片CC2541)


版权声明

博主:甜甜的大香瓜

声明:喝水不忘挖井人,转载请注明出处。

原文地址:http://blog.csdn.NET/feilusia

联系方式:[email protected]

香瓜BLE之CC2541群:127442605

香瓜BLE之CC2640群:557278427

Java零基础入门交流群:541462902

香瓜单片机之STM8/STM32群:164311667
甜甜的大香瓜的小店(淘宝店):https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i


、基础知识

1、定时器有什么用?

答:定时器能精确定时,常用在定时采集adc、定时传输数据。


2、如何计算定时时间?

答:

假设系统时钟为32M、定时器频率128分频,要定时100Hz,则:

1)计算出定时器的周期频率f和周期时间t:

f = 32000000/128 = 250000Hz

t = 1/f = 1/250000 = 0.000004S


2)计算出需要定时的周期时间T:

T = 1/100 = 0.01S 


3)计算出所需几个定时周期n才能满足条件:

n = T/t = 0.01/0.000004 = 2500个


所以,定时器每计数2500次,就是100Hz。


五、代码修改

1、编写并添加定时器1驱动

1)写一个定时器1驱动GUA_Timer1.c(存放在“……\BLE-CC254x-1.4.0\Projects\ble\SimpleBLEPeripheral\Source\GUA”路径下)

//******************************************************************************        
//name:         GUA_Timer1.c        
//introduce:    香瓜的timer1驱动    
//author:       甜甜的大香瓜      
//changetime:   2016.07.11    
//email:        [email protected]    
//******************************************************************************   
#include    
#include "GUA_Timer1.h"  

/*********************宏定义************************/ 
#define T1STAT_CHOIF            (1<<0)  //定时器1的通道0状态位
#define T1STAT_CH1IF            (1<<1)  //定时器1的通道1状态位
#define T1STAT_CH2IF            (1<<2)  //定时器1的通道2状态位
#define T1STAT_CH3IF            (1<<3)  //定时器1的通道3状态位
#define T1STAT_CH4IF            (1<<4)  //定时器1的通道4状态位

//******************************************************************************        
//name:             GUA_Timer1_Init        
//introduce:        定时器1的初始化      
//parameter:        none       
//return:           none      
//author:           甜甜的大香瓜             
//email:            [email protected]           
//changetime:       2016.07.11               
//******************************************************************************   
void GUA_Timer1_Init(void)    
{
  //定时器1配置
  T1CTL = (3<<2)|(2<<0);	        //0000(reserved)、11(128分频,32M/128=250K、10(Modulo)
  T1CNTL = 0;                           //清除计数器
  
  //定时器1的通道0配置
  T1CCTL0 = (1<<6)|(7<<3)|(1<<2)|(0<<0);//Enables interrupt request、Initialize output pin. CMP[2:0] is not changed、Compare mode、 No capture
  T1CC0H = 2500/256;                    //高位
  T1CC0L = 2500%256;                    //低位 
 
  //中断配置
  IEN1 |= (1<<1);                       //定时器1中断使能
}

//******************************************************************************  
//name:             GUA_Timer1_ISR        
//introduce:        定时器1的中断服务函数      
//parameter:        none       
//return:           none      
//author:           甜甜的大香瓜             
//email:            [email protected]           
//changetime:       2016.07.11  
//******************************************************************************  
#pragma vector = T1_VECTOR   
__interrupt void GUA_Timer1_ISR(void)   
{           
  unsigned char flags = T1STAT;
  
  //通道0
  if(flags & T1STAT_CHOIF)
  {
    //test
    P1_1 = ~P1_1;         //这里测试定时一次,就取反一次P1_1,方便观察 P1_1对应的led
    P1SEL &= ~(1 << 1);   //设置为 IO 口
    P1DIR |= (1 << 1);    //设置为输出
    //test   
  }
}  

定时器每进一次中断,则将P11的电平取反一次。


2)写一个定时器1驱动头文件GUA_Timer1.h(存放在“……\BLE-CC254x-1.4.0\Projects\ble\SimpleBLEPeripheral\Source\GUA”路径下)

//******************************************************************************        
//name:         GUA_Timer1.h        
//introduce:    香瓜的timer1驱动的头文件    
//author:       甜甜的大香瓜      
//changetime:   2016.07.11    
//email:        [email protected]    
//******************************************************************************    
#ifndef _GUA_TIMER1_H_  
#define _GUA_TIMER1_H_  

  
/*********************函数声明************************/   
extern void GUA_Timer1_Init(void);  

  
#endif 

3)工程中添加GUA_Timer1.c和GUA_Timer1.h

【BLE】CC2541之timer1_第1张图片


4)在IAR设置中添加按键驱动源文件路径

$PROJ_DIR$\..\..\SimpleBLEPeripheral\Source\GUA  

2、在应用层中初始化定时器1

1)定时器1初始化(SimpleBLEPeripheral.c的SimpleBLEPeripheral_Init中)

  //定时器1初始化
  GUA_Timer1_Init();

2)应用层代码中添加定时器1驱动头文件(SimpleBLEPeripheral.c中)

//GUA
#include "GUA_Timer1.h" 
//GUA

六、实验结果

仿真并全速运行,用示波器查看P11口电平状态:

【BLE】CC2541之timer1_第2张图片

也就是每10ms(100Hz)取反一次P11口的电平。

因此,“使用定时器1定时100Hz”的实验成功。







你可能感兴趣的:(BLE-CC2541)