TI论坛
直播中

于惠

7年用户 168经验值
私信 关注
[问答]

为什么CC2540定时器会不准呢?

新手上手熟悉CC2540芯片,做了一些定时器的小实验。
但是发现实际输出的波形周期误差还是蛮大的,比如定时500ms,基本周期都是510ms~520ms。
以前用AVR或DSP之内的感觉都还好,请问是因为什么原因呢?


设置如下




代码如下:
#include#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();            //初始化定时器T3uint 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;  ] ]

回帖(3)

华农武

2019-9-29 06:35:55
ming,
2540是由24M晶振和32K晶振切换着工作的。
你可以这样试一下:
1. 在工程的options里面把POWER_SAVING注销掉试试还会不会有这个问题,这样就能定位是否因为两个晶振引起的。
2. 第二个方法是用osal的timer来计时,不要用你的Delayms(), 你这个delay会引起系统挂起,导致蓝牙工作不正常。
举报

于惠

2019-9-29 06:51:39
引用: 骑猪去天山 发表于 2019-9-29 06:35
ming,
2540是由24M晶振和32K晶振切换着工作的。
你可以这样试一下:

谢谢你的回复。
1.我没有使用BLE协议栈,现在仅仅是把它当一个简单的单片机来做实验;
2.我没有使用延时函数,是使用中断来实现定时器的。
请问会不会是因为没有设置内外晶振导致的呢?
举报

于惠

2019-9-29 07:05:15
引用: 骑猪去天山 发表于 2019-9-29 06:35
ming,
2540是由24M晶振和32K晶振切换着工作的。
你可以这样试一下:

  1.我没有使用BLE协议栈,现在仅仅是把它当一个简单的单片机来做实验;
2.我没有使用延时函数,是使用中断来实现定时器的。
请问会不会是因为没有设置内外晶振导致的呢?
举报

更多回帖

发帖
×
20
完善资料,
赚取积分