[资料分享] MSP430(F5529有关UCS配置解释

fish001   2018-11-4 23:26 楼主
MSP430F5XX/MSP430F6XX系列器件的UCS包含有五种时钟源,依次是:XT1CLK、VLOCLK、REFOCLK、DCOCLK和XT2CLK。这五种时钟的详细介绍请参考该系列芯片的指导手册,其中XT1CLK、VLOCLK、REFOCLK和XT2CLK跟MSP430F1XX系列没有太大区别,学习配置起来也比较简单。

UCS上电默认状态

PUC后,UCS模块的默认状态如下:




(1)XT1处于LF模式作为XT1CLK时钟源。ACLK选通为XT1CLK。  
(2)MCLK选通为DCOCLKDIV  
(3)SMCLK选通为DCOCLKDIV  
(4)FLL使能,且将XT1CLK作为FLL参考时钟。  
(5)XIN和XOUT脚设置为通用IO,XIN和XOUT配置为XT1功能前,XT1保持禁用。  
(6)如果可用的话,XT2IN和XT2OUT被设置为通用IO且保持禁止状态。  


清楚UCS上电默认状态是非常重要的,这对于理解后面的配置逻辑来说非常重要。

UCS时钟源切换

由于REFOCLK、VLOCLK、DCOCLK(这里暂时这么认为)默认状态下是可用的,所以,切换的时候只需要通过UCSCTL4来配置ACLK、SMCLK和MCLK的时钟源即可,而XT1CLK和XT2CLK需要根据硬件的具体配置情况确定,所以,这两者的配置比起前三者来讲,就有些不同了。下面,我们做三个实验:

(1)将MCLK和SMCLK配置REFOCLK、VLOCLK
REFOCLK和VLOCLK是芯片默认提供的,只要芯片正常工作,这两个时钟就会正常工作,因此,该时钟配置非常简单,只需要修改UCSCTL4,将SELS和SELM配置为对应的选项VLOCLK或者REFOCLK即可,具体代码如下:[cpp] view plain copy


#include   


void main(void) {  
  WDTCTL = WDTPW+WDTHOLD;  

  P1SEL |= BIT0;  
  P1DIR |= BIT0;//测量ACLK用  
  P2SEL |= BIT2;  
  P2DIR |= BIT2;//测量SMCLK用  
  P7SEL |= BIT7;  
  P7DIR |= BIT7;//测量MCLK用  


  //UCSCTL4 = UCSCTL4&(~(SELS_7|SELM_7))|SELS_1|SELM_1; //将SMCLK和MCLK配置为VLOCLK  
  UCSCTL4 = UCSCTL4&(~(SELS_7|SELM_7))|SELS_2|SELM_2; //将SMCLK和MCLK配置为REFOCLK  


  while(1);  
}  


上面的代码就实现了将SMCLK和MCLK切换为VLOCLK和REFOCLK,ACLK的操作也是同样的,不作过多解释。
(2)将MCLK和SMCLK配置XT1CLK
我手头上的开发板XT1外接的是32.768K的手表时钟晶振,XT1CLK的配置要分为以下几步:



1.配置IO口5.4和5.5为XT1功能。  
2.配置XCAP为XCAP_3,即12PF的电容。  
3.清除XT1OFF标志位。  
4.等待XT1起振。  


具体的代码如下:


#include   

void main(void) {  
  WDTCTL = WDTPW+WDTHOLD;  

  P1SEL |= BIT0;  
  P1DIR |= BIT0;//测量ACLK用  
  P2SEL |= BIT2;  
  P2DIR |= BIT2;//测量SMCLK用  
  P7SEL |= BIT7;  
  P7DIR |= BIT7;//测量MCLK用  

  P5SEL |= BIT4|BIT5; //将IO配置为XT1功能  
  UCSCTL6 |= XCAP_3;  //配置电容为12pF  
  UCSCTL6 &= ~XT1OFF; //使能XT1  

  while (SFRIFG1 & OFIFG){  
    UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);         // 清除三类时钟标志位  
                              // 这里需要清除三种标志位,因为任何一种  
                              // 标志位都会将OFIFG置位  
    SFRIFG1 &= ~OFIFG;                                  // 清除时钟错误标志位  
  }  
  UCSCTL4 = UCSCTL4&(~(SELS_7|SELM_7))|SELS_0|SELM_0;     //将SMCLK和MCLK时钟源配置为XT1  
  while(1);  
}  


(3)将SMCLK和MCLK配置XT2
将SMCLK和MCLK配置为XT2跟配置为XT1的过程基本相同,唯一不同的是,在配置SMCLK和MCLK为XT2之前,需要将ACLK和REFCLK的时钟源,因为ACLK和REFCLK的默认时钟源是XT1,而我们这里并没有配置启动XT1CLK,所以会产生XT1时钟错误,即XT1LFFG,因此,我们先将ACLK和REFCLK配置为芯片自带的时钟(REFOCLK或VLOCLK)或者即将启动的时钟(XT2),此外,XT2配置时不需要配置电容,故将SMCLK和MCLK配置为XT2的代码如下:[cpp] view plain copy


#include   

void main(void) {  
  WDTCTL = WDTPW+WDTHOLD;  

  P1SEL |= BIT0;  
  P1DIR |= BIT0;//测量ACLK用  
  P2SEL |= BIT2;  
  P2DIR |= BIT2;//测量SMCLK用  
  P7SEL |= BIT7;  
  P7DIR |= BIT7;//测量MCLK用  

  P5SEL |= BIT2|BIT3; //将IO配置为XT2功能  
  UCSCTL6 &= ~XT2OFF; //使能XT2  

  UCSCTL4 = UCSCTL4&(~(SELA_7))|SELA_1; //先将ACLK配置为VLOCLK  
  UCSCTL3 |= SELREF_2;                  //将REFCLK配置为REFCLK  

  while (SFRIFG1 & OFIFG){  
    UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);         // 清除三类时钟标志位  
                              // 这里需要清除三种标志位,因为任何一种  
                              // 标志位都会将OFIFG置位  
    SFRIFG1 &= ~OFIFG;                                  // 清除时钟错误标志位  
  }  
  UCSCTL4 = UCSCTL4&(~(SELS_7|SELM_7))|SELS_5|SELM_5;     //将SMCLK和MCLK时钟源配置为XT2  
  while(1);  
}  

做完前面三个实验,我们就能掌握MSP430F5XX系列时钟切换的基本操作了

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复