打印

msp430f235的MCLK、SMCLK、ACLK时钟信号输出问题

[复制链接]
6095|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
图1      图2
各位430单片机的大咖们:
     你们好,小弟刚刚开始学习430单片机,很多东西还不是很理解,在此请教你们一些问题。
     图1是我用proteus仿真设计的一个简单电路图,仿真的目的是想用示波器测量MCLK、SMCLK以及ACLK的频率,看看这些频率是否与我设置的时钟源的频率一致。但是不知道为什么,仿真时用示波器测量3个时钟信号,输出都是低电平,实验结果如图2所示。
     程序为:
#include <msp430f235.h>
void clock_init();
void port_init();

/**************************************************/
//               main program                      //
/**************************************************/
void main( void )
{
  WDTCTL = WDTPW + WDTHOLD;            // Stop watchdog timer to prevent time out reset
  clock_init();
  port_init();
  for(;;);
}

/**************************************************/
//               port initiallize program          //
/**************************************************/
void port_init()
{
  P5DIR |=BIT4+BIT5+BIT6;                   //Set P5.4 P5.5 P5.6 output
  P5SEL |=BIT4+BIT5+BIT6;                   //P5.4=MCLK,P5.5=SMCLK,P5.6=ACLK
}

/**************************************************/
//              clock initiallize program         //
/**************************************************/
void clock_init()
{
  DCOCTL |=DCO0+DCO1;                          //设置DCO模式
  BCSCTL1 |=XT2OFF+RSEL2+RSEL1+RSEL0;
  BCSCTL2 |=DIVM_3+DIVS_2;                     //f(MCLK)=f(DCO)/8; f(SMCLK)=f(DCO)/4; f(ACLK)=f(XT1);
}


相关帖子

沙发
vivilzb1985| | 2014-7-14 15:07 | 只看该作者
这个实时的用示波器的看下的

使用特权

评论回复
板凳
myselfzhangji|  楼主 | 2014-7-14 19:56 | 只看该作者
vivilzb1985 发表于 2014-7-14 15:07
这个实时的用示波器的看下的

您的意思是可能仿真时可能无法得到正确结果?
我实际通过示波器测试了一下,测试结果和我的仿真结果一样;但是如果我把我上面程序时钟初始化函数给屏蔽之后,即时钟信号采用默认的方式,SMCLK可以测量到输出,且输出正确,但是ACLK输出仍然为低电平。
所以我现在的问题是不是我的时钟初始化函数部分不正确,但是按照msp430x2xx的user guide没有发现我程序的错误在哪里。还请您帮我看一下,这个问题困扰好久了,搞的我一直没有信心学习430其他的内容

使用特权

评论回复
地板
dirtwillfly| | 2014-7-14 19:57 | 只看该作者
没仿真过,不清楚。你用实物试试

使用特权

评论回复
5
myselfzhangji|  楼主 | 2014-7-14 20:01 | 只看该作者
dirtwillfly 发表于 2014-7-14 19:57
没仿真过,不清楚。你用实物试试

您好!
实物用的是msp430g2553,程序部分相应的需要修改一下,但是用示波器测试时仍是一样的结果,SMCLK、ACLK输出仍然是低电平(2553的好像没有MCLK输出)。
但是我如果把我程序部分的时钟初始化部分给屏蔽后,发现可以测量到SMCLK的输出,ACLK的输出仍然测试不到。
求大神帮忙指导一下,小弟刚刚开始学习430单片机

使用特权

评论回复
6
dirtwillfly| | 2014-7-14 20:14 | 只看该作者
ACLK也可以输出的。
我这会没在自己的电脑前,没有资料。我在网上找了个例子,你参考下。
http://blog.sina.com.cn/s/blog_6cd2030b01017x71.html

使用特权

评论回复
7
myselfzhangji|  楼主 | 2014-7-14 20:17 | 只看该作者
dirtwillfly 发表于 2014-7-14 20:14
ACLK也可以输出的。
我这会没在自己的电脑前,没有资料。我在网上找了个例子,你参考下。
http://blog.sina ...

嗯,好的,谢谢!
大神,可不可以加你好友,以后小弟有什么不会的可以向你请教,还望您可以不吝赐教!

使用特权

评论回复
8
dirtwillfly| | 2014-7-14 20:39 | 只看该作者
myselfzhangji 发表于 2014-7-14 20:17
嗯,好的,谢谢!
大神,可不可以加你好友,以后小弟有什么不会的可以向你请教,还望您可以不吝赐教! ...

我不是大神。有问题你来论坛发帖就行,我每天都上论坛的。
发了贴可以 @dirtwillfly 这样联系我。

使用特权

评论回复
9
myselfzhangji|  楼主 | 2014-7-14 20:48 | 只看该作者
dirtwillfly 发表于 2014-7-14 20:39
我不是大神。有问题你来论坛发帖就行,我每天都上论坛的。
发了贴可以 @dirtwillfly 这样联系我。  ...

既然可以回答430的相关问题的,在我面前就是大神了,或者至少是前辈了,哈哈!
我现在仔细看了一下user guide,怀疑我的问题出在这里:因为430单片机的I/O口是复用的,有的时候是好几个功能复用一个I/O口,当我设置I/O口为外围模块时,怎么确定设置具体输出的外围模块,你如430g2553的P1.1口,可以作为P1.1/TA0.0/UCA0RXD/UCA0SOMI/A1/CA1,当我设置改口为外围模块时,怎么确定我的外围模块输出是TA0.0,而不是UCA0RXD/UCA0SOMI/A1/CA1,这里一直没有明白,请指教!
谢谢了!

使用特权

