MSP430单片机的软硬件C延时程序设计
定时器中断完成延时的方法。若要延时1 s,则设定WDT每250 ms
中断一次。在需要延时处,启动看门狗定时器并允许其中断,系统进入低功耗模式3(共有5
种.模式)休眠。在中断服务程序中对延时时间累加,当达到1 s时唤醒CPU,
并停止看门狗定时器中断。实例代码如下:
void main(void)
}
#pragrna vector=WDT_VECTOR
__interrupt void WDT_Delay(void)
{
IEl&=~WDTIE;)
}
这种方法充分发挥了MSP430系列的超低功耗特性,在等待延时的过程中,CPU
不需要一直判断标志位以得知延时结束,而是进入省电模式。等待过程中,
只有极短的时间会在中断服务程序中累计时间并进行判断。可以根据需要设置CPU
进入不同的低功耗模式LPMx。如果系统使用了多种外设中断,
并在其他中断服务程序中也有唤醒CPU的语句,这种方法便不再适用了。
μs级延时不宜使用硬件延时,因为频繁的进出中断会使CPU
用大量时间来响应中断和执行中断返回等操作。硬件延时的方法适用于ms
级以上的长时间延时。
2
在对数字温度传感器DS18820的操作中,用到的延时有:15 μs、90μs、270 μs、540 μ
s等。这些延时短暂,占用CPU时间不是太多,
所以比较适合软件延时的方法。通过汇编语言编写的程序,很容易控制时间,
我们知道每条语句的执行时间,
每段宏的执行时间及每段子程序加调用的语句所消耗的时间。因此,要用C
语言编制出较为精确的延时程序,就必须研究该段C程序生成的汇编代码。
循环结构延时:延时时间等于指令执行时间与指令循环次数的乘积,举例来讲,
对如下延时程序进行实验分析。
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()
编译得到如下代码段:
00111A
单步执行,观察CYCI正COUNTER,发现每执行一条指令,CYCLECOUNTER的值加1,说明这5
条指令各占用1个指令周期,循环体while()每执行一次需要5个指令周期,
加上函数调用和函数返回各占用3个指令周期,delay(100)延时了5×100+6-506
个指令周期。只要知道指令周期,
就能容易的计算出延时时长了。延时函数因循环语句和编译器的不同,
执行时间也有所不同,依照上述方法具体分析,可以达到灵活编程的目的。
MSP430的指令执行速度即指令所用的周期数,这里的时钟周期指主系统时钟MCLK
的周期。单片机上电后,如果不对时钟系统进行设置,默认800 kHz的DCOCLK为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;
//使得单指令周期为lμs
并不是说MSP430单片机软件延时最小的延时基准是lμs,当开启XT2=8 MHz高频振荡器,
指令周期可以达到125 ns。MSP430F4XX系列的单片机由于采用了增强型锁频环技术FLL+,
可以将DCO频率倍增到40MHz,从而得到最快25 ns的指令周期。
调用延时函数的方法适合于100 μs~1 ms之间的延时,100μs
以下的短延时最好通过空操作语句_NoP()
或其任意个组合来实现。可使用宏定义实现需要的延时,如要延时3 μs,则: #define
DELAY5US{_NOP();_NOP();_NOP();}
结语
片内看门狗定时器的硬件延时方案和软件延时方法满足了不同时宽级别的延时需求,
尤其软件延时,采用汇编程序分析法得到了延时函数准确的延时时间,
大大提高了软件延时精确度和程序调试效率,并在多种芯片接口程序中应用,
运行效果良好。
MSP430单片机软硬件C延时程 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)