MSP430(F5529)相比MSP430(F149)来讲,功能更加强大。

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

UCS上电默认状态

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

[html] view plaincopy
  1. (1)XT1处于LF模式作为XT1CLK时钟源。ACLK选通为XT1CLK。
  2. (2)MCLK选通为DCOCLKDIV
  3. (3)SMCLK选通为DCOCLKDIV
  4. (4)FLL使能,且将XT1CLK作为FLL参考时钟。
  5. (5)XIN和XOUT脚设置为通用IO,XIN和XOUT配置为XT1功能前,XT1保持禁用。
  6. (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 plaincopy
  1. #include <msp430f5529.h>
  2. void main(void) {
  3. WDTCTL = WDTPW+WDTHOLD;
  4. P1SEL |= BIT0;
  5. P1DIR |= BIT0;//测量ACLK用
  6. P2SEL |= BIT2;
  7. P2DIR |= BIT2;//测量SMCLK用
  8. P7SEL |= BIT7;
  9. P7DIR |= BIT7;//测量MCLK用
  10. //UCSCTL4 = UCSCTL4&(~(SELS_7|SELM_7))|SELS_1|SELM_1; //将SMCLK和MCLK配置为VLOCLK
  11. UCSCTL4 = UCSCTL4&(~(SELS_7|SELM_7))|SELS_2|SELM_2; //将SMCLK和MCLK配置为REFOCLK
  12. while(1);
  13. }

上面的代码就实现了将SMCLK和MCLK切换为VLOCLK和REFOCLK,ACLK的操作也是同样的,不作过多解释。
(2)将MCLK和SMCLK配置XT1CLK

我手头上的开发板XT1外接的是32.768K的手表时钟晶振,XT1CLK的配置要分为以下几步:

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

具体的代码如下:

[cpp] view plaincopy
  1. #include <msp430f5529.h>
  2. void main(void) {
  3. WDTCTL = WDTPW+WDTHOLD;
  4. P1SEL |= BIT0;
  5. P1DIR |= BIT0;//测量ACLK用
  6. P2SEL |= BIT2;
  7. P2DIR |= BIT2;//测量SMCLK用
  8. P7SEL |= BIT7;
  9. P7DIR |= BIT7;//测量MCLK用
  10. P5SEL |= BIT4|BIT5; //将IO配置为XT1功能
  11. UCSCTL6 |= XCAP_3;  //配置电容为12pF
  12. UCSCTL6 &= ~XT1OFF; //使能XT1
  13. while (SFRIFG1 & OFIFG){
  14. UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);         // 清除三类时钟标志位
  15. // 这里需要清除三种标志位,因为任何一种
  16. // 标志位都会将OFIFG置位
  17. SFRIFG1 &= ~OFIFG;                                  // 清除时钟错误标志位
  18. }
  19. UCSCTL4 = UCSCTL4&(~(SELS_7|SELM_7))|SELS_0|SELM_0;     //将SMCLK和MCLK时钟源配置为XT1
  20. while(1);
  21. }

(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 plaincopy
  1. #include <msp430f5529.h>
  2. void main(void) {
  3. WDTCTL = WDTPW+WDTHOLD;
  4. P1SEL |= BIT0;
  5. P1DIR |= BIT0;//测量ACLK用
  6. P2SEL |= BIT2;
  7. P2DIR |= BIT2;//测量SMCLK用
  8. P7SEL |= BIT7;
  9. P7DIR |= BIT7;//测量MCLK用
  10. P5SEL |= BIT2|BIT3; //将IO配置为XT2功能
  11. UCSCTL6 &= ~XT2OFF; //使能XT2
  12. UCSCTL4 = UCSCTL4&(~(SELA_7))|SELA_1; //先将ACLK配置为VLOCLK
  13. UCSCTL3 |= SELREF_2;                  //将REFCLK配置为REFCLK
  14. while (SFRIFG1 & OFIFG){
  15. UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);         // 清除三类时钟标志位
  16. // 这里需要清除三种标志位,因为任何一种
  17. // 标志位都会将OFIFG置位
  18. SFRIFG1 &= ~OFIFG;                                  // 清除时钟错误标志位
  19. }
  20. UCSCTL4 = UCSCTL4&(~(SELS_7|SELM_7))|SELS_5|SELM_5;     //将SMCLK和MCLK时钟源配置为XT2
  21. while(1);
  22. }

