MSP430精确延时程序汇总.doc_第1页
MSP430精确延时程序汇总.doc_第2页
MSP430精确延时程序汇总.doc_第3页
MSP430精确延时程序汇总.doc_第4页
MSP430精确延时程序汇总.doc_第5页
已阅读5页,还剩1页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

430精确延时问题 今天在晚上发现一种MSP430的精确延时方法,经测试,确实狠精确。最低可以精确到1/OSC,例如:如果采用8MHz的晶体,那么最小延时就是125ns,已经利用示波器通过验证。具体做法如下:先做如下预定义:#define CPU_F (double)8000000) #define delay_us(x) _delay_cycles(long)(CPU_F*(double)x/1000000.0) #define delay_ms(x) _delay_cycles(long)(CPU_F*(double)x/1000.0) 其中第一行中的8000000为时钟,可以根据自己时钟设置。然后在程序中直接条用delay_us和delay_ms即可。非常好用,入:delay_ms (1); /延时1msdelay_us(1); /延时1usdelay_us(0.125); /延时0.125us注意:最低延时只能是1/OSC,否则就没有延时了。该方法缺点:不能传递变量,只能将常数作为参数IAR FOR 430中精确软件延时方法标签: IAR FOR 软件 延时 2010-11-04 10:15 IAR FOR 430中精确软件延时方法在用单片机的时候常常会用到延时函数,430也不例外,常见的形式有: void delay(unsigned int ms) unsigned int i,j;for( i=0;ims;i+)for(j=0;j1141;j+); /8MHz晶振时复制代码/以上程序段在要求延时精度不高的场合可以用。但在 IAR 软件430的编译器里面我们可以利用它内部的延时子程序来实现我们想要的高精度软件延时,方法如下:(1):将以下这段代码复制到你的.C源文件中。 #define CPU_F (double)8000000)#define delay_us(x) _delay_cycles(long)(CPU_F*(double)x/1000000.0)#define delay_ms(x) _delay_cycles(long)(CPU_F*(double)x/1000.0)复制代码(2):修改在 #define CPU_F (double)8000000) 语句里 8000000 修改成你当前MSP430 CPU的主频频率,即CPU的MCLK。单位为HZ。本例中的8000000为MCLK=8MHZ 的意思。(3):使用范例delay_us(1); /1 微秒的延时delay_ms(1); /1 毫秒的延时delay_us(3.5); /延时3.5微秒delay_ms(3.5); /延时3.5毫秒delay_ms(1000); /延时1秒MSP430系列单片的中断实现与中断嵌套! 1)430默认的是关闭中断嵌套的,除非你在一个中断程序中再次开总中断EINT;2)当进入中断程序时,只要不在中断中再次开中断,则总中断是关闭的,此时来中断不管是比当前中断 优先级高还是低都不执行;3)若在中断A中开了总中断,则可以响应后来的中断B(不管B的优先级比A高还是低),B执行完再继续执行A。注意:进入中断B后总中断同样也会关闭,如果B中断程序执行时需响应中断C,则此时也要开总中断,若不需响应中断,则不用开中断,B执行完后跳出中断程序进入A程序时,总中断会自动 打开;4)若在中断中开了总中断,后来的中断同时有多个,则会按优先级来执行,即中断优先级只有在多个中断同时到来时才起做用!5)对于单源中断,只要响应中断,系统硬件自动清中断标志位,对于TA/TB定时器的比较/捕获中断,只要访问TAIV/TBIV,标志位倍被自动清除;对于多源中断要手动清标志位,比如P1/P2口中断,要手工清除相应的标志,如果在这种中断用EINT();开中断,而在打开中断前没有清标志,就会有相同的中断不断嵌入,而导致堆栈溢出引起复位,所以在这类中断中必须先清标志再打开中断开关.中断响应时间中断的响应时间就是中断的响应过程的时间,中断的响应过程是当有事件产生,进入中断之前必须先记住当前正在做的事情,然后去处理发生的事情,处理这个过程的时间,叫做中断相应时间。计算机中也是采用的这种方法,五个中断源,每个中断产生后都到一个固定的地方去找处理这个中断的程序,当然在去之前首先要保存下面将执行的指令的地址,以便处理完中断后回到原来的地方继续往下执行程序。 公示定义计算机接收到中断信号到操作系统作出响应,并完成切换转入中断服务程序的时间。对于占先式内核,要先调用一个特定的函数,该函数通知内核即将进行中断服务,使得内核可以跟踪中断的嵌套。占先式内核的中断响应时间由下式给出: 中断响应时间关中断的最长时间 保护CPU内部寄存器的时间 进入中断服务函数的执行时间 开始执行中断服务例程(ISR)的第 一条指令时间 问:msp430的C语言中,如何定义一个变量到绝对地址? 比如,如何将char数组str12的首地址定义到0300h答:比如我们在UART应用中。我们可以在指定地址定义接收缓存的首地,如下:_no_init char data_ptr100 0x0400;/定义接收缓存的首地址为0x0400评论回复 aida66 2011-07-22 14:22 又不能用。iar for msp430里有没有_delay_cycles()这条指令。回复 FIH 2011-07-25 15:53 有的 在 intrinsics.h中,/* Insert a delay with a specific number of cycles. */_intrinsic void _delay_cycles(unsigned long _cycles);,具体要看CPU时钟试了半天还是iar自带的延时准啊!_delay_cycles【转】 (2011-08-07 09:23:52)转载标签:杂谈_delay_cycles();一个mclk的周期延时。比我自己算的准多了,tnnd我算了一个下午,算指令周期,看汇编代码,算了半天,还有什么网上的n5 + 6 ,毛啊根本不是这样的,我用的是dco 1mhz软件算出来的结果差到八千里外了,伤心。肯定是哪里出了问题,不过好在最后我试一下_delay_cycles()不错,这才是我要的us ms级别的延时函数,虽然是软件延时,但是用在微小时序操作上够用了吧!具体如下【引用别人的,这个延时函数很高】:注意: _delay_cycles(x),x必须是常量或则是常量表达式,如果是变量则编译报错!IAR FOR AVR中精确软件延时方法在用单片机的时候常常会用到延时函数,430也不例外,常见的形式有:void delay(unsigned int ms)unsigned int i,j;for( i=0;ims;i+)for(j=0;j1141;j+); /8MHz晶振时复制代码/以上程序段在要求延时精度不高的场合可以用。但在 IAR 软件430的编译器里面我们可以利用它内部的延时子程序来实现我们想要的高精度软件延时,方法如下:(1):将以下这段代码复制到你的.C源文件中。#define CPU_F (double)8000000)#define delay_us(x) _delay_cycles(long)(CPU_F*(double)x/1000000.0)#define delay_ms(x) _delay_cycles(long)(CPU_F*(double)x/1000.0)复制代码(2):修改在 #define CPU_F (double)8000000) 语句里 8000000 修改成你当前MSP430 CPU的主频频率,即CPU的MCLK。单位为HZ。本例中的8000000为MCLK=8MHZ 的意思。(3):使用范例delay_us(1); /1 微

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论