CC2540定时器不准问题
时间:10-02
整理:3721RD
点击:
新手上手熟悉CC2540芯片,做了一些定时器的小实验。
但是发现实际输出的波形周期误差还是蛮大的,比如定时500ms,基本周期都是510ms~520ms。
以前用AVR或DSP之内的感觉都还好,请问是因为什么原因呢?
设置如下
代码如下:
#include<ioCC2540.h> #define uint unsigned int #define uchar unsigned char //定义控制LED灯的端口 #define LED1 P1_0 //定义LED1为P10口控制 //函数声明 void Delayms(uint xms); //延时函数 void InitLed(void); //初始化P1口 void InitT3(); //初始化定时器T3 uint count; //用于定时器计数 /**************************** //延时函数 *****************************/ void Delayms(uint xms) //i=xms 即延时i毫秒 { uint i,j; for(i=xms;i>0;i--) for(j=587;j>0;j--); } /**************************** //初始化程序 *****************************/ void InitLed(void) { P1DIR |= 0x01; //P1_0义为输出 LED1 = 0; //LED1灯熄灭 } //定时器初始化 void InitT3() { T3CTL |= 0x08 ; //开溢出中断 T3IE = 1; //开总中断和T3中断 T3CTL|=0XE0; //128分频,128/16000000*N=0.5S,N=62500 T3CTL &= ~0X03; //自动重装,选择自由模式 00->0xff 62500/256=244(次) T3CTL |=0X10; //启动 EA = 1; } /*************************** //主函数 ***************************/ void main(void) { InitLed(); //调用初始化函数 InitT3(); while(1); } #pragma vector = T3_VECTOR //定时器T3 __interrupt void T3_ISR(void) { IRCON = 0x00; //清中断标志, 也可由硬件自动完成 if(++count>244) //244次中断后LED取反,闪烁一轮(约为0.5 秒时间) { count = 0; // 计数清零 LED1=~LED1; } }
ming,
2540是由24M晶振和32K晶振切换着工作的。
你可以这样试一下:
1. 在工程的options里面把POWER_SAVING注销掉试试还会不会有这个问题,这样就能定位是否因为两个晶振引起的。
2. 第二个方法是用osal的timer来计时,不要用你的Delayms(), 你这个delay会引起系统挂起,导致蓝牙工作不正常。
谢谢你的回复。
1.我没有使用BLE协议栈,现在仅仅是把它当一个简单的单片机来做实验;
2.我没有使用延时函数,是使用中断来实现定时器的。
请问会不会是因为没有设置内外晶振导致的呢?
Y
ming,
2540是由24M晶振和32K晶振切换着工作的。
你可以这样试一下:
1. 在工程的options里面把POWER_SAVING注销掉试试还会不会有这个问题,这样就能定位是否因为两个晶振引起的。
2. 第二个方法是用osal的timer来计时,不要用你的Delayms(), 你这个delay会引起系统挂起,导致蓝牙工作不正常。
谢谢你的回复。
1.我没有使用BLE协议栈,现在仅仅是把它当一个简单的单片机来做实验;
2.我没有使用延时函数,是使用中断来实现定时器的。
请问会不会是因为没有设置内外晶振导致的呢?
已经找到问题了,是时钟没有设置好。按照ble的设置,定时已经很精确了!