对MSP430单片机__delay_cycles精确延时的说明及改正

发布者:BlissfulCharm最新更新时间:2018-05-04 来源: eefocus关键字:MSP430  单片机  精确延时 手机看文章 扫描二维码
随时随地手机看文章

    在这里, 我来讨论一下关于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  单片机  精确延时 引用地址:对MSP430单片机__delay_cycles精确延时的说明及改正

上一篇:单片机程序死机跑飞查错指南
下一篇:430精确延时问题

推荐阅读最新更新时间:2024-03-16 16:01

单片机串口通信中断
#include reg52.h //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 /*------------------------------------------------ 函数声明 ------------------------------------------------*/ void SendStr(unsigned char *s); /*------------------------------------------------ 串口初始化 -----------------------------
[单片机]
ATMEGA16单片机熔丝位烧写设置
AVR单片机2009年用过,以后工作就没有用它了,现在对他有点陌生了,这段时间恰好有几片ATMEGA16就自己手动焊接了一个调试板,主要是点亮QC12864B和LCM1602C两种液晶屏,它们的资料都可以在网络上搜到,我就不上传了。电路连接如下,外接无源晶体8MHZ. PC0-PC7-----------------------------------DB0-DB7 PA3---------------------------------------RST PA4---------------------------------------E PA5---------------------------------------RW
[单片机]
ATMEGA16<font color='red'>单片机</font>熔丝位烧写设置
STM32F103单片机JTAG端口重映射
STM32单片机复位后,JTAG口默认是被占用的。如果想将JTAG占用的几个IO口设置为普通IO口,就需要进行端口重映射。 复位后端口默认功能可以在STM32参考手册上看到 要将JTAG占用的这些口设置为普通IO口时,需要用复用功能重映射,在程序开始执行时将JTAG口重映射为普通IO口。 将JTAG要设置为普通 IO口时,需要设置AFIO_MAPR寄存器的SWJ_CFG位。如果用寄存器操作的话,就直接设置这个寄存器的值就行。如果用库函数操作的话,可以直接调用库函数void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState)。 这个库函
[单片机]
STM32F103<font color='red'>单片机</font>JTAG端口重映射
MSP430初学:MSP430单片机C语言基础(一)
1.1标识符与 关键字 标识符用来标识程序中某个对象的名字,这些对象可以是语句、数据类型、函数、变量、常量、数组等。标识符由字母,数字或下画线构成,其第一个字符必须是字母或下画线。 例如,count_data,text2 是正确形式,而 2count 是错误形式。 哈哈,c语言有关的知识我就不记录那么多了,大家都会 1.2变量 在定义变量时,变量的类型必须与其被储存的数据类型相匹配,以保证程序中变量能够被正确地使用。当指定了变量的数据类型时,系统将为它分配若干相应字节的内存空间。 C430中变量类型以及描述如下: 这篇博客里,说明了一些其它的数据类型,在使用430的时候,会用到: c++ 基础数据类型 与
[单片机]
<font color='red'>MSP430</font>初学:<font color='red'>MSP430</font><font color='red'>单片机</font>C语言基础(一)
HOLTEK推出HT45R4U e-Banking单片机
Holtek推出e-Banking ASSP MCU - HT45R4U,内建LCD驱动器与高精准度32.768kHz RTC振荡器,RTC工作时MCU待机电流0.9uA (典型值),非常适合挑战应答产品的应用。 HT45R4U的特点在于工业规格(-40 ~ 85℃)、工作电压2.2V ~ 3.6V、具有16K Words程序内存、SRAM为1152 Bytes、内建ADC、LCD驱动器、内建精准RC振荡电路、休眠快速唤醒等功能。实为功能、性能、价格最具竞争力的MCU。 HT45R4U之Oscillator提供3种模式选择 -- HXT(高频Crystal)、LXT(32.768kHz Crystal)及HIRC,可由内部
[单片机]
单片机学习小记
1.单片机用 C语言来编程要记住和运行简单 C 语言的小不同,单片机一直在执行程序,C语言只要一个结果,死循环可能出错 for(i=1;i 5;i++) { LCD_DATE(tab ); //NIAN=2015 此为LCD1602显示2015 NAIN=NIAN%k; k=k/10; } 这就忽略了这个问题,当NIAN循环完一次,NIAN=5, 不要忘记单片机一直在执行​,并且速度很快,最终你看到的是 0000 改好的程序 int x=NIAN; for(i=1;i 5;i++) { LCD_DATE(tab ); //2015 x=x%k; k=k/10; }
[单片机]
技术干货—11种常见单片机电路设计模块分享
1、双路232通信电路 3线连接方式,对应的是母头,工作电压5V,可以使用MAX202或MAX232。 2、三极管串口通信 本电路是用三极管搭的,电路简单,成本低,但是问题,一般在低波特率下是非常好的。 3、单路232通信电路 三线方式,与上面的三级管搭的完全等效。 4、USB 采用的是PL2303HX,价格便宜,稳定性还不错。 5、SP706S复位电路 带看门狗和手动复位,价格便宜(美信的贵很多),R4为调试用,调试完后焊接好R4。 6、SD卡模块电路(带锁) 本电路与SD卡的封装有关,注意与封装对应。此电
[电源管理]
技术干货—11种常见<font color='red'>单片机</font>电路设计模块分享
MCU 面临 800V 电动汽车牵引逆变器的 3 种挑战
电动汽车 (EV) 牵引逆变器是电动汽车的核心。它将高压电池的直流电转换为多相(通常是三相)交流电来驱动牵引电机并控制制动能量的再生。电动汽车电子设备正在从 400V 架构转向 800V 架构,这正在逐步现实、普及,更高的电压会带来至少三个好处: - 快速充电 - 在相同电流下提供双倍的电量。 - 通过使用碳化硅 (SiC) 提高效率和功率密度。 - 通过使用更细的电缆来减轻重量,从而减少 800V 相同额定功率所需的电流。 在牵引逆变器中,微控制器(MCU)是系统的大脑,通过模数转换器(ADC)执行电机控制、电压和电流采样,使用磁芯计算磁场定向控制(FOC)算法,使用脉宽调制 (PWM) 信号驱动功率场效应晶体管
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved