MSP430精确延时程序汇总
更新时间:2024-01-21 16:30:01 阅读量: 教育文库 文档下载
- 精确延时程序c语言推荐度:
- 相关推荐
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周期.
正在阅读:
MSP430精确延时程序汇总01-21
MongoDB基本概念12-30
齿轮检验的3个公差组12-09
白族的风俗习惯02-06
爷爷和土的阅读答案12-01
重庆电大《创新教学》教学模式改革方案03-08
第一次上篮球社团作文350字06-26
施工组织设计(审批)05-24
海南大学生物技术实验中心05-24
监理细则(范本)09-24
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 延时
- 精确
- 汇总
- 程序
- MSP430
- 中医学题库
- 红参、西洋参、三七、天麻、鹿茸、虫草、石斛、灵芝的用法 - 图文
- 湖南师大附中2011-2012学年高一下学期第一次月考数学试题
- 国家集训队精确叫牌法(五版)
- 磐安农业产业化领导小组办公室文件
- 精选-八年级数学下册第二十章数据的分析20-1数据的集中趋势20-1-1平均数第2课时用样本平均数估计总体平均数
- 快递项目可行性研究报告 - 图文
- Windows Server 2008 R2 中的安全事件的说明
- 2012-2013第一学期《如何正确书写化学方程式》教学设计 - 图文
- 取排水隧道工程施组
- 二年级数学下册 角教案2 沪科版
- 2014山东省六五普法卫生监督试题 - 多选题
- 最新2016-2017年北师大版一年级数学上册教学计划
- 矿物晶体化学 红砷镍矿 - 图文
- 一年级下册数学第八单元教学预案
- 北方首个国家海产品质检中心落户威海
- 人教版语文四年级下册字词过关检测密卷
- 普通话范文三十篇 - 图文
- 刑事侦查阶段提供法律帮助委托合同
- 2017年教师资格证考试《保教知识与能力》预测试题(1)