CC2530单片机延时函数实际测试
来源:互联网 发布:linux项目案例 编辑:程序博客网 时间:2024/05/17 20:01
因为要检测不同的波形,所以对时间要求很高,但是发现Zstack本身提供的微秒级的延时其实有误差。
因此特地写了测试函数,然后用示波器观察了时间。详细如下:
先说CC2530与普通8051单片机时钟的不同,CC2530的每个指令是一个时钟,而标准的8051的指令周期是12个时钟。
若选用32MHZ的时钟频率,那么时钟周期是1/32 us,一个指令也就是1/32us.
然后我们需要确定ZStack中使用的时钟频率,找到ZMain.c文件中的 int main (void)函数,在
HAL_BOARD_INIT();
中可以看到选择的是32MHZ的时钟频率。同时也可以读取CLKCONCMD中第6位的值,如果为0则为32MHZ。
ZStack中大多使用的延时函数如下:
void Delay_us(uint16 value){
while (value--)
{
asm("NOP"); //一个指令周期占用一个时钟周期
asm("NOP");
asm("NOP");
}
}
用示波器测试的不同的参数,其时间值如下表:
这个时间经过实际检测是准确的。
但是我还是想弄明白其中的原因,Delay_us()函数中,一次循环+3个Nop指令的汇编代码如下图:
每条指令都用红色标记表明其需要的时钟周期,也就是一次循环需要21个时钟周期,如果按照一个时钟1/32us的话,当参数值为75时,时间长为75X21/32=49.2us.
这与实际测试时不符合的,实际为100us.
我暂时猜测为在ZStack在不同功能处理下也许时钟周期不同,或者有中断等的干扰(实际上我使用延时时关闭了所有的中断),以后有时间再做具体研究。但如果时钟为16MHZ的话,那计算时间和实际测试时间则是一致的。
另一位博主也记录了其他人的测试,有同样的问题:
http://blog.csdn.net/geek_monkey/article/details/52171537
- CC2530单片机延时函数实际测试
- 51单片机延时函数
- 51单片机延时函数
- 51单片机延时函数
- 单片机延时函数
- 单片机中的延时函数
- 单片机延时函数实现
- 51单片机延时函数
- 单片机实际延时时间的计算
- CC2530,51单片机 延时一秒程序 循环次数 算法
- 单片机延时函数的实现
- 【51单片机】延时函数计算问题以及如何准确延时
- 单片机中C语言延时函数
- 用C51编写单片机延时函数(转贴)
- 用C51编写单片机延时函数(转贴)
- 51单片机C语言延时函数
- 51单片机非精确延时函数
- 单片机延时
- 20岁如何保养皮肤
- 实业创造价值!工厂模式小实现!
- vivo手机定位局限性,如何利用第三方库只获取定位信息
- 再谈特征值与特征向量的求取
- codeforces 266A(Stones on the Table) Java
- CC2530单片机延时函数实际测试
- JS面向对象编程详解
- 剑指offer 链表的建立等基本操作
- sql server 2008 sqlserver登录方式18456
- MySQL数据过滤和通配符过滤.md
- MySQL创建数据库相关命令
- javascript中面向对象的三大作用
- JS对象的创建与使用
- 异步编程