当前位置: 首页 > news >正文

【精确延时函数】IAR(MSP430)中的精确延时函数

在 IAR 软件430的编译器里面我们可以利用它内部的延时子程序来实现我们想要的高精度软件延时,方法如下:

具体如下【引用别人的,这个延时函数很高】:

注意: __delay_cycles(x),x必须是常量或则是常量表达式,如果是变量则编译报错!
IAR FOR AVR中精确软件延时方法
在用单片机的时候常常会用到延时函数,430也不例外,常见的形式有:
void delay(unsigned int ms)
{
unsigned int i,j;
for( i=0;i<ms;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()是编译系统"涵数",IAR编译时会替换成相应的循环代码.
看图片,要求delay 100指令(时钟)周期,编译后刚好100周期.

试了半天还是iar自带的延时准啊!!__delay_cycles【转】

使用这种延时需要注意:

http://www.ourdev.cn/thread-756021-1-1.html

  1. #define _delay_us(A)\
  2.   __delay_cycles( (uint32) ( (double)(F_CPU) *((A)/1000000.0) + 0.5))
  3. #define _delay_ms(A)\
  4.   __delay_cycles( (uint32) ( (double)(F_CPU)*((A)/1000.0) + 0.5))
  5. #define _delay_s(A)\
  6.   __delay_cycles( (uint32) ( (double)(F_CPU)*((A)/1.0) + 0.5))

相关文章:

  • 【Clng与Cint】clng与cint的区别及防溢出函数
  • 【寻址方式】直接寻址、位寻址、立即数寻址、寄存器寻址等
  • 【高效单片机语言结构】怎样最好地使用MSP430 编译器的建议
  • 【RS-485收发切换】使用RS-485要注意的一个问题
  • 【汇编指令】MSP430汇编指令
  • 【关于堆栈和指针】关于堆栈和指针 不错的文章
  • 【参数传递方式】参数用指针好还是用数值好(区别)结构体/指针做参数
  • 【JLINK与JTAG】JLINK与JTAG的区别,JTAG和H-JTAG和SBW的区别
  • 【单片机开发平台】msp430几种不同开发平台的对比
  • 【CPU寄存器】MSP430功耗相关寄存器
  • 【单片机汇编指令】单片机汇编指令入门学习和查看
  • 【IAR下的汇编】IAR下的汇编/单片机启动代码汇编
  • 【向上取整/向下取整】C语言向上或向下取整 函数
  • 【IAR启动代码】IAR MSP430 启动代码的修改
  • 【C库函数】C库函数
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • Java读取Properties文件的六种方法
  • Joomla 2.x, 3.x useful code cheatsheet
  • V4L2视频输入框架概述
  • 反思总结然后整装待发
  • 今年的LC3大会没了?
  • 蓝海存储开关机注意事项总结
  • 前端面试总结(at, md)
  • 入口文件开始,分析Vue源码实现
  • 通过git安装npm私有模块
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 云大使推广中的常见热门问题
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • ​Spring Boot 分片上传文件
  • # 数论-逆元
  • #{}和${}的区别是什么 -- java面试
  • #define 用法
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • (1)(1.13) SiK无线电高级配置(五)
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (二)Linux——Linux常用指令
  • (分布式缓存)Redis持久化
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (四)Android布局类型(线性布局LinearLayout)
  • (五)网络优化与超参数选择--九五小庞
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (转)平衡树
  • ****Linux下Mysql的安装和配置
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .Net 应用中使用dot trace进行性能诊断
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • .Net转Java自学之路—SpringMVC框架篇六(异常处理)
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...