新闻中心

EEPW首页>嵌入式系统>设计应用> MSP430(F5529)学习笔记——UCS配置详解

MSP430(F5529)学习笔记——UCS配置详解

作者: 时间:2016-11-28 来源:网络 收藏

理解了上面这些,可以理解TI官方例子中的代码了,官方代码中的相关部分如下:
[cpp]view plaincopy
  1. if(fsystem<=630)//fsystem<0.63MHz
  2. UCSCTL1=DCORSEL_0;
  3. elseif(fsystem<1250)//0.63MHz
  4. UCSCTL1=DCORSEL_1;
  5. elseif(fsystem<2500)//1.25MHz
  6. UCSCTL1=DCORSEL_2;
  7. elseif(fsystem<5000)//2.5MHz
  8. UCSCTL1=DCORSEL_3;
  9. elseif(fsystem<10000)//5MHz
  10. UCSCTL1=DCORSEL_4;
  11. elseif(fsystem<20000)//10MHz
  12. UCSCTL1=DCORSEL_5;
  13. elseif(fsystem<40000)//20MHz
  14. UCSCTL1=DCORSEL_6;
  15. else
  16. UCSCTL1=DCORSEL_7;

都在前面讲到的范围内,由于前面的范围有重叠部分,例子代码中的值是TI的工程师根据上面这些参数选取的比较合理的值。
到这里,我相信大家配合芯片手册和本文,都能明白DCO配置相关部分的原理了,下面是将DCO参考时钟选为XT1,并将DCOCLK倍频到25M的详细代码:
[cpp]view plaincopy
  1. #include
  2. voiddelay(){
  3. volatileunsignedinti;
  4. for(i=0;i!=5000;++i){
  5. _NOP();
  6. }
  7. }
  8. voidSetVcoreUp(unsignedintlevel)
  9. {
  10. //OpenPMMregistersforwrite
  11. PMMCTL0_H=PMMPW_H;
  12. //SetSVS/SVMhighsidenewlevel
  13. SVSMHCTL=SVSHE+SVSHRVL0*level+SVMHE+SVSMHRRL0*level;
  14. //SetSVMlowsidetonewlevel
  15. SVSMLCTL=SVSLE+SVMLE+SVSMLRRL0*level;
  16. //WaittillSVMissettled
  17. while((PMMIFG&SVSMLDLYIFG)==0);
  18. //Clearalreadysetflags
  19. PMMIFG&=~(SVMLVLRIFG+SVMLIFG);
  20. //SetVCoretonewlevel
  21. PMMCTL0_L=PMMCOREV0*level;
  22. //Waittillnewlevelreached
  23. if((PMMIFG&SVMLIFG))
  24. while((PMMIFG&SVMLVLRIFG)==0);
  25. //SetSVS/SVMlowsidetonewlevel
  26. SVSMLCTL=SVSLE+SVSLRVL0*level+SVMLE+SVSMLRRL0*level;
  27. //LockPMMregistersforwriteaccess
  28. PMMCTL0_H=0x00;
  29. }
  30. voidmain(void){
  31. WDTCTL=WDTPW+WDTHOLD;
  32. P1SEL&=~BIT1;
  33. P1DIR|=BIT1;
  34. P1SEL|=BIT0;//ACLK
  35. P1DIR|=BIT0;
  36. P2SEL|=BIT2;//SMCLK
  37. P2DIR|=BIT2;
  38. P7SEL|=BIT7;//MCLK
  39. P7DIR|=BIT7;
  40. P5SEL|=BIT4|BIT5;
  41. UCSCTL6|=XCAP_3;
  42. UCSCTL6&=~XT1OFF;
  43. SetVcoreUp(1);//一次提高Vcore电压等级,具体请参考手册
  44. SetVcoreUp(2);
  45. SetVcoreUp(3);
  46. __bis_SR_register(SCG0);
  47. UCSCTL0=0;
  48. UCSCTL1=DCORSEL_6;
  49. UCSCTL2=FLLD_1|380;
  50. __bic_SR_register(SCG0);
  51. __delay_cycles(782000);
  52. /*
  53. *默认状态下:ACLK=FLLREFCLK=XT1SMCLK=MCLK=DCOCLKDIVXT2关闭
  54. *为了不产生XT1LFOFFG,将ACLK和FLLREFCLK设置为REFOCLK
  55. *并打开XT2OFF,否则XT2将处于无法使用状态
  56. **/
  57. //UCSCTL6&=~(XT2DRIVE0|XT2DRIVE1|XT2OFF);
  58. while(SFRIFG1&OFIFG){//CheckOFIFGfaultflag
  59. UCSCTL7&=~(XT2OFFG+XT1LFOFFG+DCOFFG);//ClearOSCflautFlags
  60. SFRIFG1&=~OFIFG;//ClearOFIFGfaultflag
  61. }
  62. UCSCTL4=UCSCTL4&(~(SELS_7|SELM_7))|SELS_3|SELM_3;
  63. while(1){
  64. P1OUT^=BIT1;
  65. delay();
  66. }
  67. }

好了,经过上面的四个实验,我们都能正确使用MSP430F5XX的UCS了,如果有什么疑问,欢迎留言讨论。

上一页 1 2 3 下一页

评论


技术专区

关闭