微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI无线射频设计 > cc2540 怎么能得到1/1024秒?

cc2540 怎么能得到1/1024秒?

时间:12-22 整理:3721RD 点击:

cyclingsensor的profile要求的。系统的timer都是1ms

OSAL系统的计时单位是1ms,如果你需要其它周期的自定义时间,可以启动一个Timer单独做计时。

Hi tony,

给个例子, 如果你用的是32M 的clock, 则每32个"nop" 就是 1 us.

void delayUs(uint16 microSecs)

{
while(microSecs--)
{
/* 32 NOPs == 1 usecs */
asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");
asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");
asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");
asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");
asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");
asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");
asm("nop"); asm("nop");
}
}

怎么启动呢?我只找到osal timer和hal timer。

cyclingsensor profile里面之所以用1/1024是为了计算方便。比如,sensor用32768的时钟,数32个clock就是1/1024秒,不用做算数运算。

这样我就必须找到系统滴答来计数,但是没找到在哪儿。。。

谢谢!但是应用场景不是延时,而是要在两个event之间计数,每1/1024秒计数加1,最后结果乘以1024就是两个event发生的时间间隔

ll_McuPrecisionCount是不是systick的计数器?应该是625us计一次。这样我还得把得到的数据乘以0.64再发送。好别扭

hi 托尼,

ll_McuPrecisionCount() 并不是计数器. 

你可以看到, 这货只是在空闲的时候通过osal_run_system() 调用osalTimeUpdate() 时被调用到, 

所以, 本质上这货做的其实只是在空闲的时候去读一下timer2 的寄存器值, 读出来的值用来判断跟上一次读timer2 的时候过去了多久, 以这种方式提供给上层应用的软件timer 们计时功能. 而且, 这个只是计算过去了多少个 625us.

而timer2 是LL 层专用的计时器, 独占的.

根据你的需求,  如CZ 所建议, 你可以用另外一个系统计时器.

你可以用系统的timer1, 

系统时钟32M的话, timer1 可以输出最高 1/32M 秒. 这样你只要计 32000 个就有1/1K 的了. 

timer1 还可以有8, 32 或者 128 的分频, 你可以试一下.

系统timer就是hal_timer吧?hal_timer.c是空的。。。

Hi tony,

系统总共有4个timer, 分别是timer1, timer2, timer3, timer4

其中timer2 被LL 层占用, 不对用户开放, 目前timer2 也为上层应用的软件timer 提供计时, 具体实现就像我前面描述的, 上层只是去读timer2 的计时寄存器去判断时间差.

timer1 是个16位的计时器, timer3 和 timer4 都是8位的计时器.

你可以配置这3个计时器去达到你的1/1024 s 的要求.

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top