msp430的软硬件c延时程序设计

msp430的软硬件c延时程序设计

ID:13874460

大小:28.50 KB

页数:3页

时间:2018-07-24

msp430的软硬件c延时程序设计_第1页
msp430的软硬件c延时程序设计_第2页
msp430的软硬件c延时程序设计_第3页
资源描述:

《msp430的软硬件c延时程序设计》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、MSP430是超低功耗16位单片机,越来越受到电子工程师亲睐并得到广泛应用。C程序直观,可读性好,易于移植和维护,已被很多单片机编程人员所采用。MSP430集成开发环境(如IAREmbeddedWorkbench和AQ430)都集成了C编译器和C语言级调试器C—SPY。但是C语言难以实现精确延时,这一直困扰着很多MSP430单片机程序员。笔者在实际项目开发过程中,遇到很多需要严格时序控制的接口器件,如单总线数字温度传感器DSl8820、实时时钟芯片PCF8563(需要用普通]/o模拟12C总线时序)、三线制数

2、字电位器AD8402、CF卡(CompactFlashCard)等都需要μs级甚至纳ns级精确延时;而一些慢速设备只需要ms到s级的延时。为此,笔者提出了适合于不同延时级别需要的软件或硬件精确延时方法,并已实际应用,效果良好,大大缩短了开发周期。1硬件延时MSP430单片机系统程序多采用事件驱动机制,即在没有外部事件触发的情况下CPU休眠于低功耗模式中。当外部事件到来时,产生中断激活CPU,进入相应的中断服务程序(ISR)中。中断响应程序只完成两个任务,一是置位相应事件的标志,二是使MCU退出低功耗模式。主程

3、序负责使MCU在低功耗模式和事件处理程序之间切换,即在主程序中设一个无限循环,系统初始化以后直接进入低功耗模式。MCU被唤醒后,判断各标志是否置位。如果是单一标志置位,那么MCU执行相应的事件处理程序,完成后转入低功耗模式;若是有多个标志同时置位,主程序按照事先排好的消息队列对它们依次判别并进行处理,所有事件处理完毕以后MCU休眠,系统进入低功耗状态(该消息队列的顺序是按照任务的重要性设定的优先级)。在这种前后台系统中,由于主程序是无限循环,就必须关闭看门狗,与其闲置,不如用其定时器的功能作硬件延时。使用MS

4、P430单片机看门狗定时器实现任意时长精确延时,既满足了系统实时低功耗的要求,也弥补了使用无限循环延时的时间难确定和占用CPU时间长的缺点。通过下例,讲解在同一WDTISR中完成不同时长延时的技巧。#pragmavector=WD_r_VECTORinterruptvoidWDT_Delay(void){//看门狗中断服务程序if((DelayTime&Delay500ms)==Delay500ms){//判断需要500ms延时的标志是否置位staticunsignedintn250MS=O;n250MS;i

5、f(n250MS==2){//延时250ms×2=500msn250MS=0;//清零计数器DelayTime&=~Delay500ms;//复位标志位WDTCTL=WDTHOLDWDTPW;1El&=~WDTlE;//关闭看门狗定时器并禁止其中断}}if((DelayTime&Delay30s)==Delay30s){//判断需要的30s延时标志是否置位staticunsignedintnS=0;nS;if(nS==30){//延时1s×30=30snS=0;//清零计数器DelayTime&=~Delay

6、30s;//复位标志位WDTCTL=WDTHOLDWDTPW;IEl&=~WDTlE;//关闭看门狗定时器并禁止其中断}}}如果任务1需要500ms的延时,只需在需要延时处执行如下语句:WDTCTL=WDT_ADLY_250;IE┃=WDTIE;//①DelayTime┃=Delay500ms//②while((DelayTime&Delay500ms)==Delay500ms);//③①处是配置看门狗工作在定时器模式,WDT每隔250ms产生一次中断请求。可以根据需要改变时钟节拍,在使用32768Hz晶振作

7、为时钟源时,可以产生1.9ms、16ms、250ms和1000ms的延时基数。在头文件msp430xl4x.h中,将这4种翻转时间的WDT配置宏定义为:WDT_ADLY_1_9、WDT_ADLY_16、WDT_ADLY_250和WDT_ADLY_1000。如果用DCOCLK作为SMCLK的时钟源,WDT选择SMCLK=1MHz为时钟源,这样可以有O.064ms、0.5ms、8ms和32ms延时基数可供使用。②处设置一个标志位,方便WDTISR判别并进入相应的延时分支。③处一直判别DelayTime标志组中的D

8、elay500ms位,如果处于置位状态,说明所需的延时未到,执行空操作,直到延时时间到,在WDTISR中将Delay500ms复位,跳出while()循环,执行下一条指令。同理,如果任务2需要30s延时,通过WDTCTL=WDT_ADLY_1000激活WDT中断,每隔1s进中断一次,在WDTISR中判别标志发现是Delay30s置位而不是Delay500ms执行30s延时程序分支。每中断一次,计数器

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。