MSP430F5529 统一时钟系统UCS

http://blog.lehu.shu.edu.cn/879836630/A449184.html

http://blog.lehu.shu.edu.cn/879836630/A449291.html


1、以后要配置时钟的地方到处都是。

2、打字好累,上传更累;

3、之后我会发布PDF版,有心的同学可以下载学习。

 

之前有一点漏说明了,先补充上

***************************************************************还有一个模块时钟源:MODOSC,产生MODCLK时钟源信号,一般只为闪存控制模块和ADC12模块提供服务。

该模块不被使用时自动关闭,任何模块对该时钟源提出使用要求时,MODOSC无需被使能即可响应该请求。430F5529中MODCLK为5MHZ。

***************************************************************

 

 

 

 

MSP430F5529有多个时钟源,而且很多模块其时钟源都是可以自由选择的。此外,由于一般情况下,系统功耗是和工作频率成正比的,因此有些时候通过选择较低频率的时钟源,在满足正常工作条件下,是可以有效降低功耗的。虽然函数库HAL_UCS.c/h,有完整的各个控制函数,但我觉得对于这一章还是对寄存器直接操作比较简单,因为函数太短、太多了。

 

3.1统一时钟系统(UCS)的简介

            Unified Clock SystemUCS。合理的配置时钟,可以达到平衡系统且降低功耗的目的。

            MSPF5529时钟系统包含5个时钟源:

                   LFXT1 外部低频振荡源,32.768KHZ,可以用作FLL的参照源;

XT2 外部高频振荡源,4MHZ

VLO Internal very low内部低耗低频振荡源,典型为10KHZ,精度一般;

REFO 内部低频参照源,32.768KHZ,常被用作锁相环FLL的基准频率,精度很高,不使用时不消耗电源,其设置往往要参考LPM模式的的设置;