做完前面三个实验,我们就能掌握MSP430F5XX系列时钟切换的基本操作了,讲的并不详细,有其他疑问请仔细阅读芯片手册或者留言讨论。

DCO模块详解
DCO模块在MSP430F5XX系列芯片中非常重要,因为从MSP430F4XX开始,MSP430引用了FLL模块,FLL即锁相环,可以通过倍频的方式提高系统时钟频率,进而提高系统的运行速度。
DCO模块运行需要参考时钟REFCLK,REFCLK可以来自REFOCLK、XT1CLK和XT2CLK,通过UCSCTL3的SELREF选择,默认使用的XT1CLK,但如果XT1CLK不可用则使用REFOCLK。
DCO模块有两个输出时钟信号,级DCOCLK和DCOCLKDIV,其中,倍频计算公式如下:

[cpp] view plaincopy
  1. DCOCLK = D*(N+1)*(REFCLK/n)
  2. DCOCLKDIV = (N+1)*(REFCLK/n)

其中:
n即REFCLK输入时钟分频,可以通过UCSCTL3中的FLLCLKDIV设定,默认为0,也就是不分频;
D可以通过UCSCTL2中的FLLD来设定,默认为1,也就是2分频;
N可以通过UCSCTL2中的FLLN来设定,默认值为32。
所以,系统上电后如果不做任何设置,DCOCLK的实际值为2097152,DCOCLKDIV的实际值为1048576。
另外,配置芯片工作频率还需要配置DCORSEL和DCOx,DCORSEL和DCOx的具体作用如下:
DCORSEL位于UCSCTL1控制寄存器中的4到6位,共3位,将DCO分为8个频率段。
DCOx位于UCSCTL0中的8到12位,共5位,将DCORSEL选择的频率段分为32个频率阶,每阶比前一阶高出约8%,该寄存器系统可以自动调整,通常配置为0。
DCORSEL和DCOx值的具体作用可以参考MSP430F5529的数据手册,阅读该手册相关部分可以找到如下表格:

可以见,DCORESL的频率调节范围大致如下:

[cpp] view plaincopy
  1. DCORSEL = 0的调节范围约为0.20~0.70MHZ;
  2. DCORSEL= 1的调节范围约为0.36~1.47MHZ;
  3. DCORSEL = 2的调节范围约为0.75~3.17MHZ;
  4. DCORSEL = 3的调节范围约为1.51~6.07MHZ;
  5. DCORSEL = 4的调节范围约为3.2~12.3MHZ;
  6. DCORSEL = 5的调节范围约为6.0~23.7MHZ;
  7. DCORSEL = 6的调节范围约为10.7~39.7MHZ;
  8. DCORSEL = 7的调节范围约为19.6~60MHZ。

理解了上面这些,可以理解TI官方例子中的代码了,官方代码中的相关部分如下:

[cpp] view plaincopy
  1. if (fsystem <= 630)            //           fsystem < 0.63MHz
  2. UCSCTL1 = DCORSEL_0;
  3. else if (fsystem <  1250)      // 0.63MHz < fsystem < 1.25MHz
  4. UCSCTL1 = DCORSEL_1;
  5. else if (fsystem <  2500)      // 1.25MHz < fsystem <  2.5MHz
  6. UCSCTL1 = DCORSEL_2;
  7. else if (fsystem <  5000)      // 2.5MHz  < fsystem <    5MHz
  8. UCSCTL1 = DCORSEL_3;
  9. else if (fsystem <  10000)     // 5MHz    < fsystem <   10MHz
  10. UCSCTL1 = DCORSEL_4;
  11. else if (fsystem <  20000)     // 10MHz   < fsystem <   20MHz
  12. UCSCTL1 = DCORSEL_5;
  13. else if (fsystem <  40000)     // 20MHz   < fsystem <   40MHz
  14. UCSCTL1 = DCORSEL_6;
  15. else
  16. UCSCTL1 = DCORSEL_7;