评论回复
10
myselfzhangji|  楼主 | 2014-7-14 21:06 | 只看该作者
myselfzhangji 发表于 2014-7-14 20:48
既然可以回答430的相关问题的,在我面前就是大神了,或者至少是前辈了,哈哈!。
我现在仔细看了 ...

#include  <msp430g2553.h>

void main(void)
{
  WDTCTL = WDTPW +WDTHOLD;                  // Stop Watchdog Timer
  if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)                                    
  {  
    while(1);                               // If calibration constants erased
                                            // do not load, trap CPU!!
  }
//1Mhz
  BCSCTL1 = CALBC1_1MHZ;                    // Set range
  DCOCTL = CALDCO_1MHZ;                     // Set DCO step + modulation */

/* //8Mhz
  BCSCTL1 = CALBC1_8MHZ;                    // Set range
  DCOCTL = CALDCO_8MHZ;                     // Set DCO step + modulation */

/* //12Mhz
  BCSCTL1 = CALBC1_12MHZ;                   // Set range
  DCOCTL = CALDCO_12MHZ;                    // Set DCO step + modulation*/

/* //16Mhz
  BCSCTL1 = CALBC1_16MHZ;                   // Set range
  DCOCTL = CALDCO_16MHZ;                    // Set DCO step + modulation*/

  P1DIR |= 0x13;                            // P1.0,1 and P1.4 outputs
  P1SEL |= 0x11;                            // P1.0,4 ACLK, SMCLK output

  while(1)
  {
    P1OUT |= 0x02;                                // P1.1 = 1
    P1OUT &= ~0x02;                         // P1.1 = 0
  }
}

你好,我看了一下TI官网的程序,对比一下我的程序,我发现应该就是最后的while(1)循环不一样,请问这个while(1)循环里是什么意思,不明白,请指教!

使用特权

评论回复
11
dirtwillfly| | 2014-7-14 21:14 | 只看该作者
myselfzhangji 发表于 2014-7-14 20:48
既然可以回答430的相关问题的,在我面前就是大神了,或者至少是前辈了,哈哈!。
我现在仔细看了 ...

手册上有介绍啊。对一些寄存器进行配置就可以。
http://wenku.baidu.com/link?url=fwnFf7rVeWqng57_aEiWiiIfMUM1R7d1ufs15wSd_q_g_TLlXDcqA4BYUo8WV9vI9U04eim9Q6moMW-Z0hsNpUvxDOtZ_73LzX1oxFme1O7
第44页

使用特权

评论回复
12
myselfzhangji|  楼主 | 2014-7-14 21:14 | 只看该作者
dirtwillfly 发表于 2014-7-14 20:39
我不是大神。有问题你来论坛发帖就行,我每天都上论坛的。
发了贴可以 @dirtwillfly 这样联系我。  ...

#include  <msp430g2553.h>

void main(void)
{
  WDTCTL = WDTPW +WDTHOLD;                  // Stop Watchdog Timer
  if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)                                    
  {  
    while(1);                               // If calibration constants erased
                                            // do not load, trap CPU!!
  }
//1Mhz
  BCSCTL1 = CALBC1_1MHZ;                    // Set range
  DCOCTL = CALDCO_1MHZ;                     // Set DCO step + modulation */

/* //8Mhz
  BCSCTL1 = CALBC1_8MHZ;                    // Set range
  DCOCTL = CALDCO_8MHZ;                     // Set DCO step + modulation */

/* //12Mhz
  BCSCTL1 = CALBC1_12MHZ;                   // Set range
  DCOCTL = CALDCO_12MHZ;                    // Set DCO step + modulation*/

/* //16Mhz
  BCSCTL1 = CALBC1_16MHZ;                   // Set range
  DCOCTL = CALDCO_16MHZ;                    // Set DCO step + modulation*/

  P1DIR |= 0x13;                            // P1.0,1 and P1.4 outputs
  P1SEL |= 0x11;                            // P1.0,4 ACLK, SMCLK output

  while(1)
  {
    P1OUT |= 0x02;                                // P1.1 = 1
    P1OUT &= ~0x02;                         // P1.1 = 0
  }
}

你好,我看了一下TI官网的程序,对比一下我的程序,我发现应该就是最后的while(1)循环不一样,请问这个while(1)循环里是什么意思,不明白,请指教!

使用特权

评论回复
13
dirtwillfly| | 2014-7-14 21:16 | 只看该作者
myselfzhangji 发表于 2014-7-14 21:06
#include  

void main(void)

红色部分,是对P1.1赋值,每个循环改变两次电平,先变高又变低

使用特权

评论回复
14
myselfzhangji|  楼主 | 2014-7-14 21:20 | 只看该作者
dirtwillfly 发表于 2014-7-14 21:16
红色部分,是对P1.1赋值,每个循环改变两次电平,先变高又变低

您说的这个我懂,我的意思是这个对我的MCLK、SMCLK、ACLK的测量有影响吗?

使用特权

评论回复
15
dirtwillfly| | 2014-7-14 22:27 | 只看该作者
myselfzhangji 发表于 2014-7-14 21:20
您说的这个我懂,我的意思是这个对我的MCLK、SMCLK、ACLK的测量有影响吗?

没有影响

使用特权

评论回复
16
朝阳之光| | 2014-7-14 23:32 | 只看该作者
dirtwillfly 发表于 2014-7-14 20:39
我不是大神。有问题你来论坛发帖就行,我每天都上论坛的。
发了贴可以 @dirtwillfly 这样联系我。  ...

版主,这下你跑不了了,^o^

使用特权

评论回复
17
dirtwillfly| | 2014-7-15 08:15 | 只看该作者
朝阳之光 发表于 2014-7-14 23:32
版主,这下你跑不了了,^o^

:lol怎么啦?我没跑啊

使用特权

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

本版积分规则

9

主题

47

帖子

0

粉丝