MSP430精确延时程序汇总

更新时间:2024-01-21 16:30:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

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); //延时1ms delay_us(1); //延时1us delay_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;i

for(j=0;j<1141;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口中断,要手工清除相应的标志,如果在这种中断用\开中断,而在打开中断前没有清标志,就会有相同的中断不断嵌入,而导致堆栈溢出引起复位,所以在这类中断中必须先清标志再打开中断开关.

中断响应时间

中断的响应时间就是中断的响应过程的时间,中断的响应过程是当有事件产生,进入中断之前必须先记住当前正在做的事情,然后去处理发生的事情,处理这个过程的时间,叫做中断相应时间。

计算机中也是采用的这种方法,五个中断源,每个中断产生后都到一个固定的地方去找处理这个中断的程序,当然在去之前首先要保存下面将执行的指令的地址,以便处理完中断后回到原来的地方继续往下执行程序。 公示定义

计算机接收到中断信号到操作系统作出响应,并完成切换转入中断服务程序的时间。对于占先式内核,要先调用一个特定的函数,该函数通知内核即将进行中断服务,使得内核可以跟踪中断的嵌套。占先式内核的中断响应时间由下式给出:

中断响应时间=关中断的最长时间 +保护CPU内部寄存器的时间 +进入中断服务函数的执行时间 +开始执行中断服务例程(ISR)的第 一条指令时间 问:msp430的C语言中,如何定义一个变量到绝对地址?

比如,如何将char数组str[12]的首地址定义到0300h

答:比如我们在UART应用中。我们可以在指定地址定义接收缓存的首地,如下: __no_init char data_ptr[100] @ 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我算了一个下午,算指令周期,看汇编代码,,算了半天,还有什么网上的n×5 + 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;i

for(j=0;j<1141;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秒

------------------------------------------------------------------------------------- 原因:

__delay_cycles()是编译系统\涵数\编译时会替换成相应的循环代码.

看图片,要求delay 100指令(时钟)周期,编译后刚好100周期.

复制代码(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秒

------------------------------------------------------------------------------------- 原因:

__delay_cycles()是编译系统\涵数\编译时会替换成相应的循环代码.

看图片,要求delay 100指令(时钟)周期,编译后刚好100周期.

本文来源:https://www.bwwdw.com/article/fero.html

Top