历史上的今天
今天是:2024年12月17日(星期二)
2019年12月17日 | MSP430杂谈--delay_cycles的精准延时
2019-12-17 来源:eefocus
在这里, 我来讨论一下关于MSP430单片机使用__delay_cycles延时的问题.
IAR for MSP430编译器提供了一个编译器内联的精确延时函数(并非真正的函数)以提供用户精确延时使用, 该函数原型是:
_intrinsic void __delay_cycles(unsigned long __cycles);
该内部函数实现__cycles个CPU周期的延时,但对于该参数的设置,我要陈述一下:
__cycles需要我们传递的是CPU运行的周期个数
网上普遍的用法是:
#define CPU_CLOCK 8000000
#define delay_us(us) __delay_cycles(CPU_CLOCK/1000000*(us))
#define delay_ms(ms) __delay_cycles(CPU_CLOCK/1000*(ms))
在CPU主时钟频率为8MHz时, 这确实没有问题, 但是这样的写法:
#define CPU_CLOCK 8000000
这很容易让人们想到, 可以通过修改它的值以实现对不同主频系统参数的统一,其实
这是不正确的! 比如修改为#define CPU_CLOCK 32768以实现32KHz主频的延时...
下面来计算看看:
当系统主时钟频率CPU_CLOCK为8MHz时:
频率 f = 8MHz = 8,000,000Hz
机器周期 Tm = 1/f = 1/8MHz = 1/8us
也就是说,一个机器周期(nop)的时长是1/8us,所以延时1us即8*Tm,同上面:
#define delay_us(us) __delay_cycles(8*(us))
#define delay_ms(ms) __delay_cycles(8000*(ms))
按照上面的宏定义方法,我们把CPU_CLOCK定义成32768,那么:
频率 f = 32KHz = 32,768Hz
机器周期 Tm = 1/f = 1/32768Hz ~= 30.5us
可想而知,CPU最短的指令执行周期为30.5us, 这时, 想延时1us, 这可能吗?所以, 简单地把上面的定义改成
#define CPU_CLOCK 32768
是绝对错误的.
同样, 还有些朋友实现了0.5us的延时, 这在当f = 1MHz = 1000000Hz时也
是不现实的, 此时机器周期Tm = 1us. 在f = 8Mhz时, 4个机器周期为0.5us尚可.
所以, 为避免引起错误的使用或不正确的理解,最好像下面这样定义宏:
#if CPU_CLOCK == 8000000
#define delay_us(us) __delay_cycles(8*(us))
#define delay_ms(ms) __delay_cycles(8000*(ms))
#else
#pragma error "CPU_CLOCK is defined implicitly!"
#endif
另外:
__delay_cycles 并不是真正的函数, 只是提供编译器内联展开,该函数并
不支持变量参数, 其参数只能是常数.
史海拾趣
|
传感器、控制器、执行器作为汽车电子的基础,对整个汽车系统起着重要的支撑作用,这些技术的发展也随着汽车的发展不断前进。现代汽车已经越来越接近于“自动车”、“智能车”,汽车用基础电子元器件也已经成为这些先进系统的“神经末梢”或“控制神 ...… 查看全部问答> |
|
是新一代的数据传输与分组交换技术,是当前网络技术研究与应用的热点问题。 - R% F1 }1 V0 I F9 b: M . p- |. j6 M$ j! C N\' Y) V ATM技术的主要特点是:3 ATM是一种面向连接的技术,采用小的,固定长度的数据传输单元。. {. {& ...… 查看全部问答> |
|
1.看电影专用床 这张床咋看除了充满未来感的造型之外毫无特别之处,其实里面暗藏了投影机,投影屏幕音响和DVD播放机。有了这张床,躺在床上看大屏幕电影再不是一个梦了。当然,你不仅可以在床上看电影,还可以玩电视游戏,上网。 2.电影床 ...… 查看全部问答> |
|
系统自带simsun.ttc和mingliu.ttc。先用宋体显示一段文字,然后用AddFontResource加载魏碑字体,显示文字后用 RemoveFontResource移出字体;再次用宋体显示文字时,居然是用魏碑显示的。请问是怎么回事?… 查看全部问答> |
|
各位同仁,谁有tcpmp的mpeg4的插件给一个,我也用的是tcpmp0.72rc1,但是目录中就是没有这个文件夹,上网找了一个上午,还是没有,多谢了!!… 查看全部问答> |
|
Platform Builder 5.0 生成 nk.bin的时候报这个错误,谁知道怎么解决? Windows CE ROM Image Builder v4.0.000 Copyright (c) Microsoft Corporation Built: Jun 16 2004 15:09:27 Error: Could not find file \'D:\\WINCE500\\PBWorkspaces\\arm2410\\RelDir\\smdk2410_ARMV4I_Release\\kernkitl.exe\' on disk nk. ...… 查看全部问答> |
|
将bootrom烧到板子上,需要使用telnet来实现远程登录开发板。我的电脑系统是windows7,盗版的,激活码也是从盗版盘里面的一个小程序生成的。 windows7本身没有telnet命令,从网上搜索:控制面板--->程序和功能--->打开或关闭windows功能;用这种方 ...… 查看全部问答> |




