在这里, 我来讨论一下关于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的精准延时相关推荐

  1. MSP430 精准延时之定时器 TIMERA 0.5实现LED闪烁

    在经历过上一章的粗暴for()循环进行延时和简单的delay_ms(),delay_us()精准延时之后,本章介绍另一种精准延时定时器 定时器基本可以分为四种定时器 本章为大家着重介绍定时器timer ...

  2. STM32外设驱动---SysTick精准延时

    单片机:STM32F103  库函数:V3.5  描述:利用系统内核文件core_cm3.c内部SysTick实现1ms,1us的精准延时,时钟72MHz,涉及中断服务SysTick_Handler的 ...

  3. 【STM32/FreeRTOS】精准延时的实现

    目录 前言 SysTick定时器寄存器 裸机编程下实现 FreeRTOS中实现 前言 在使用通讯协议来驱动外设的时候需要遵循严格的时序逻辑,往往用到微秒(us)级别的延时,在裸机编程中可以使用SysT ...

  4. NXP JN5169使用滴答定时器进行精准延时

    NXP JN5169使用滴答定时器进行精准延时(us.ms) 一.滴答定时器介绍 二.滴答定时器系统图 1.系统图介绍 2.单次触发模式 3.可重启模式 4.连续运行模式 三.系统时钟 1.系统时钟域 ...

  5. STM32 精准延时

    延时,就是停在那,啥都不干,发呆.精准延时,就是发呆多长时间,是精确的. 比如,要求某个IO口维持低电平1毫秒后,再维持高电平3毫秒,就需要把IO口拉高,然后延时1毫秒,再拉低,再维持3毫秒. 类似这 ...

  6. MSP430杂谈--AD7745硬件IIC驱动与模拟IIC驱动

    和上一篇AD7793类似,项目中也涉及到利用AD7745读取电容值,来测环境湿度.编写了基于MSP430的AD7745的硬件IIC驱动和模拟IIC驱动,分享给大家. AD7745硬件IIC驱动完整版下 ...

  7. MSP430杂谈--AD7793硬件SPI驱动与模拟SPI驱动

    最近项目中用到了AD7793读取铂电阻值来得到相应的温度,编写了基于MSP430的硬件驱动程序和模拟驱动程序,并且能成功运行,现在记录一下分享给大家. AD7793硬件IIC驱动完整版下载链接:htt ...

  8. MSP430杂谈--时钟资源UCS的配置

    MSP430(F5529)相比MSP430(F149)来讲,功能更加强大. UCS简介 MSP430F5XX/MSP430F6XX系列器件的UCS包含有五种时钟源,依次是:XT1CLK.VLOCLK. ...

  9. 51单片机应用定时器实现精准延时函数的封装

    #include <STC89C5xRC.H>typedef unsigned char u8; typedef unsigned int u16; sbit led = P2^0; bi ...

最新文章

  1. Flutter——设置appBar的高度
  2. 《美国如何培养核心素养》读后感作文1900字
  3. delete file$ recovery----惜分飞
  4. Android应用程序的组成部分和Manifest文件(转)
  5. Disassembly3:variable
  6. 【渝粤教育】电大中专电商运营实操 (18)作业 题库
  7. php 查找无限级,Ztree + PHP 无限级节点 递归查找节点法
  8. 股票的科创板,新三板,创业板到底哪个能让你赚钱
  9. 为什么要学数据结构?| 原力计划
  10. U盘Linux游戏系统,batocera.linux U盘街机游戏系统下载
  11. 一、SIM800C简介
  12. 微信小程序如何被微信搜索收录?开启页面收录功能,被评定为达标
  13. 上班打卡--- 通过批处理命令执行jar文件来记录上班时间
  14. 2013海淀驾校学车日记
  15. 机器学习实战决策树画图理解
  16. 星空样式(HTML)
  17. 卸载Photoshop
  18. 巨量引擎平台广告审核规则
  19. 英语----我们快乐生活的一部分
  20. 微信接收不到企业微信消息推送

热门文章

  1. JDK 5、6、7、8、9、10、11、12、13、14 新特性汇总
  2. 虚拟机的磁盘扩大超过2T,发现超过2T的这部分无分区
  3. C中不安全的函数以解决办法汇总
  4. notepad 配置python_Notepad++配置Python开发环境的图文详解
  5. 小汤学编程之JAVA基础day11——集合框架:List/Set/Map集合、Collections集合工具类、泛型、TreeMap和TreeSet
  6. 基于类和对象的高精度算法封装
  7. spring jpa.踩坑经验分享
  8. Test on 11/24/2018
  9. UICollectionViewCell的设置间距
  10. SQL:JOIN ON