本篇博文最后修改时间: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
四、基础知识
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的电平取反一次。
//******************************************************************************
//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
4)在IAR设置中添加按键驱动源文件路径
$PROJ_DIR$\..\..\SimpleBLEPeripheral\Source\GUA
1)定时器1初始化(SimpleBLEPeripheral.c的SimpleBLEPeripheral_Init中)
//定时器1初始化
GUA_Timer1_Init();
//GUA
#include "GUA_Timer1.h"
//GUA
仿真并全速运行,用示波器查看P11口电平状态:
也就是每10ms(100Hz)取反一次P11口的电平。
因此,“使用定时器1定时100Hz”的实验成功。