打印

新人求解惑-关于msp430G2553时钟校准问题

[复制链接]
2487|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
逍遥李|  楼主 | 2013-10-24 19:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include        <msp430g2553.h>
unsigned int        j;
unsigned char        i;

void        Init_clock(){
        DCOCTL        =0;
        BCSCTL1        =CALBC1_1MHZ;
        DCOCTL        =CALDCO_1MHZ;
}

void main(void) {
        WDTCTL=        WDTPW+WDTHOLD;
        Init_clock();
        P1DIR        |=BIT0;
        while(1){
                P1OUT        ^=BIT0;
                for(i=200;i>0;i--){                                        //理论上讲如果时钟被校准到1MHZ了,那么这里应该延时200×5ms=1s才对呀,为什么
                                                                                        //实际延时是10s呢?谁能帮我解释下,不胜感激!
                        j=5000;
                        while(j--);
                }
        }
}

相关帖子

沙发
逍遥李|  楼主 | 2013-10-24 19:21 | 只看该作者
补充一下,使用的是TI增送的launchpad板做的实验,P1.0接的是一个LED

使用特权

评论回复
板凳
TJU_lixiao| | 2013-10-25 08:25 | 只看该作者
这个for循环需要10个左右的指令周期吧。
200*5000*10/1000000=10

使用特权

评论回复
地板
逍遥李|  楼主 | 2013-10-25 10:12 | 只看该作者
TJU_lixiao 发表于 2013-10-25 08:25
这个for循环需要10个左右的指令周期吧。
200*5000*10/1000000=10

你好,按照这个程序来说for循环之执行200次的,就是说这个时间是不是应该是(200*10+5000*200)/1000000=1.002秒?换个说法,如果我把for循环取消,
程序写成如下:
#include        <msp430g2553.h>
unsigned int        j;
unsigned char        i;

void        Init_clock(){
        DCOCTL        =0;
        BCSCTL1        =CALBC1_1MHZ;
        DCOCTL        =CALDCO_1MHZ;
}

void main(void) {
        WDTCTL=        WDTPW+WDTHOLD;
        Init_clock();
        P1DIR        |=BIT0;
        while(1){
                P1OUT        ^=BIT0;
                        j=50000;                                                        //理论上讲这段延时应该是50ms,延时两次就是100ms=0.1s,但是实测时间基本上是1s
                                                                                                //为什么是这样呢?难道这校准后时钟是0.1MHZ?没道理呀,也没进行分频啊,
                                                                                                //分频也不可能有10分频吧,为什么呢?
                        while(j--);
                        j=50000;
                        while(j--);
        }
}

使用特权

评论回复
5
逍遥李|  楼主 | 2013-10-25 10:19 | 只看该作者
TJU_lixiao 发表于 2013-10-25 08:25
这个for循环需要10个左右的指令周期吧。
200*5000*10/1000000=10

非常感谢!我不进行时钟校准也试了一下,结果延时也是接近10s,也就是说不是时钟校准的问题,您看会不会是因为while(j--)这个指令执行周期就是10微秒?怎么会这么久呢?

使用特权

评论回复
6
TJU_lixiao| | 2013-10-25 15:43 | 只看该作者
逍遥李 发表于 2013-10-25 10:19
非常感谢!我不进行时钟校准也试了一下,结果延时也是接近10s,也就是说不是时钟校准的问题,您看会不会 ...

差不多是这个意思,C语言一条指令编译到汇编可能就不止一条了。430的单周期指令是汇编指令。你设置断点调试,看看一次循环使用了多少条汇编指令就知道一次循环耗费多少个周期了。在IAR编译器里下载调试时候有汇编程序窗口。。

使用特权

评论回复
7
TJU_lixiao| | 2013-10-25 16:02 | 只看该作者
逍遥李 发表于 2013-10-25 10:19
非常感谢!我不进行时钟校准也试了一下,结果延时也是接近10s,也就是说不是时钟校准的问题,您看会不会 ...

不对,我刚才说的不对。430里的汇编指令不一定是一个机器周期就能完成的。直接数汇编指令还不行,你还得找到对应的汇编指令所运行的机器周期。。

如果你需要延时建议你使用
__delay_cycles(x);//x必须是常量或则是常量表达式,如果是变量则编译报错!

使用方法你可以百度一下,这里不让发连接。。。。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
逍遥李 + 1 很给力!
8
逍遥李|  楼主 | 2013-10-25 16:12 | 只看该作者
TJU_lixiao 发表于 2013-10-25 16:02
不对,我刚才说的不对。430里的汇编指令不一定是一个机器周期就能完成的。直接数汇编指令还不行,你还得 ...

嗯,好的,我知道__delay_cycles(long int cycles);这条指令,谢谢你!

使用特权

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

本版积分规则

57

主题

1315

帖子

32

粉丝