海滨消消 发表于 2020-11-2 16:42

IAR_msp430 自带的延时函数

(1)__delay_cycles()是IAR_msp430 自带的延时函数,目的是为了精确的延时。使用可以如下编写程序:
-------------------------------------------------------------------------
#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))
--------------------------------------------------------------------------
其中,CPU_F代表了CPU晶振,这里是8Mhz。
(2)__delay_cycles(time)编译出错
但是再使用这个函数是,time如果不是一个立即数,而是一个变量时候,如下:
-------------------------------------------
unsigned char time = 100;
delay_ms(time);
-------------------------------------------
会出现如下编译报告:
------------------------------------------------------------
Error: Intrinsic function parameter must be literal
------------------------------------------------------------
这是因为这个固有函数是为了精确延时,是不能赋值为变量的,如果是变量的话编译时候再加上编译器的汇编命令就不能精确延时了。所以为了这个目的,必须只能是赋值为立即数。
(3)如何写自己的精确延时函数
为了比较精确的延时,用固有函数还是比较好的选择,我们为了避免编译出错。可以通过一个循环把固有延时命令“套进去”,如下:
-------------------------------------
void Delay_1ms(int nr){
    for(short i=0;i
       delay_ms(1);
    }
}
-------------------------------------
此时就可以通过编译,使用变量nr来延时自己需要的时间了。

x史可法 发表于 2020-11-2 22:51

设计中会用到精确延时 有用

正圆椭圆 发表于 2020-11-2 23:01

不懂就问 立即数是什么数据类型

BettyBerry 发表于 2020-11-2 23:06

谢谢分享 但是有时候不知道究竟什么情况下要用到精准延时

weifeng90 发表于 2020-11-3 22:47

楼主应该发到TI板块吧

duo点 发表于 2020-11-24 15:43

立即数是什么数据类型

嵌入小菜菜 发表于 2020-11-25 09:45

这个是TI的芯片吧。怎么在这里呢?

zhamatu 发表于 2020-11-25 11:45

楼主应该是发错版块了,任何不使用硬件的延时,都是不精确的,即使是使用硬件的,比如定时器,误差也是很大的。

xixi2017 发表于 2021-1-14 22:54

这是想移植程序吗

piteqiu 发表于 2021-1-15 10:36

delay的准确度是相对的,一般是用滴答定时器或者不用的定时器做的,不开中断单纯的读取计数值

ayb_ice 发表于 2021-1-28 10:41

受中断影响大
页: [1]
查看完整版本: IAR_msp430 自带的延时函数