都在前面讲到的范围内,由于前面的范围有重叠部分,例子代码中的值是TI的工程师根据上面这些参数选取的比较合理的值。
到这里,我相信大家配合芯片手册和本文,都能明白DCO配置相关部分的原理了,下面是将DCO参考时钟选为XT1,并将DCOCLK倍频到25M的详细代码:

[cpp] view plaincopy
  1. #include <msp430f5529.h>
  2. void delay(){
  3. volatile unsigned int i;
  4. for(i = 0; i != 5000; ++i){
  5. _NOP();
  6. }
  7. }
  8. void SetVcoreUp (unsigned int level)
  9. {
  10. // Open PMM registers for write
  11. PMMCTL0_H = PMMPW_H;
  12. // Set SVS/SVM high side new level
  13. SVSMHCTL = SVSHE + SVSHRVL0 * level + SVMHE + SVSMHRRL0 * level;
  14. // Set SVM low side to new level
  15. SVSMLCTL = SVSLE + SVMLE + SVSMLRRL0 * level;
  16. // Wait till SVM is settled
  17. while ((PMMIFG & SVSMLDLYIFG) == 0);
  18. // Clear already set flags
  19. PMMIFG &= ~(SVMLVLRIFG + SVMLIFG);
  20. // Set VCore to new level
  21. PMMCTL0_L = PMMCOREV0 * level;
  22. // Wait till new level reached
  23. if ((PMMIFG & SVMLIFG))
  24. while ((PMMIFG & SVMLVLRIFG) == 0);
  25. // Set SVS/SVM low side to new level
  26. SVSMLCTL = SVSLE + SVSLRVL0 * level + SVMLE + SVSMLRRL0 * level;
  27. // Lock PMM registers for write access
  28. PMMCTL0_H = 0x00;
  29. }
  30. void main(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=XT1 SMCLK=MCLK=DCOCLKDIV XT2关闭
  54. * 为了不产生XT1LFOFFG,将ACLK和FLLREFCLK设置为REFOCLK
  55. * 并打开XT2OFF,否则XT2将处于无法使用状态
  56. * */
  57. //UCSCTL6 &= ~(XT2DRIVE0|XT2DRIVE1|XT2OFF);
  58. while (SFRIFG1 & OFIFG) {                               // Check OFIFG fault flag
  59. UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);         // Clear OSC flaut Flags
  60. SFRIFG1 &= ~OFIFG;                                  // Clear OFIFG fault flag
  61. }
  62. UCSCTL4 = UCSCTL4&(~(SELS_7|SELM_7))|SELS_3|SELM_3;
  63. while(1){
  64. P1OUT ^= BIT1;
  65. delay();
  66. }
  67. }

