当前位置:文档之家› 软件延时

软件延时

2软件延时
在对数字温度传感器DS18820操作中,用到延时有:15 μs、90μs、270 μs、540 μs等。

这些延时短暂,占用CPU时间不是太多,所以比较适合软件延时方法。

通过汇编语言编写程序,很容易控制时间,我们知道每条语句执行时间,每段宏执行时间及每段子程序加调用语句所消耗时间。

因此,要用C语言编制出较为精确延时程序,就必须研究该段C程序生成汇编代码。

循环结构延时:延时时间等于指令执行时间与指令循环次数乘积,举例来讲,对如下延时程序进行实验分析。

void delay(unsigned int time){
while(time一一){};
在main()中调用延时函数delayr(n);得到延时时间是多少,需要在MSP430单片机集成编译环境IAR Em—bedded Wclrkbeneh IDE 3.10A中编制测试。

使用C430写好一段可执行代码,在其中加入延时函数,并在主函数中调用,以delay(1OO)为例。

设置工程选项Options,在Debugger栏中将Drivet选为Simulator,进行软件仿真。

在仿真环境C—SPY Debugger中,从菜单View中调出Disassembly和Register窗口,前者显示编程软件根据C语言程序编译生成汇编程序,在后者窗口中打开CPU Register子窗体,观察指令周期计数器CYCLE —COUNTER。

可以看到,delay()编译得到如下代码段:
delav:
001112 OF4C mov.w R12,R15
OOlll4 0C4F mov.w R15.R12
001116 3C53 add.w #0xFFFF.R12
001118 0F93 tst.w R15
00111A FB23 jne deIay
单步执行,观察CYCI正COUNTER,发现每执行一条指令,CYCLECOUNTER值加1,说明这5条指令各占用1个指令周期,循环体while()每执行一次需要5个指令周期,加上函数调用和函数返回各占用3个指令周期,delay(100)延时了5×100 6—506个指令周期。

只要知道指令周期,就能容易计算出延时时长了。

延时函数因循环语句和编译器不同,执行时间也有所不同,依照上述方法具体分析,可以达到灵活编程目。

MSP430指令执行速度即指令所用周期数,这里时钟周期指主系统时钟MCLK周期。

单片机上电后,如果不对时钟系统进行设置,默认800 kHzDCOCLK为MCLK和SMCLK 时钟源,LFXTl接32768 Hz晶体,工作在低频模式(XTS=O)作为ACLK时钟源。

CPU指令周期由MCLK决定,所以默认指令周期就是1/800 kHz=1.25μs。

要得到lμs指令周期需要调整DCO频率,即MCLK=1 MHz,只需进行如下设置:BCSCTLl=XT20FF RSEL2;
//关闭XT2振荡器,设定DCO频率为1 MHz
DCOCTL=DCO2
//使得单指令周期为lμs
并不是说MSP430单片机软件延时最小延时基准是lμs,当开启XT2=8 MHz高频振荡器,指令周期可以达到125 ns。

MSP430F4XX系列单片机由于采用了增强型锁频环技术FLL ,可以将DCO频率倍增到40MHz,从而得到最快25 ns指令周期。

相关主题