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

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

UCS上电默认状态

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

  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即可,具体代码如下:

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. 1.配置IO口5.4和5.5为XT1功能。
  2. 2.配置XCAP为XCAP_3,即12PF的电容。
  3. 3.清除XT1OFF标志位。
  4. 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的代码如下:

#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系列时钟切换的基本操作了,讲的并不详细,有其他疑问请仔细阅读芯片手册或者留言讨论。

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

  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的频率调节范围大致如下:

  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官方例子中的代码了,官方代码中的相关部分如下:

if (fsystem <= 630)            //           fsystem < 0.63MHz  UCSCTL1 = DCORSEL_0;
else if (fsystem <  1250)      // 0.63MHz < fsystem < 1.25MHz  UCSCTL1 = DCORSEL_1;
else if (fsystem <  2500)      // 1.25MHz < fsystem <  2.5MHz  UCSCTL1 = DCORSEL_2;
else if (fsystem <  5000)      // 2.5MHz  < fsystem <    5MHz  UCSCTL1 = DCORSEL_3;
else if (fsystem <  10000)     // 5MHz    < fsystem <   10MHz  UCSCTL1 = DCORSEL_4;
else if (fsystem <  20000)     // 10MHz   < fsystem <   20MHz  UCSCTL1 = DCORSEL_5;
else if (fsystem <  40000)     // 20MHz   < fsystem <   40MHz  UCSCTL1 = DCORSEL_6;
else  UCSCTL1 = DCORSEL_7;  

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

#include   void delay(){  volatile unsigned int i;  for(i = 0; i != 5000; ++i){  _NOP();  }
}  void SetVcoreUp (unsigned int level)
{  // Open PMM registers for write  PMMCTL0_H = PMMPW_H;  // Set SVS/SVM high side new level  SVSMHCTL = SVSHE + SVSHRVL0 * level + SVMHE + SVSMHRRL0 * level;  // Set SVM low side to new level  SVSMLCTL = SVSLE + SVMLE + SVSMLRRL0 * level;  // Wait till SVM is settled  while ((PMMIFG & SVSMLDLYIFG) == 0);  // Clear already set flags  PMMIFG &= ~(SVMLVLRIFG + SVMLIFG);  // Set VCore to new level  PMMCTL0_L = PMMCOREV0 * level;  // Wait till new level reached  if ((PMMIFG & SVMLIFG))  while ((PMMIFG & SVMLVLRIFG) == 0);  // Set SVS/SVM low side to new level  SVSMLCTL = SVSLE + SVSLRVL0 * level + SVMLE + SVSMLRRL0 * level;  // Lock PMM registers for write access  PMMCTL0_H = 0x00;
}  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;  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);  //UCSCTL6 &= ~(XT2DRIVE0|XT2DRIVE1|XT2OFF);  while (SFRIFG1 & OFIFG) {                               // Check OFIFG fault flag  UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);         // Clear OSC flaut Flags  SFRIFG1 &= ~OFIFG;                                  // Clear OFIFG fault flag  }  UCSCTL4 = UCSCTL4&(~(SELS_7|SELM_7))|SELS_3|SELM_3;  while(1){  P1OUT ^= BIT1;  delay();  }
}  

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

