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

发布者:PositiveEnergy最新更新时间:2016-01-20 来源: eefocus关键字:MSP430  单片机  软硬件  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级的延时。为此,
笔者提出了适合于不同延时级别需要的软件或硬件精确延时方法,并已实际应用,效果良好
,大大缩短了开发周期。  
硬件延时
    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
级以上的长时间延时。
软件延时
在对数字温度传感器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
片内看门狗定时器的硬件延时方案和软件延时方法满足了不同时宽级别的延时需求,
尤其软件延时,采用汇编程序分析法得到了延时函数准确的延时时间,
大大提高了软件延时精确度和程序调试效率,并在多种芯片接口程序中应用,
运行效果良好。
关键字:MSP430  单片机  软硬件  C延时程序 引用地址:MSP430单片机的软硬件C延时程序设计

上一篇:单片机定时器初值计算举例
下一篇:单片机与24C02的通讯

推荐阅读最新更新时间:2024-03-16 14:44

STC单片机精确延时参数测定方法
在使用STC单片机的时候,大家是不是会遇见一个问题:延时往往很难把握。当然可以使用延时函数产生波形输出到示波器观察来修改延时参数,但是没有示波器时有没有方法来确定延时参数呢。我这里自创了个办法,发到这与大家分享一下。 其方法是这样,首先设置好定时器的定时时间,在调用延时函数前打开定时器,定时器中断函数中读取出延时参数,然后通过串口将延时参数输出。具体代码如下: //程序说明:测试stc单片机延时常数,串口输出 //作者:mjx //注:程序测量精度高,适用stc这种指令不固定的单片机 #include STC12C5A60S2.h #include intrins.h int i,j,ii,jj;//ii,jj作为定
[单片机]
51单片机程序——按键控制LED灯
#include reg52.h void Delay(unsigned int t); sbit key=P3^2; //对应单片机开发板上s19按键 void main (void) { while (1) //函数开始后,一直在检测按键是否被按下 { if(key==0) { unsigned char i; //定义一个无符号字符型局部变量 i 取值范围 0~255 P0=0x7f; //赋初始值,右边第一个灯亮起来 for(i=0;i 8;i++) //加入 for循环,表明for循环大括号中的程序循环执行8次 { Delay
[单片机]
STM32F0单片机快速入门二 开发环境的建立
1.最小硬件系统 让 STM32F030 运行起来非常简单,在硬件上仅需给数字电源和模拟电源引脚(VDD,VDDA)供电,最好分别加上去耦电容。推荐值: VDD引脚加 1个4.7uF并联几个0.1uF 电容,VDDA 引脚加 1个1uF并联 1个0.01uF电容。电容值大些小些,甚至不加,对调试都不会有太大影响。 需要注意的是 VDD 需要在2.4V和3.6V之间,VDDA需要大于等于VDD。当然我们最常见的用法是把VDD和VDDA都接到3.3V。 VDD和VDDA之间用磁珠隔离一下,有助于提高模拟部分电路(ADC, RC震荡器,PLL等)的稳定性。 如上图,是一个可以让单片机工作起来的最小硬件系统。Boot0 引脚需要下拉
[单片机]
STM32F0<font color='red'>单片机</font>快速入门二 开发环境的建立
STM32单片机如何通过定时器的控制输出PWM
STM32F103ZET6里共有8个定时器,其中高级定时器有TIM1-TIM5、TIM8,共6个。 我这里输出PWM的定时器是TIM2,空闲的定时器是TIM3。以TIM2为主定时器,TIM3为从定时器对TIM2的输出脉冲数进行计数。 查表可知,TIM3为从定时器选择TIM2为触发源,需要配置TS=001,即选择ITR1。 实现通过定时器控制输出PWM个数的功能,可以有如下一种配置方式: void TIM2_Mas te r__TIM3_Slave_Configuration(u32 PulseFrequency) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OC
[单片机]
STM32<font color='red'>单片机</font>如何通过定时器的控制输出PWM
提高 MSP430G 系列单片机的 Flash 擦写寿命的方法
摘要 在嵌入式设计中,许多应用设计都需要使用EEPROM 存储非易失性数据,由于成本原因,某些单片机在芯片内部并没有集成EEPROM。MSP430G 系列处理器是TI 推出的低成本16 位处理器,在MSP430G 系列单片机中并不具备EEPROM。为了存储非易失性数据,MSP430G 系列处理器在芯片内部划分出了256 字节的Flash 空间作为信息Flash,可用于存储非易失性数据,但是由于Flash 与EEPROM 在擦写寿命上存在一定差距,所以在实际应用中,这种应用方式并不能够满足所有客户的需求。本应用笔记介绍了使用代码区域Flash 来模拟EEPROM,通过一定的软件处理算法,可以大大增加数据存储周期的一种方法。本文给
[单片机]
提高 <font color='red'>MSP430</font>G 系列<font color='red'>单片机</font>的 Flash 擦写寿命的方法
工业物联网Wi-Fi MCU选型时需要了解的内容
在评估用于IIoT的Wi-Fi MCU时,设计人员需要考虑多种功能,例如ADC,接口,安全性和互操作性。 随着工业物联网(IIoT)的发展,趋势是在单个片上系统(SoC)中而不是在多个分立设备中执行更多功能,因为其结果是材料清单更少,设计风险更小且占地面积更小。一个很好的例子是Wi-Fi微控制器(MCU),它将Wi-Fi与处理器和GPIO集成在一起,以满足各种应用程序的需求。Wi-Fi MCU要谨慎选择,有多个因素需要考虑,理解它们很重要。 当今市场上存在低成本的Wi-Fi选型,但通常会在外围设备数量和整体性能方面做出牺牲。这意味着选择最佳的Wi-Fi MCU具有挑战性和风险,因为启用Wi-Fi的MCU不仅必须具有强大的W
[物联网]
工业物联网Wi-Fi <font color='red'>MCU</font>选型时需要了解的内容
multisim单片机协同仿真
Multisim11.0是加拿大NI公司的一款极好的模电数电及电子行业的制作开发仿真软件,其功能之强大,让我初次体验便爱不释手。里面有各种各样的电子元器件,仿真仪器,就说示波器吧,最次的一台也至少得几千块,然而在你的PC机上安装了这个软件之后,你将不花费一分钱使用各种仪器,甚至有些仪器学校里也不一定有哦!还有一点值得提一下的是,配合NI公司的labview,你将可以根据自己的需要设计出自己的仪器,加载进来便可以使用。同时,如果再安装上与之配套的PowerPCB,将实现从最初的设计到中途的仿真以及生成PCB板子。整个设计过程在一个软件中完成,将会给您的设计带来极大的方便,节省宝贵的开发时间! 好了,就不给它们做广告了!给一个例子让大家
[单片机]
multisim<font color='red'>单片机</font>协同仿真
基于Modbus协议实现单片机与PLC之间的通讯
1 引言 HMI(人机界面)以其体积小,高性能,强实时等特点,越来越多的应用于工业自动化系统和设备中。它有字母、汉字、图形和图片等不同的显示,界面简单友好。配有长寿命的薄膜按钮键盘,操作简单。它一般采用具有集成度高、速度快、高可靠且价格低等优点的单片机 作为其核心控制器,以实现实时快速处理。 PLC和单片机结合不仅可以提 PLC的数据处理能力,还可以给用户带来友好简洁的界面。本文以 Modbus通讯协议为例,详细讨论了一个人机系统中,如何用C51实现单片机和PLC之间通讯的实例。 2 Modbus通讯协议 Modbus协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络和其它设备之间可以通信
[工业控制]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved