MSP430使用__delay_cycles实现延时1ms和1us
在这里, 我来讨论一下关于MSP430单片机使用__delay_cycles延时的问题.
IAR for MSP430编译器提供了一个编译器内联的精确延时函数(并非真正的
函数)以提供用户精确延时使用, 该函数原型是:
__intrinsic void __delay_cycles(unsigned long __cycles);
该内部函数实现__cycles个CPU周期的延时,但对于该参数的设置,我要陈述一下:
__cycles需要我们传递的是CPU运行的周期个数
网上普遍的用法是:#define CPU_CLOCK 8000000#define delay_us(us) __delay_cycles(CPU_CLOCK/1000000*(us))#define delay_ms(ms) __delay_cycles(CPU_CLOCK/1000*(ms))在CPU主时钟频率为8MHz时, 这确实没有问题, 但是这样的写法:#define CPU_CLOCK 8000000
这很容易让人们想到, 可以通过修改它的值以实现对不同主频系统参数的统一,其实
这是不正确的! 比如修改为#define CPU_CLOCK 32768以实现32KHz主频的延时…
下面来计算看看:当系统主时钟频率CPU_CLOCK为8MHz时:频率 f = 8MHz = 8,000,000Hz机器周期 Tm = 1/f = 1/8MHz = 1/8us
也就是说,一个机器周期(nop)的时长是1/8us,所以延时1us即8*Tm,同上面:#define delay_us(us) __delay_cycles(8*(us))#define delay_ms(ms) __delay_cycles(8000*(ms))按照上面的宏定义方法,我们把CPU_CLOCK定义成32768,那么:频率 f = 32KHz = 32,768Hz机器周期 Tm = 1/f = 1/32768Hz ~= 30.5us
可想而知,CPU最短的指令执行周期为30.5us, 这时, 想延时1us, 这可能吗?
所以, 简单地把上面的定义改成
#define CPU_CLOCK 32768
是绝对错误的.
同样, 还有些朋友实现了0.5us的延时, 这在当f = 1MHz = 1000000Hz时也
是不现实的, 此时机器周期Tm = 1us. 在f = 8Mhz时, 4个机器周期为0.5us尚可.
所以, 为避免引起错误的使用或不正确的理解,最好像下面这样定义宏:#if CPU_CLOCK == 8000000#define delay_us(us) __delay_cycles(8*(us))#define delay_ms(ms) __delay_cycles(8000*(ms))#else#pragma error "CPU_CLOCK is defined implicitly!"#endif
另外:
__delay_cycles 并不是真正的函数, 只是提供编译器内联展开,该函数并
不支持变量参数, 其参数只能是常数.
MSP430使用__delay_cycles实现延时1ms和1us相关推荐
- 【精确延时函数】IAR(MSP430)中的精确延时函数
在 IAR 软件430的编译器里面我们可以利用它内部的延时子程序来实现我们想要的高精度软件延时,方法如下: 具体如下[引用别人的,这个延时函数很高]: 注意: __delay_cycles(x),x必 ...
- linux下延时1ms用什么函数,Linux下1ms分辨率定时器推荐方式
我需要一个在Linux下具有1ms分辨率的计时器刻度.它用于递增计时器值,该计时器值又用于查看是否应触发各种事件.由于glibc的要求,POSIX timerfd_create不是一个选项.我尝试使用 ...
- c语言1ms延时程序,请教老师,51微控制器在12M晶振,C语言程式设计时,延时函式120次=1ms(书本上是这样的,不懂),是怎样得来的?...
请教老师,51微控制器在12M晶振,C语言程式设计时,延时函式120次=1ms(书本上是这样的,不懂),是怎样得来的?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集 ...
- 延时1us程序12mhz晶振c语言,51单片机12M晶振的延时程序
这是本人慢慢调出来的参数,有误差是必须的,除非用汇编才会精确,后续我会更新修改,尽量精确. 调试环境:Keil V4.02本文引用地址:http://www.eepw.com.cn/article/2 ...
- 延时1us程序12mhz晶振c语言,51单片机 Keil C 延时程序的简单(晶振12MHz,一个机器周期1us.)...
一. 500ms延时子程序 void delay500ms(void) { unsignedchari,j,k;for(i=15;i>0;i--)for(j=202;j>0;j--)for ...
- 单片机的延时与中断问题及解决方法
延时与中断出错,是单片机新手在单片机开发应用过程中,经常会遇到的问题,本文汇总整理了包含了MCS-51系列单片机.MSP430单片机.C51单片机.8051F的单片机.avr单片机.STC89C52. ...
- STM32外设驱动---SysTick精准延时
单片机:STM32F103 库函数:V3.5 描述:利用系统内核文件core_cm3.c内部SysTick实现1ms,1us的精准延时,时钟72MHz,涉及中断服务SysTick_Handler的 ...
- STM32系统定时器SysTick(只能向下递减)延时闪烁灯
参考:stm32 系统定时器 SysTick 作者:点灯小哥 发布时间: 2021-03-10 13:46:00 网址:https://blog.csdn.net/weixin_46016743/ar ...
- STM32使用定时器延时
STM32F427 使用定时器T4作为延时定时器 设置如下:主要是预分频设置为90,因为系统APB1的时钟是90Hz 预分频90 #ifndef __DELAY_H__ #define __DELAY ...
- matlab怎样编写延时函数,编写延时函数的简单方法
原标题:编写延时函数的简单方法 如果从keil里看了c语言的反汇编代码然后根据晶振和指令计算延时的时间这样虽然非常的准确但是相当的麻烦而且容易搞错,我这里介绍一个最简单的方法.可以验证你的 这里用一个 ...
最新文章
- BI+Tableau
- authentication list default is not defined for PPP
- 文件服务器和客户模式有什么区别,客户端和服务器端编程有什么区别?
- java创建对象 的初始化顺序
- Hive之DDL数据定义
- 【剑指offer】面试题12:矩阵中的路径(Java)
- 在图片中选定任意凸多边形制作掩膜程序MATLAB
- 读书笔记《Java开发技术-在架构中体验设计模式和架构之美》
- 一点关于MD5计算的封装
- Nagios安装配置教程(二)环境搭建
- Mybatis的xml映射文件,sql的模糊查询的实现(两种方式)占位符拼接,concat关键字
- CNDS博客,文章发布时提示“请勿使用默认标题”
- python中计算带分数_[NVDA addon] Access8Math 2.3 數學輔助程式 - 更新相容於 python3
- tcpudp测试工具的使用,串口转wifi模块udp测试
- 科学与信息化杂志科学与信息化杂志社科学与信息化编辑部2022年第15期目录
- 《强化学习周刊》第65期:Neurips2022强化学习论文推荐(5)、MIT:机器狗当守门员、具身智能与机器人研讨会...
- NodeJs之邮件(email)发送
- Pandas---条件筛选与组合筛选
- STM32通用定时器实现us微秒延时
- 一文搞懂全排列、组合、子集问题