这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 物联网技术 » 关于430单片机精确延时的一点问题。

共10条 1/1 1 跳转至

关于430单片机精确延时的一点问题。

菜鸟
2014-06-22 16:13:31     打赏
我在430单片机的intrinsics.h头文件里找到这个__intrinsic void __delay_cycles(unsigned long __cycles);精确延时函数,里面的cycles应该填写系统机器周期。 问题如下:我想请教#define Delay_ms(x) __delay_cycles((unsigned long)((unsigned int)x*1000000)/1000);与#define Delay_ms(x) __delay_cycles((unsigned long)((unsigned int)x*1000));有什么区别吗?
我用前一句延时可以做出Delay_ms(500)这样的500ms延时,但是用后一句的话,延时时间连几十ms(估计值,未测)都不到,非常快就过去了。是哪里出了问题呢? ps:晶振8M,8分频,主系统和子系统时钟都1M。



关键词: IAR     延时函数    

高工
2014-06-22 16:28:28     打赏
2楼

目测一下

编译后前面一句会比后面一句多几条asm语句,也就多消耗几个机器周期吧

是不是撸主代码其它部分有不合适的地方?



菜鸟
2014-06-22 16:38:46     打赏
3楼

同样的延时函数,只是#define改一下。别的地方都没动。

整体函数如下。

#include <msp430x14x.h>

#define Delay_s(x) __delay_cycles((unsigned long)((unsigned int)x*1000000));    //精确时钟周期延时函数。1000000代表选择的主时钟频率,
#define Delay_ms(x) __delay_cycles((unsigned long)((unsigned int)x*1000000)/1000);    //x=1时,等价于延时1000000个机器(时钟)周期,即1秒。
#define Delay_us(x) __delay_cycles((unsigned long)((unsigned int)x*1000000)/1000000);

#define uint unsigned int
#define uchar unsigned char

int main()
{
    WDTCTL = WDTPW + WDTHOLD;
    uint iq0;   
    BCSCTL1 &=~XT2OFF;                    //打开高速晶振 
    do  
    {  
       IFG1 &= ~OFIFG;                    // 清除振荡器失效标志     
       for (iq0 = 0xFF; iq0 > 0; iq0--);  // 延时,等待XT2起振  
    }  
    while ((IFG1 & OFIFG) != 0);          // 判断XT2是否起振          
    BCSCTL2 |= SELM_2+DIVM_3+DIVS_3+SELS; 
    P2SEL = 0x00;
    P2DIR = 0xFF;
    P2OUT = 0xFF;
    int i;
    for(i=0;i<20;i++)
    {
        Delay_ms(500);
        P2OUT ^= BIT4;
    }
    P2OUT = 0x00;
}

ps:P2口是小灯。板子就用了随便一个开发板。。


菜鸟
2014-06-22 16:41:04     打赏
4楼
见楼上。。。

院士
2014-06-22 17:13:32     打赏
5楼

楼主 看一下是否是因为在MSP430系统下的溢出。

我在IAR ARM下测试上面两个语句得出来的结果是一样的。


菜鸟
2014-06-23 00:19:31     打赏
6楼
感觉要溢出也应该是#define Delay_ms(x) __delay_cycles((unsigned long)((unsigned int)x*1000000)/1000);这个溢出啊。但是现在这个反而正常。 这个#define Delay_ms(x) __delay_cycles((unsigned long)((unsigned int)x*1000));反倒不正常。。。 再请教下。您说的溢出是指超过变量可以表示的上限吗?

高工
2014-06-23 00:30:27     打赏
7楼
我觉得应该是二楼说的情况,能不能查看两种情况的汇编代码呀。数据的长度不同,汇编后的代码也不同。这样指令多的耗时也多

菜鸟
2014-06-23 00:40:03     打赏
8楼
赶问怎么查看C的汇编代码啊?求教。

高工
2014-06-23 18:40:59     打赏
9楼
编辑界面右击工程点击options菜单项,选择c/c++ compiler选项卡中的list选项,勾选output assembler files,编译后则生成离线汇编代码文件。 调试界面下,点击view / disassembly 菜单项,则显示在线汇编代码窗口。

院士
2014-06-23 20:46:34     打赏
10楼
这两个语句前面都有两个下划线,一般为系统提供的针对硬件的函数,其提供的编译后即为机器周期数。不用看asm的汇编程序。

共10条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]