MSP430杂谈--时钟资源UCS的配置相关推荐

  1. 7a系列mrcc xilinx_【FPGA】Xilinx-7系的时钟资源与DDR3配置

    引子: HP中的DDR需要sys_clk和clk_ref两路输入,HR用户功能也需要usr_clk时钟输入. 但是HR资源IO被完全占用,HP中只有bank33的MRCC/SRCC可以作为fpga的时 ...

  2. MSP430单片机:时钟系统(UCS 模块)

    Family User's Guide  用户指南 UCS 模块最多含有 5 个时钟源: XT1CLK:低频/高频振荡器,可以使用低频 32768HZ 晶振和外部振荡器或者通过外部输入源输入 4MHZ ...

  3. Virtex-6器件的时钟资源、混合模式时钟管理器(MMCM)

    时钟资源 为了更好的控制时钟,Virtex-6器件分成若干个时钟区域,最小器件有6个区域,最大器件有18个区域.每个时钟区域高40个CLB.在时钟设计中,推荐使用片上专用的时钟资源,不推荐使用本地时钟 ...

  4. Xilinx FPGA全局时钟和第二全局时钟资源的使用方法

    目前,大型设计一般推荐使用同步时序电路.同步时序电路基于时钟触发沿设计,对时钟的周期.占空比.延时和抖动提出了更高的要求.为了满足同步时序设计的要求,一般在FPGA设计中采用全局时钟资源驱动设计的主时 ...

  5. 赛灵思FPGA中的主要时钟资源介绍

    把握DCM.PLL.PMCD 和MMCM 知识是稳健可靠的时钟设计策略的基础. 赛灵思在其FPGA 中提供了丰富的时钟资源,大多数设计人员在他们的FPGA 设计中或多或少都会用到.不过对FPGA设计新 ...

  6. XILINX FPGA时钟资源

    Xilinx FPGA时钟资源 Xilinx FPGA时钟包括全局时钟资源.局部时钟资源和I/O时钟资源.Xilinx FPGA除了提供丰富的时钟网络之外,还提供了强大的时钟管理模块,并不断改进,从V ...

  7. bufg和bufgp_Xilinx FPGA全局时钟和第二全局时钟资源的使用方法(转)

    "全局时钟和第二全局时钟资源"是FPGA同步设计的一个重要概念.合理利 用该资源可以改善设计的综合和实现效果:如果使用不当,不但会影响设计 的工作频率和稳定性等,甚至会导致设计的综 ...

  8. UltraScale时钟资源和时钟管理模块

    UltraScale时钟资源和时钟管理模块 绪论 图2.1和2.2给出了UltraScale结构的时钟结构.从图中可以看出,基本的结构是由表示分段时钟行和列的CR块构成的CR以一个单元的方式排列,从而 ...

  9. Xilinx FPGA时钟资源的使用

    赛灵思FPGA时钟资源的类型:DCM.PLL.PMCD.MMCM DCM:数字时钟管理器 PLL:锁相环 PMCD:相位匹配时钟分频器 MMCM:混合模式时钟管理器 DCM实际上就是一个DLL(延迟锁 ...

最新文章

  1. AWS S3宕机的启发: 云必须分散化
  2. leetcode算法题--最长的斐波那契子序列的长度
  3. 关于解决mybase7继续使用的方法
  4. js的作用域链,原型链,以及闭包函数理解
  5. [攻防世界 pwn]——get_shell
  6. jQuery 学习笔记之二 (jQuery代码风格)
  7. 惠普光影精灵拆机换屏幕_聊聊惠普游戏本大军的“先遣部队”
  8. 数据结构—栈的应用(括号匹配、表达式求值、递归)
  9. 人工智能哪些技术在教育领域中得到了应用?
  10. windows docker 设置镜像源_Windows10下搭建第一个Docker应用(Demo)
  11. SQL:postgresql中使用limit ... offset ... 实现分页查询
  12. 请问smartadmin中如何只用其treeview 组件?
  13. firefox百度贴吧发不出表情的解决办法
  14. XMLHttpRequest请求跨域问题解决方案
  15. 亚马逊云科技帮助德比软件轻松应对爆发的增长
  16. 抖音自动生成文字_抖音视频怎么加文字
  17. 基于YOLOv3的车辆号牌定位算法【文末送书】
  18. 轩辕谷,黄帝的诞生地
  19. 土地利用规划之平时作业三
  20. HDU 1495 非常可乐(数论,BFS)

热门文章

  1. 设计模式 过滤器模式
  2. 渗透测试入门21之Metasploit渗透测试常用流程
  3. Jmeter之Json表达式关联
  4. 20181225 基于TCP/IP和基于UDP/IP的套接字编程
  5. Basic64 编码解码
  6. ES6 let和const命令(3)
  7. SQL Server里查看当前连接的在线用户数
  8. 企业邮箱及邮件服务器架设
  9. Android merge优化UI
  10. java获取C盘下的隐藏目录文件名称