[资料分享] MSP430F5529 统一时钟系统UCS

fish001   2017-9-17 21:56 楼主
实验二:将MCLKSMCLK配置为XT1F5529XT132.768KHZ
/*1.配置IO口5.4和5.5为XT1功能。*/
/*2.配置XCAP为XCAP_3,即12PF的电容。*/
/*3.清除XT1OFF标志位。*/
/*4.等待XT1起振。*/
#include
void main(void){
     P1SEL |= BIT0;P1DIR |= BIT0;//测量ACLK用
     P2SEL |= BIT2;P2DIR |= BIT2;//测量SMCLK用
     P7SEL |= BIT7;P7DIR |= BIT7;//测量MCLK用
     P5SEL |= BIT4|BIT5;      //配置为XT1功能,电路板上晶振接于这两脚
     UCSCTL6 |= XCAP_3;        //配置电容为12pF
     UCSCTL6 &= ~XT1OFF;     //使能XT1
/*下面是很重要的一步:*/
/* XT1刚刚起振的时候可能有错误,导致时钟错误标志位置位,必须先清零*/
/*OFIFG即Osc Fault Flag,位于SFRIFG1中*/
while(SFRIFG1 & OFIFG)   {                     //如果有时钟错误
   UCSCTL7 &=~(XT2OFFG+DCOFFG+XT1LFOFFG);          //清除3种时钟错误标志
   SFRIFG1&=~(OFIFG);}                      //清除时钟错误标志位
UCSCTL4&=(UCSCTL4&(~(SELS_7|SELM_7)))|SELS_0|SELM_0;   //将SMCLK和MCLK时钟源配置为XT1
}
实验三:DCO-FLL数控振荡器结合锁相环
  DCO模块在MSP430F5529系列芯片中非常重要,因为从MSP430F4XX开始,MSP430引用了FLL模块,FLL即锁相环,可以通过倍频的方式提高系统时钟频率,进而提高系统的运行速度。
  DCO模块运行需要参考时钟REFCLK,REFCLK可以来自REFOCLK、XT1CLK和XT2CLK,通过UCSCTL3的SELREF选择,默认使用的XT1CLK,但如果XT1CLK不可用则使用REFOCLK。
  DCO模块有两个输出时钟信号,即DCOCLK和DCOCLKDIV,其中,倍频计算公式如下:
  DCOCLK = D*(N+1)*(REFCLK/n)
  DCOCLKDIV = (N+1)*(REFCLK/n)
  其中:n即REFCLK输入时钟分频,可以通过UCSCTL3中的FLLCLKDIV设定,默认为1,也就是不分频
  D可以通过UCSCTL2中的FLLD来设定,默认为1,也就是2分频;
  N可以通过UCSCTL2中的FLLN来设定,默认值为32
  所以,系统上电后如果不做任何设置,DCOCLK的实际值为2097152,DCOCLKDIV的实际值为1048576。
  另外,配置芯片工作频率还需要配置DCORSEL和DCOx,DCORSEL和DCOx的具体作用如下:
  DCORSEL位于UCSCTL1,共3位,将DCO分为8个频率段。
  DCOx位于UCSCTL0共5位,将DCORSEL选择的频率段分为32个频率阶,每阶比前一阶高出约8%,该寄存器系统可以自动调整,通常配置为0。
下表给出了相应设置情况下的频率调节范围:
/*通过DCO-FLL将32.768KHZ倍频到25MHZ*/
#include
#include “HAL_PMM.h”
void delay()
{
volatile unsigned int I;
for(I = 0; I != 5000; ++i){_NOP(); }}//延时函数
void main(void) {
WDTCTL = WDTPW+WDTHOLD;
P1SEL &= ~BIT1;
P1DIR |= BIT1;
P1SEL |= BIT0; //ACLK
P1DIR |= BIT0;
P2SEL |= BIT2; //SMCLK
P2DIR |= BIT2;
P7SEL |= BIT7; //MCLK
P7DIR |= BIT7;
P5SEL |= BIT4|BIT5;
UCSCTL6 |= XCAP_3;
UCSCTL6 &= ~XT1OFF;//打开XT1,否则XT1LFOFFG可能报错
SetVCore(3); //提高Vcore电压到最高级,以满足倍频需求该函数位于HAL_PMM.H中
__bis_SR_register(SCG0);//该语法为固定格式,意为将括号内的变量置位,SCG0与系统工作模式有关,此时MCLK暂停工作
UCSCTL0 = 0;   //先清零,FLL运行时,该寄存器系统会自动配置,不用管
UCSCTL1 = DCORSEL_6;
UCSCTL2 = FLLD_1 | 380;//FLLD=1,FLLN=380,则频率为
2*(380+1)*32.768=24.969MHZ
__bic_SR_register(SCG0);
__delay_cycles(782000);//系统自带的精确延时,单位us
while (SFRIFG1 & OFIFG) {                           
        UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);      
        SFRIFG1 &= ~OFIFG;                                 
}
UCSCTL4 = UCSCTL4&(~(SELS_7|SELM_7))|SELS_3|SELM_3;
//选择DCO作为时钟源
while(1){
        P1OUT ^= BIT1;
        delay();
}
}

回复评论

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