MSP430(F5529)学习笔记——UCS配置详解
理解了上面这些,可以理解TI官方例子中的代码了,官方代码中的相关部分如下:
[cpp]view plaincopy


- if(fsystem<=630)//fsystem<0.63MHz
- UCSCTL1=DCORSEL_0;
- elseif(fsystem<1250)//0.63MHz
- UCSCTL1=DCORSEL_1;
- elseif(fsystem<2500)//1.25MHz
- UCSCTL1=DCORSEL_2;
- elseif(fsystem<5000)//2.5MHz
- UCSCTL1=DCORSEL_3;
- elseif(fsystem<10000)//5MHz
- UCSCTL1=DCORSEL_4;
- elseif(fsystem<20000)//10MHz
- UCSCTL1=DCORSEL_5;
- elseif(fsystem<40000)//20MHz
- UCSCTL1=DCORSEL_6;
- else
- UCSCTL1=DCORSEL_7;
都在前面讲到的范围内,由于前面的范围有重叠部分,例子代码中的值是TI的工程师根据上面这些参数选取的比较合理的值。
到这里,我相信大家配合芯片手册和本文,都能明白DCO配置相关部分的原理了,下面是将DCO参考时钟选为XT1,并将DCOCLK倍频到25M的详细代码:
[cpp]view plaincopy


- #include
- voiddelay(){
- volatileunsignedinti;
- for(i=0;i!=5000;++i){
- _NOP();
- }
- }
- voidSetVcoreUp(unsignedintlevel)
- {
- //OpenPMMregistersforwrite
- PMMCTL0_H=PMMPW_H;
- //SetSVS/SVMhighsidenewlevel
- SVSMHCTL=SVSHE+SVSHRVL0*level+SVMHE+SVSMHRRL0*level;
- //SetSVMlowsidetonewlevel
- SVSMLCTL=SVSLE+SVMLE+SVSMLRRL0*level;
- //WaittillSVMissettled
- while((PMMIFG&SVSMLDLYIFG)==0);
- //Clearalreadysetflags
- PMMIFG&=~(SVMLVLRIFG+SVMLIFG);
- //SetVCoretonewlevel
- PMMCTL0_L=PMMCOREV0*level;
- //Waittillnewlevelreached
- if((PMMIFG&SVMLIFG))
- while((PMMIFG&SVMLVLRIFG)==0);
- //SetSVS/SVMlowsidetonewlevel
- SVSMLCTL=SVSLE+SVSLRVL0*level+SVMLE+SVSMLRRL0*level;
- //LockPMMregistersforwriteaccess
- PMMCTL0_H=0x00;
- }
- voidmain(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;
- SetVcoreUp(1);//一次提高Vcore电压等级,具体请参考手册
- SetVcoreUp(2);
- SetVcoreUp(3);
- __bis_SR_register(SCG0);
- UCSCTL0=0;
- UCSCTL1=DCORSEL_6;
- UCSCTL2=FLLD_1|380;
- __bic_SR_register(SCG0);
- __delay_cycles(782000);
- /*
- *默认状态下:ACLK=FLLREFCLK=XT1SMCLK=MCLK=DCOCLKDIVXT2关闭
- *为了不产生XT1LFOFFG,将ACLK和FLLREFCLK设置为REFOCLK
- *并打开XT2OFF,否则XT2将处于无法使用状态
- **/
- //UCSCTL6&=~(XT2DRIVE0|XT2DRIVE1|XT2OFF);
- while(SFRIFG1&OFIFG){//CheckOFIFGfaultflag
- UCSCTL7&=~(XT2OFFG+XT1LFOFFG+DCOFFG);//ClearOSCflautFlags
- SFRIFG1&=~OFIFG;//ClearOFIFGfaultflag
- }
- UCSCTL4=UCSCTL4&(~(SELS_7|SELM_7))|SELS_3|SELM_3;
- while(1){
- P1OUT^=BIT1;
- delay();
- }
- }
好了,经过上面的四个实验,我们都能正确使用MSP430F5XX的UCS了,如果有什么疑问,欢迎留言讨论。
评论