历史上的今天
返回首页

历史上的今天

今天是:2024年10月17日(星期四)

正在发生

2019年10月17日 | MSP430杂谈--时钟资源UCS的配置

2019-10-17 来源:eefocus

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


UCS简介

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


UCS上电默认状态


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


(1)XT1处于LF模式作为XT1CLK时钟源。ACLK选通为XT1CLK。  

(2)MCLK选通为DCOCLKDIV  

(3)SMCLK选通为DCOCLKDIV  

(4)FLL使能,且将XT1CLK作为FLL参考时钟。  

(5)XIN和XOUT脚设置为通用IO,XIN和XOUT配置为XT1功能前,XT1保持禁用。  

(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.配置IO口5.4和5.5为XT1功能。  

2.配置XCAP为XCAP_3,即12PF的电容。  

3.清除XT1OFF标志位。  

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,其中,倍频计算公式如下:


DCOCLK = D*(N+1)*(REFCLK/n)  

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


DCORSEL = 0的调节范围约为0.20~0.70MHZ;  

DCORSEL= 1的调节范围约为0.36~1.47MHZ;  

DCORSEL = 2的调节范围约为0.75~3.17MHZ;  

DCORSEL = 3的调节范围约为1.51~6.07MHZ;  

DCORSEL = 4的调节范围约为3.2~12.3MHZ;  

DCORSEL = 5的调节范围约为6.0~23.7MHZ;  

DCORSEL = 6的调节范围约为10.7~39.7MHZ;  

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  

推荐阅读

史海拾趣

Cermetek Microelectronics公司的发展小趣事

在追求经济效益的同时,Cermetek Microelectronics公司也积极履行社会责任。公司注重环保和可持续发展,采用环保材料和生产工艺,减少对环境的影响。此外,公司还积极参与社会公益事业,为社会做出贡献。这种负责任的态度不仅赢得了社会各界的认可,也为公司的长远发展注入了正能量。

这五个故事展示了Cermetek Microelectronics公司在电子行业中的发展历程和取得的成就。通过技术积累、品质管理、持续创新、国际化战略和社会责任等方面的努力,公司逐渐在微电子领域树立起了自己的品牌形象和市场地位。

星海公司的发展小趣事

随着国内市场的饱和,星海公司开始实施国际化战略,积极拓展海外市场。公司积极参加国际展览和比赛,展示星海钢琴的品质和实力。同时,星海公司还与国际知名音乐院校和乐团建立合作关系,推动星海钢琴在国际市场的知名度和影响力。目前,星海钢琴已出口到世界60多个国家和地区,成为国际市场上备受瞩目的中国品牌。

Hendon Semiconductors公司的发展小趣事

Hendon Semiconductors以其强大的定制化集成电路设计能力而闻名。公司拥有一支经验丰富的设计团队,能够为客户提供从概念到量产的一站式解决方案。这种定制化服务不仅满足了客户对特殊功能和高性能的需求,也帮助Hendon Semiconductors在竞争激烈的市场中脱颖而出。通过不断积累成功案例和技术经验,Hendon Semiconductors逐渐在定制化集成电路设计领域建立了良好的口碑。

睿赫(crechip)公司的发展小趣事

随着技术的不断突破和市场需求的日益增长,睿赫公司的芯片产品逐渐得到了广泛的应用。尤其是在智能手机、物联网和智能家居等领域,睿赫芯片凭借其高性能和低功耗的特性,赢得了众多知名企业的青睐。

与此同时,睿赫公司还积极拓展海外市场,与国际知名企业展开合作,共同推动电子行业的发展。通过不断的技术创新和市场拓展,睿赫公司逐渐在电子行业中树立了自己的品牌形象。

Comair Rotron公司的发展小趣事

随着电子技术的飞速发展,Comair不断投入研发,力求在技术上取得突破。在某次关键的技术研发中,公司成功开发出了一种新型高效风扇,其性能远超当时市场上的同类产品。这一技术突破为Comair赢得了更多电子行业客户的青睐,公司的市场份额也逐渐扩大。

e2v technologies公司的发展小趣事

为了进一步提升整体实力,e2v在发展过程中进行了多次收购与整合。这些收购不仅增强了公司的技术实力和市场竞争力,也为其带来了更多的客户资源。例如,e2v曾收购了一家专注于医疗成像技术的公司,这一举措使其在医疗成像领域取得了显著的进展。

问答坊 | AI 解惑

竞争方式急需转变 本土汽车电子企业遭遇难题

时值2008年初,汽车电子行业在回顾2007年发展的同时,也提出了一些发人深省的问题,本土汽车电子企业在发展过程将会面临三大问题,必须引起重视。 价格战造成两败俱伤,竞争方式急需转变 近两年,汽车电子行业的竞争越来越激烈,“尤其在 ...…

查看全部问答>

Rf_Calc 包括通信距离计算等

昨晚搞了个小工具,方便大家计算!不用动笔了!欢迎使用,有bug请斧正,谢谢! Rf Calc 包含功能:                ① mW换算为dBm;            &nb ...…

查看全部问答>

自动调节原理的基本知识

友情提示:承蒙网友的厚爱,见到有些网友把此帖转帖,谢谢!希望大家在转贴的时候注明作者:焦作华润白志刚。 目前,本文的最新版本已经编辑完成,如果已经转贴的朋友,请按照最新版本修改。再次感谢! 第一章 自动调节系统的发展历程 1-1 ...…

查看全部问答>

shen zhen programmer

程序员在深圳群已经超过1500人,里面有很多在大公司上班的成员(包括国家级的研究院),有很多经验丰富的成员(包括参加过上亿元的项目的架构师),有很热爱技术的成员(包括自己写过嵌入式操作系统),希望大家踊跃发言,找到志同道合的朋友,找到对你有帮助的 ...…

查看全部问答>

有什么好的WinCE学习资料,大家推荐以下,谢了!

有什么好的WinCE学习资料,大家推荐以下,谢了!…

查看全部问答>

verilog HDL仿真时报这个错误,是什么原因

用modelsim仿真一段简单verilog程序:module 2_nand(in1,in2,out);input in1,in2;output out;assign out=~(in1&in2);endmodule编译时报错:near \"module\": syntax error…

查看全部问答>

关于430f149sram得扩展

偶是个430新手,这两天看了些资料,但是一直没有看到关于外扩ram得应用,想弱弱得问一下,430用哪个口扩展外部ram,扩展后,软件是怎么操作得(比如c51使用XBYTE访问得)? 请大虾不要置疑为何扩展ram,只因为系统确实需要这么做才能正常工作,这 ...…

查看全部问答>

请教一个UCOS中断任务的问题

    假设一个任务在执行过程中,被中断,然后保存现场进入中断后,发现更高优先级任务,这时候,执行更高优先级任务,在执行更高优先级任务时候,被中断的任务处在什么状态?在被中断的代码中,没有看到被挂起的代码。还有更高优先 ...…

查看全部问答>

是不是今年会有压控LC振荡器 类似得题目?

本帖最后由 paulhyde 于 2014-9-15 09:08 编辑 我看看了看03年的元件清单有个高频变容二极管,然后那年题目就有电压控制LC振荡器。是不是今年有可能会有呢?  …

查看全部问答>