您的位置 首页 应用

MSP430单片机的软硬件C延时程序设计

MSP430是超低功耗16位单片机,越来越受到电子工程师亲睐并得到广泛应用。C程序直观,可读性好,易于移植和维护,已被很多单片机编程人员所采用

MSP430是超低功耗16位单片机,越来越遭到电子工程师亲睐并得到广泛运用。C程序直观,

可读性好,易于移植和保护,已被许多单片机编程人员所选用。MSP430集成开发环境(如
IAR Embedded Workbench和AQ430)都集成了C编译器和C言语级调试器C-SPY。可是C
言语难以完结精确延时,这一向困扰着许多MSP430
单片机程序员。笔者在实践项目开发过程中,遇到许多需求严厉时序操控的接口器材,
如单总线数字温度传感器DSl8820、实时时钟芯片PCF8563(需求用一般]/o模仿12C
总线时序)、三线制数字电位器AD8402、CF卡(Compact Flash Card)等都需求μs级乃至纳
ns级精确延时;而一些慢速设备只需求ms到s级的延时。为此,
笔者提出了合适于不同延时等级需求的软件或硬件精确延时办法,并已实践运用,作用杰出
,大大缩短了开发周期。  
1 硬件延时
MSP430单片机体系程序多选用事情驱动机制,即在没有外部事情触发的情况下CPU
休眠于低功耗形式中。当外部事情到来时,发生中止激活CPU,进入相应的中止服务程序(
ISR)中。中止呼应程序只完结两个使命,一是置位相应事情的标志,二是使MCU
退出低功耗形式。主程序担任使MCU在低功耗形式和事情处理程序之间切换,
即在主程序中设一个无限循环,体系初始化今后直接进入低功耗形式。MCU被唤醒后,
判别各标志是否置位。假如是单一标志置位,那么MCU履行相应的事情处理程序,
完结后转入低功耗形式;若是有多个标志一起置位,
主程序按照事前排好的音讯行列对它们顺次判别并进行处理,一切事情处理完毕今后MCU
休眠,体系进入低功耗状况(该音讯行列的次序是按照使命的重要性设定的优先级)
。在这种前后台体系中,因为主程序是无限循环,就必须封闭看门狗,与其搁置,
不如用其定时器的功用作硬件延时。运用MSP430
单片机看门狗定时器完结恣意时长精确延时,既满意了体系实时低功耗的要求,
也弥补了运用无限循环延时的时刻难确认和占用CPU时刻长的缺陷。经过下例,解说在同一
WDT ISR中完结不一起长延时的技巧。
#pragma vector=WD_r_VECTOR
interrupt void WDT_Delay(void)
{
//看门狗中止服务程序
if((DelayTime&Delay500ms)==Delay500ms)
{
//判别需求500 ms延时的标志是否置位
static unsigned int n250MS=O;
n250MS++;
if(n250MS==2)
{
//延时250ms×2=500ms
n250MS=0; //清零计数器
DelayTime&=~Delay500ms;//复位标志位
WDTCTL=WDTHOLD+WDTPW;
1El&=~WDTlE;//封闭看门狗定时器并制止其中止
}
}
if((DelayTime&Delay30s)==Delay30s)
{
//判别需求的30 s延时标志是否置位
static unsigned int nS=0;
nS++;
if(nS==30){ //延时1 s×30=30 s
nS=0; //清零计数器
DelayTime&=~Delay30s;//复位标志位
WDTCTL=WDTHOLD+WDTPW;
IEl&=~WDTlE; //封闭看门狗定时器并制止其中止
}
}
假如使命1需求500 ms的延时,只需在需求延时处履行如下句子:
WDTCTL=WDT_ADLY_250;
IE|=WDTIE; //①
DelayTime|=Delay500ms //②
while((DelayTime&Delay500ms)==Delay500ms); //③
①处是装备看门狗作业在定时器形式,WDT每隔250 ms
发生一次中止请求。能够依据需求改动时钟节拍,在运用32768 Hz晶振奋为时钟源时,
能够发生1.9ms、16 ms、250 ms和1000 ms的延时基数。在头文件msp430xl4x.h中,将这
4种翻转时刻的WDT装备宏界说为:WDT_ADLY_1_9、WDT_ADLY_16、WDT_ADLY_250和
WDT_ADLY_1000。假如用DCOCLK作为SMCLK的时钟源,WDT挑选SMCLK=1 MHz为时钟源,
这样能够有O.064 ms、0.5 ms、8 ms和32 ms延时基数可供运用。
②处设置一个标志位,便利WDT ISR判别并进入相应的延时分支。
③处一向判别DelayTime标志组中的Delay500ms位,假如处于置位状况,
阐明所需的延时未到,履行空操作,直到延时时刻到,在WDTISR中将Delay500ms复位,跳出
while()循环,履行下一条指令。
同理,假如使命2需求30 s延时,经过WDTCTL=WDT_ADLY_1000激活WDT中止,每隔1 s
进中止一次,在WDT ISR中判别标志发现是Delay30s置位而不是Delay500ms履行30 s
延时程序分支。每中止一次,计数器nS加l,直到计到30,阐明30 s延时完结,清零计数器,
中止看门狗(WETCTL=WE)THOLD+WDTPW;)可中止发生中止,并复位该延时标志,
以告诉使命延时时刻到,能够履行下面的指令了。
在WDT ISR
中能够依据延时基数和计数器的调配完结恣意长度的时刻延时。在体系程序设计时,
先确认所需的不同延时时刻,然后在WDT。ISR
中增加相应的延时分支即可。嵌入式实时操作体系μC/OS-II移植于MSP430
单片机便是运用看门狗定时器发生时钟节拍的。
关于体系比较简单,只需求单一时长的延时.而又要考虑体系功耗时,
介绍另一种运用看门狗定时器中止完结延时的办法。若要延时1 s,则设定WDT每250 ms
中止一次。在需求延时处,发动看门狗定时器并答应其中止,体系进入低功耗形式3(共有5
种.形式)休眠。在中止服务程序中对延时时刻累加,当到达1 s时唤醒CPU,
并中止看门狗定时器中止。实例代码如下:
void main(void)
{
WDTCTL=WDT_ADT_ADLY_250)//发动WDT,每250 ms中止一次
IEII=WDTIE)//使能看门狗定时器中止
BIS_SR(LPM3_bitS+GIE);//体系休眠于低功耗形式3,开总中止
}
#pragrna vector=WDT_VECTOR
__interrupt void WDT_Delay(void)//看门狗中止服务程序
{
statlc unsigned charn=4;
if(逐个n==O){ //延时4×250 ms=1 s
_BlC_SR_IRQ(LPM3_blts);//将CPU从低功耗形式3唤醒
WDTCTL=WDTHOLD+WDTPW:
IEl&=~WDTIE;)//封闭看门狗定时器并制止其中止
}
这种办法充分发挥了MSP430系列的超低功耗特性,在等候延时的过程中,CPU
不需求一向判别标志位以得知延时完毕,而是进入省电形式。等候过程中,
只需极短的时刻会在中止服务程序中累计时刻并进行判别。能够依据需求设置CPU
进入不同的低功耗形式LPMx。假如体系运用了多种外设中止,
并在其他中止服务程序中也有唤醒CPU的句子,这种办法便不再适用了。
μs级延时不宜运用硬件延时,因为频频的进出中止会使CPU
用很多时刻来呼应中止和履行中止回来等操作。硬件延时的办法适用于ms
级以上的长时刻延时。
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 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;
//封闭XT2振荡器,设定DCO频率为1 MHz
DCOCTL=DCO2
//使得单指令周期为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
片内看门狗定时器的硬件延时计划和软件延时办法满意了不一起宽等级的延时需求,
特别软件延时,选用汇编程序剖析法得到了延时函数精确的延时时刻,
大大提高了软件延时精确度和程序调试功率,并在多种芯片接口程序中运用,
运转作用杰出。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/261013.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部