历史上的今天
返回首页

历史上的今天

今天是: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  并不是真正的函数, 只是提供编译器内联展开,该函数并


不支持变量参数, 其参数只能是常数.

推荐阅读

史海拾趣

Eurosil Electronics Ltd公司的发展小趣事

随着技术的不断成熟,Eurosil开始将产品推向市场。公司凭借优质的产品和卓越的服务,逐渐在电子行业中树立了良好的品牌形象。同时,Eurosil积极拓展国际市场,与多家国际知名企业建立了合作关系,将产品销往全球各地。这一过程中,Eurosil不仅扩大了市场份额,也积累了丰富的国际经验。

安碁科技(AKER)公司的发展小趣事

在电子行业快速发展的背景下,安碁科技始终坚持持续创新和客户导向的经营理念。公司不断投入研发资源,推出具有竞争力的新产品和解决方案,以满足客户不断变化的需求。同时,安碁科技也注重与客户的沟通和合作,深入了解客户的需求和反馈,不断优化产品和服务。这种以客户为中心的经营模式,使得安碁科技在市场上赢得了良好的声誉和口碑。

这五个故事只是安碁科技发展历程中的一部分,但它们充分展示了公司在电子行业中的崛起和发展。安碁科技凭借其卓越的技术实力、品质管理和创新能力,在激烈的市场竞争中脱颖而出,成为行业的佼佼者。未来,随着电子行业的不断发展和变化,安碁科技将继续保持创新和进取的精神,为客户和市场带来更多优质的产品和服务。

COILCRAFT公司的发展小趣事

在追求产品性能的同时,COILCRAFT公司也非常注重产品质量和环保。公司采用先进的设备和工艺,确保产品的稳定性和可靠性。此外,公司还积极采取措施减少能源和资源的消耗,优化生产流程,降低废物排放。这种对质量和环保的坚持使得COILCRAFT在行业中树立了良好的形象。

Autotrol公司的发展小趣事

随着公司规模的不断扩大和市场份额的逐步提升,Autotrol公司开始实施全球化战略,积极拓展海外市场。公司在全球范围内建立了销售网络和分支机构,与当地合作伙伴共同开拓市场。同时,Autotrol还加大了对国际市场的研发投入,针对不同地区的市场需求推出定制化的产品和服务。通过全球化战略的实施,Autotrol公司的品牌影响力不断提升,市场地位也日益稳固。

请注意,以上故事仅为基于一般行业知识和公司概况编写的示例,并不代表Autotrol公司的实际历史。如需了解Autotrol公司在电子行业中的具体发展故事,建议查阅公司官方网站、行业报告或相关新闻报道等权威资料。

ZTE高新兴(Gosuncn)公司的发展小趣事

Autotrol公司成立于1964年,最初是一家领先的可定制小功率齿轮马达生产商。在初创时期,公司面临着激烈的市场竞争和技术挑战。然而,Autotrol凭借其卓越的技术实力和创新能力,成功开发出一系列具有竞争力的齿轮马达产品,逐渐在市场中脱颖而出。公司不断完善产品线,推出了永久磁铁同步电动机、滞后电动机和直流齿轮马达等,这些产品以其高效、稳定的性能赢得了客户的信赖。

Advanced Monolythic Ceramics公司的发展小趣事

随着市场需求的不断变化,Autotrol公司意识到必须不断进行技术创新和产品升级,以满足客户的多样化需求。于是,公司投入大量研发资源,开发出了一系列特色产品,如为更大转矩而制的铜或铁齿轮传动链,以及为安静运行并省钱而特制的塑料齿轮传动链等。这些创新产品不仅提升了Autotrol在市场上的竞争力,也为公司带来了可观的收益。

问答坊 | AI 解惑

国外汽车用基础电子元器件发展现状与趋势

传感器、控制器、执行器作为汽车电子的基础,对整个汽车系统起着重要的支撑作用,这些技术的发展也随着汽车的发展不断前进。现代汽车已经越来越接近于“自动车”、“智能车”,汽车用基础电子元器件也已经成为这些先进系统的“神经末梢”或“控制神 ...…

查看全部问答>

arm技术中的异步传输模式ATM

是新一代的数据传输与分组交换技术,是当前网络技术研究与应用的热点问题。 - R% F1 }1 V0 I F9 b: M  . p- |. j6 M$ j! C  N\' Y) V  ATM技术的主要特点是:3 ATM是一种面向连接的技术,采用小的,固定长度的数据传输单元。. {. {& ...…

查看全部问答>

<转帖>几款极具前卫创意的床~!

1.看电影专用床 这张床咋看除了充满未来感的造型之外毫无特别之处,其实里面暗藏了投影机,投影屏幕音响和DVD播放机。有了这张床,躺在床上看大屏幕电影再不是一个梦了。当然,你不仅可以在床上看电影,还可以玩电视游戏,上网。 2.电影床 ...…

查看全部问答>

WINCE添加自定义字体的问题

系统自带simsun.ttc和mingliu.ttc。先用宋体显示一段文字,然后用AddFontResource加载魏碑字体,显示文字后用 RemoveFontResource移出字体;再次用宋体显示文字时,居然是用魏碑显示的。请问是怎么回事?…

查看全部问答>

帮忙看个程序。急用!!!

为什么float在keil c中使用报错。 如以下代码: float a; a=3.14; printf(\"%f\",a); 这都报错为什么? …

查看全部问答>

tcpmp缺少mpeg4插件

各位同仁,谁有tcpmp的mpeg4的插件给一个,我也用的是tcpmp0.72rc1,但是目录中就是没有这个文件夹,上网找了一个上午,还是没有,多谢了!!…

查看全部问答>

求助:急:c 编程

void main() {       P1M1=0x00;     P1M2=0x00;     P3M1=0x00;     P3M2=0x00; Send_ADFReg(Initialization_Value);     Send_ADFReg(Function_Value);  ...…

查看全部问答>

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. ...…

查看全部问答>

看看有没有高手指点 ezusb->cyusb

bool ReadData(int count,unsigned char *buf) {     bool                                    Success ...…

查看全部问答>

请教一个关于telnet的问题

将bootrom烧到板子上,需要使用telnet来实现远程登录开发板。我的电脑系统是windows7,盗版的,激活码也是从盗版盘里面的一个小程序生成的。 windows7本身没有telnet命令,从网上搜索:控制面板--->程序和功能--->打开或关闭windows功能;用这种方 ...…

查看全部问答>