打印
[华山论剑]

IAR_msp430 自带的延时函数

[复制链接]
797|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
海滨消消|  楼主 | 2020-11-2 16:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
(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[Ta003]: 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 | 只看该作者
谢谢分享 但是有时候不知道究竟什么情况下要用到精准延时

使用特权

评论回复
5
weifeng90| | 2020-11-3 22:47 | 只看该作者
楼主应该发到TI板块吧

使用特权

评论回复
6
duo点| | 2020-11-24 15:43 | 只看该作者
立即数是什么数据类型

使用特权

评论回复
7
嵌入小菜菜| | 2020-11-25 09:45 | 只看该作者
这个是TI的芯片吧。怎么在这里呢?

使用特权

评论回复
8
zhamatu| | 2020-11-25 11:45 | 只看该作者
楼主应该是发错版块了,任何不使用硬件的延时,都是不精确的,即使是使用硬件的,比如定时器,误差也是很大的。

使用特权

评论回复
9
xixi2017| | 2021-1-14 22:54 | 只看该作者
这是想移植程序吗

使用特权

评论回复
10
piteqiu| | 2021-1-15 10:36 | 只看该作者
delay的准确度是相对的,一般是用滴答定时器或者不用的定时器做的,不开中断单纯的读取计数值

使用特权

评论回复
11
ayb_ice| | 2021-1-28 10:41 | 只看该作者
受中断影响大

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

239

主题

1617

帖子

2

粉丝