DCO Internal digitally-controlled内部数字控制振荡源,一般通过FLL来设置;(很有用,很重要,之后会详细讲

 

通常使用3种时钟信号,它们都来自于上述5个信号源:

ACLK Auxiliary clock辅助时钟,其时钟源可由软件控制从XT1REFOCVLODCODCOCLKDIVXT2里面选取。其中DCOCLKDIV是由DCO124816或者32分频得到。注意,ACLK同样可以再次被124816或者32分频。

MCLK Master clock主时钟,其特性与ACLK一模一样。

SMCLK Subsystem master clock子系统时钟,其特性与ACLK一模一样。

 

3.2 UCS的操作说明

                   开机上电时默认的时钟情况为(必须记清楚!!!!):

                          ACLKXT1(无效时,低频模式切换为REFO,其他情况切换为DCO

                          MCLKDCOCLKDIV

                          SMCLKDCOCLKDIV

                   此外,FLL的参照源默认XT1

如果连接XT1XT2的引脚不进行PXSEL的设置,那么这两个时钟源都是无效的;

REFOCLKVLOCLKDCOCLK默认状态下是可用的;

系统稳定后,DCOCLK默认为2.097152MHZFLL默认2分频,则MCLKSMCLK的频率都为1.048576MHZ。(实验三会提到如何计算

 

                            另外,系统复位、系统工作模式LPM的选择都会对UCS有一定影响,这里限制太多,具体可参考TI官方资料UCS部分。LPM以及系统复位下章将会讲到。

 

              关于操作说明的简单总结:(下面基本都是废话,了解即可)

VLO的选择是最简单的,不需要顾及其它情况;

REFO的选用,需要参考不同的工作模式,有多种限制;

XT1XT2特点相同。使用的时候,不仅要配置与其相连的引脚,还要配置电容,还要注意其本身工作在低频还是高频模式。而且,在不同工作模式下也有不同的要求;

DCO作为数控振荡器,其频率的调节不仅可以通过自身设定,也可以通过FLL锁相环设定;

FLL锁相环,是变换频率的灵活选择。它既可以设置基准频率,也可以选择分频数,还可以被直接关闭来实现降低功耗等目的;

UCS系统带有时钟信号错误保护机制;

对有严格时序要求的地方,要选择精度高的时钟源,并且做好FLLDCO部分的调制设置;

不同模式下(有些时钟源是禁止的)的时钟控制图:(只需用到的时候注意一下即可,查表)

点击看大图点击看大图 

    

 

3.3 UCS寄存器控制操作

                   共有1016位读写寄存器,为UCSCTL0-UCSCTL9。同样支持字和字节操作,即UCSCTL0包括UCSCTL0_HUCSCTL0_L

                   注:凡是标记“Reserved”的位,如果没有特意声明,则读回时都按0处理。

UCSCTL0

点击看大图

DCO  DCO频拍选择。选择DCO的频拍并在FLL运行期间(因MOD位的变化)自动调整。。DCO 5个控制位把由DCORSELx选择的DCO频率分为32等份,间隔大约8% 

MOD调制位计数器。选择调制类型,所有的MOD位在FLL运行期间自动调整,无需用户干预。

 

UCSCTL1

点击看大图             

       DCORSELDCO频率范围选择

DISMOD调制器禁止使能位。0—使能调制器;1—禁止调制器。

 

UCSCTL2

点击看大图

FLLD预分频器(即fDCO分频)。000-1分频,001-2分频,010-4分频,

011-8分频,100-16分频,101-32分频,

110以及111都是备用的,默认为32分频。

FLLN倍频系数。设置倍频值NN必须大于0,如果FLLN=0,则N被自动设置为1

 

UCSCTL3

点击看大图          

      SELREFFLL参考时钟选择。

                          000-XT1001-待用,默认为XT1010-REFO

101-XT2,其余均为待用,默认为REFO

FLLREFDIVFLL参考时钟分频器。000-1分频,001-2分频,010-4分频,

011-8分频,100-12分频,101-16分频,

110以及111都是备用的,默认为16分频。

 

UCSCTL4

点击看大图

SELAACLK时钟源选择。

                   000-XT1001-VLO010-REFO011-DCO

100-DCOCLKDIV101 -XT2有效时为XT2,否则为DCOCLKDIV 

110 111保留以备后来使用。当XT2有效时默认为XT2CLK,否则默认

DCOCLKDIV 

SELSSMCLK时钟源选择。设置同SELA

SELMMCLK时钟源选择。设置同SELA

 

UCSCTL5

点击看大图

DIVPAACLK外部有效输出分频000-1分频,001-2分频,010-4分频,

011-8分频,100-16分频,101-32分频,

110以及111都是备用的,默认为32分频。

      DIVAACLK时钟源分频,设置同DIVPA

      DIVSSMCLK时钟源分频,设置同DIVPA

      DIVMMCLK时钟源分频,设置同DIVPA

 

       UCSCTL6

点击看大图 

XT2DRIVEXT2振荡器电流驱动能力调整 

00 最低电流消耗。XT2振荡器工作在4MHz8MHz …

XT2BYPASSXT2旁路选择          0-XT2来源于内部时钟(使用外部晶振)         

  1-XT2来源于外部引脚输入(旁路模式)

 

XT2OFF关闭XT2振荡器        

 0 -XT2引脚被设置为XT2功能且没有被设置位旁路模式时,XT2被打开; 

        1 -XT2没有被用作时钟源以及没有用作FLL参考时钟时,XT2被关闭。

XTSXT1工作模式选择

0-低频模式(XCAP定义XINXOUT引脚间的电容)

     1-高频模式(XCAP位没有被使用)

XCAP振荡器负载电容选择

SMCLKOFFSMCLK关闭控制位  0-SMCLK           1-SMCLK关闭 

XT1OFFXT2OFF

 

     UCSCTL7

点击看大图

XT2OFFGXT2出错时置位,同时OFFIFG也会置位,需要软件清零。

XT1HFOFFG高频工作模式下XT1出错时置位,同时OFFIFG也会置位,需要软件清零。

XT1LFOFFG低频工作模式下XT1出错时置位,同时OFFIFG也会置位,需要软件清零。

DCOOFFGDCO出错时置位,但当DCO=131时,也会置位,同时OFFIFG也会置位,需要软件清零。

 

         UCSCTL8

 

点击看大图 

  信号请求使能:

0-相应的信号请求禁止      1-相应的信号请求允许

 

       UCSCTL9

点击看大图

          XT1XT2旁路模式输入摇摆电平(范围)必须被设置

                                                      0-输入范围0~DVCC

                                                                                                            1-输入范围0~DVIO

 

 

       3.4实验总结

            实验一:将MCLKSMCLK配置为REFOCLKVLOCLK(需要示波器测量)

/* REFOCLKVLOCLK是芯片默认提供的,只要芯片正常工作,这两个时钟就会正常工作,因此,该时钟配置非常简单,只需要修改UCSCTL4,将SELSSELM配置为对应的选项VLOCLK或者REFOCLK即可*/

#include  

void main(void){

    WDTCTL = WDTPW+WDTHOLD;

    P1SEL |= BIT0;//声明有特殊功能,将不被用作普通I/O

    P1DIR |= BIT0;//ACLK输出端,用来测量ACLK频率,外接频率计测

    P2SEL |= BIT2;P2DIR |= BIT2;//SMCLK输出端

    P7SEL |= BIT7;P7DIR |= BIT7;//MCLK用输出端

    //UCSCTL4 = UCSCTL4&(~(SELS_7|SELM_7))|SELS_1|SELM_1; //SMCLKMCLK配置为VLOCLK

    UCSCTL4 = UCSCTL4&(~(SELS_7|SELM_7))|SELS_2|SELM_2; //SMCLKMCLK配置为REFOCLK

/* UCSCTL4&(~(SELS_7|SELM_7))这一语句相当于先把SELSSELM清零*/

while(1);

}

 

实验二:将MCLKSMCLK配置为XT1F5529XT132.768KHZ

/*1.配置IO5.45.5XT1功能。*/

/*2.配置XCAPXCAP_3,即12PF的电容。*/

/*3.清除XT1OFF标志位。*/

/*4.等待XT1起振。*/

#include <msp430.h>  

void main(void){

     P1SEL |= BIT0;P1DIR |= BIT0;//测量ACLK

     P2SEL |= BIT2;P2DIR |= BIT2;//测量SMCLK

     P7SEL |= BIT7;P7DIR |= BIT7;//测量MCLK

     P5SEL |= BIT4|BIT5; //配置为XT1功能,电路板上晶振接于这两脚

     UCSCTL6 |= XCAP_3;  //配置电容为12pF

     UCSCTL6 &= ~XT1OFF; //使能XT1

/*下面是很重要的一步:*/

/* XT1刚刚起振的时候可能有错误,导致时钟错误标志位置位,必须先清零*/

/*OFIFGOsc Fault Flag,位于SFRIFG1*/

while(SFRIFG1 & OFIFG)   //如果有时钟错误{

   UCSCTL7 &=~(XT2OFFG+DCOFFG+XT1LFOFFG);//清除3种时钟错误标志

   SFRIFG1&=~(OFIFG);//清除时钟错误标志位}

UCSCTL4&=(UCSCTL4&(~(SELS_7|SELM_7)))|SELS_0|SELM_0;

//SMCLKMCLK时钟源配置为XT1}

 

 

实验三:DCO-FLL数控振荡器结合锁相环

   DCO模块在MSP430F5529系列芯片中非常重要,因为从MSP430F4XX开始,MSP430引用了FLL模块,FLL即锁相环,可以通过倍频的方式提高系统时钟频率,进而提高系统的运行速度。

DCO模块运行需要参考时钟REFCLK,REFCLK可以来自REFOCLK、XT1CLK和XT2CLK,通过UCSCTL3的SELREF选择,默认使用的XT1CLK,但如果XT1CLK不可用则使用REFOCLK。

DCO模块有两个输出时钟信号,即DCOCLKDCOCLKDIV,其中,倍频计算公式如下:

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

DCOCLKDIV = (N+1)*(REFCLK/n)

其中:nREFCLK输入时钟分频,可以通过UCSCTL3中的FLLCLKDIV设定,默认为1,也就是不分频;

D可以通过UCSCTL2中的FLLD来设定,默认为1,也就是2分频;

N可以通过UCSCTL2中的FLLN来设定,默认值为32

所以,系统上电后如果不做任何设置,DCOCLK的实际值为2097152DCOCLKDIV的实际值为1048576

 

另外,配置芯片工作频率还需要配置DCORSELDCOxDCORSELDCOx的具体作用如下:

DCORSEL位于UCSCTL1,共3位,将DCO分为8个频率段。

DCOx位于UCSCTL05位,将DCORSEL选择的频率段分为32个频率阶,每阶比前一阶高出约8%,该寄存器系统可以自动调整,通常配置为0

下表给出了相应设置情况下的频率调节范围:

点击看大图 

/*通过DCO-FLL32.768KHZ倍频到25MHZ*/

#include <msp430.h>  

#include “HAL_PMM.h”

void delay()

{

volatile unsigned int I;

for(I = 0; I != 5000; ++i){_NOP(); }}//延时函数

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;//打开XT1,否则XT1LFOFFG可能报错

SetVCore(3); //提高Vcore电压到最高级,以满足倍频需求该函数位于HAL_PMM.H

__bis_SR_register(SCG0);//该语法为固定格式,意为将括号内的变量置位,SCG0与系统工作模式有关,此时MCLK暂停工作

UCSCTL0 = 0;   //先清零,FLL运行时,该寄存器系统会自动配置,不用管

UCSCTL1 = DCORSEL_6;

UCSCTL2 = FLLD_1 | 380;//FLLD=1,FLLN=380,则频率为

2*380+1*32.768=24.969MHZ

__bic_SR_register(SCG0);

__delay_cycles(782000);//系统自带的精确延时,单位us

while (SFRIFG1 & OFIFG) {                            

        UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);       

        SFRIFG1 &= ~OFIFG;                                 

}

 UCSCTL4 = UCSCTL4&(~(SELS_7|SELM_7))|SELS_3|SELM_3;

//选择DCO作为时钟源

 while(1){

        P1OUT ^= BIT1;

        delay();

}

}


  • 10
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值