MSP430晶振配置详解相关推荐

  1. 晶振参数详解及设计参考

    晶振的重要参数 1 常用标称频率  更高的输出频率也常用PLL(锁相环) 2 频率误差(Frequency Tolerance)或频率稳定度(Frequency Stability),用单位ppm来表 ...

  2. 晶振原理详解及测试方法

    一.有源晶振和无源晶振工作原理: 1.无源晶振工作原理: 在石英水晶片的两边镀上电极,通过在两电极上加一定的电压,因为石英有压电效应,电压形成了,自然就会产生形变,从而给IC提供一个正弦波形.通过IC ...

  3. STM32F103 晶振问题详解

    博主自制开发板,用的 STM32F103RCT6,设计时 8M 晶振并联了个 1M 电阻,实测发现: 1.软件延时 1s ,实际延时 9s,拆掉 1M 电阻问题消失. 2.部分代码下载进去后单片机不工 ...

  4. GD32F4—RTC闹钟及自动唤醒中断配置详解

    GD32F4-RTC闹钟及自动唤醒中断配置详解 一.简介 二.框图 三.RTC 初始化和配置 一.简介 GD32F4x的RTC例程网上资源较少,详细阅读用户手册后做出如下配置.RTC模块提供了一个包含 ...

  5. 【STM32学习】时钟配置详解

    [STM32学习]时钟配置详解 看懂时钟图 结合代码 外部高速时钟修改 看懂时钟图 在刚开始学习32的时候,并不会在意这些,或者即使看了也看的不是很明白.随着学习的深入,我们发现看门狗.定时器.ADC ...

  6. elasticsearch-.yml(中文配置详解)

    此elasticsearch-.yml配置文件,是在$ES_HOME/config/下 elasticsearch-.yml(中文配置详解) # ======================== El ...

  7. (ASA) Cisco Web ××× 配置详解 [三部曲之一]

    (ASA) Cisco Web ××× 配置详解 [三部曲之一] 注意:本文仅对Web×××特性和配置作介绍,不包含SSL ×××配置,SSL ×××配置将在本版的后续文章中进行介绍.   首先,先来 ...

  8. mybatis 同名方法_MyBatis(四):xml配置详解

    目录 1.我们将 数据库的配置语句写在 db.properties 文件中 2.在 mybatis-configuration.xml 中加载db.properties文件并读取 通过源码我们可以分析 ...

  9. logback节点配置详解

    logback节点配置详解 一:根节点 <configuration></configuration> 属性 : debug : 默认为false ,设置为true时,将打印出 ...

最新文章

  1. Google Gflags使用
  2. 第三章 可扩展标记语言XML
  3. Qstring 与tr翻译过来的中文进行比较的问题
  4. Harbor的搭建(vmware企业级docker镜像私服)
  5. java 高德地图 车型比价计算_高德地图的高速公路过路费计算功能是如何实现的?有相应开放的API吗?...
  6. Linux Socket C语言网络编程:UDP Socket
  7. 你关注什么,输出什么
  8. Mikogo新版本已支持Linux系统
  9. 通过AMS分析Binder流程(Java到Kernel)
  10. 湖南联通云计算与IDC掀发展浪潮
  11. Recycler 病毒(jwgkvsq.vmx)手动查杀
  12. 电脑打开计算机显示远程过程调用失败,win7系统电脑弹出提示“远程过程调用失败且未执行”的解决方法...
  13. 复杂性思维中文第二版 八、自组织临界
  14. java时间换算方法
  15. 具象的东西_在《道德经》中,老子借助一些具象的东西,简化思想内容
  16. 宅男福利!爬虫实战,爬取原神真人c图片并保存,谁的老婆快抱走
  17. 我是马云:新入职员工勿批判公司
  18. 带你薅“云”羊毛:定个小目标,先薅他一年
  19. 构建nginx镜像,部署到k8s
  20. hdmi线接计算机HDMI接口松动,HDMI线连接电视电脑常见问题及解决办法

热门文章

  1. u盘锁定计算机,u盘锁电脑的方法介绍【图解】
  2. POI XWPFDocument 导出word目录详解
  3. 写给想成为产品经理的学生们
  4. 石头剪刀布(c语言)
  5. 算法进化历程之剪刀石头布
  6. 一句Json搞定数组中多层字段的替换
  7. postgresql安装所需函数插件(比如加密函数hamc()函数使用)
  8. 9.10. Experimental features
  9. 以下关于python语言技术特点_关于Python语言的特点,以下选项中描述错误的是
  10. 视频编解码——视频编解码器工作原理