时钟模块总览:
这是MSP430X5XX的时钟系统框图。乍一看很复杂,不过简化之后就清楚多了
整个系统主要分为左右两大块,左边是时钟源模块,右边是时钟调整模块。
左边的模块——XT1、内建时钟(DCO)、XT2用来产生时钟源,也就是右边最终输出的时钟信号的基准信号。
而时钟调整模块负责将源时钟信号选通、分频输出成系统使用的三大时钟信号——MCLK,ACLK和SMCLK,分别是系统的主时钟(供CPU使用),辅助时钟(可给外设模块使用,也可以从管脚引出),子系统时钟(外设模块时钟,可从管教引出)。
调整模块的主要工作分为两步:选通、分频。ACLK调整模块如下图所示
左端进线是源时钟信号。红色标出来的是XT1CLK信号。由图易知,XT1CLK要变成ACLK信号,需要经过两次选通,一次分频,也就是我红色标出来的路径。第一个选通器可通过设置SELA来控制,分频器可以通过设置DIVA来控制,正常工作的时候,最后一个选通器总是打开的,这里不讨论。换言之,要想设置ACLK,我们只需要配置SELA和DIVA。例如,如果我们希望ACLK是XT1CLK的2分频的话,需要设置SELA={0},DIVA={1}。再给一个来自TI的例子
UCSCTL4 |=SELA_2; // Set ACLK = REFO
这句话将ACLK的源设置为REFO。
SELA具体的含义如下图所示:
顺便说一句,TI的这个例子没有设置DIVA,用了默认值。
3.REFO、VLO和DCO
有了上述的理解,再参照slau208e,我相信不难写出我们想要的代码。不过整个UCS中最有特色的部分还没有介绍,那就是REFO、VLO和DCO。
REFO是内建的参考时钟,它很稳定,可以作为FLL的时钟基准(FLL是什么待会再说)。MSP430F5418上的REFOCLK是32.768kHz的。
VLO是一个内建的低频时钟。在5418上,它的频率是8.6kHz。
DCO是Digitally-Controlled Oscillator,数控晶振。它可以产生频率很高的时钟。通过配置,它可以产生百兆以上的时钟信号。在5418上,电压等级1的时候,不用XT2,有FLL(这个FLL到底是什么呢?),我调出的最高频率是26MHz。
吊了这么半天胃口,来说一下这个FLL是什么东西。
FLL是Frequency Locked Loop,锁频环。先来个特写
FLL的作用是稳定DCO的输出,让它不受扰动的影响。它是一种反馈。前边我们说过,REFO是个很稳定的内部时钟信号。FLL可以拿REFOCLK做参考,以此来自动校准并稳定DCOCLK和DCOCLKDIV。除了REFOCLK之外,还可以用XT1或XT2做FLL的参考信号。当启用FLL之后(默认启用),图中的DCO,MOD可以不用设置,FLL会自行调整这两个值。DCO输出的频率与以下几个量有关:
FLLD,FLLN,FLLREFDIV,FLLREFCLK
计算公式如下:
fDCOCLK = D × (N + 1) × (fFLLREFCLK ÷ n)
fDCOCLKDIV = (N + 1) × (fFLLREFCLK ÷ n)
其中
D=1,2,4,8,16,32(对应FLLD=0,1,2,3,4,5)
N=FLLN
n=1,2,4,8,12,16(对应FLLREFDIV=0,1,2,3,4,5)
fFLLREFCLK为REFOCLK,XT1或XT2的实际频率。
下面就以设置msp430f5438主频最大为25M来说明这个配置:
//ACLK = REFO = 32kHz, MCLK = SMCLK = 25MHz WDTCTL = WDTPW + WDTHOLD; // Stop WDT UCSCTL3 |= SELREF_2; // Set DCO FLL reference = REFO UCSCTL4 |= SELA_2; // Set ACLK = REFO __bis_SR_register(SCG0); // Disable the FLL control loop UCSCTL0 = 0x0000; // Set lowest possible DCOx, MODx UCSCTL1 = DCORSEL_7; // Select DCO range 25MHz operation UCSCTL2 = FLLD_1 +762; // Set DCO Multiplier for 25MHz // (N + 1) * FLLRef = Fdco // (762 + 1) * 32768 = 25MHz // Set FLL Div = fDCOCLK/2 __bic_SR_register(SCG0); // Enable the FLL control loop // Worst-case settling time for the DCO when the DCO range bits have been // changed is n x 32 x 32 x f_MCLK / f_FLL_reference. See UCS chapter in 5xx // UG for optimization. // 32 x 32 x 25 MHz / 32,768 Hz = 782000 = MCLK cycles for DCO to settle __delay_cycles(782000); // Loop until XT1,XT2 & DCO fault flag is cleared do { UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG); // Clear XT2,XT1,DCO fault flags SFRIFG1 &= ~OFIFG; // Clear fault flags }while (SFRIFG1&OFIFG); // Test oscillator fault flag
4.频率范围和电压等级
MSP430把内核的工作频率划分为若干范围,比如543x和541x的工作频率就被分为了8个范围。每个范围又被DCO这个参数分为了32个小段,每个小段又被MOD分为32个小小段(待验证)。所以可以把DCO看作是粗调旋钮,MOD是微调旋钮。另外,需要注意的是,这个频率范围是指DCO的频率范围,当DCO被禁用的时候,这个范围就没意义了。
喜欢超频的同学都知道,核心电压和工作频率之间有着密切的关系。430单片机也是如此,它有4个电压等级,涵盖了从1.2V到2V广阔的核心电压范围。
一般来说,核心电压越高,频率范围越大,功耗越大;核心电压越低,频率范围越小,功耗越小。
当电压等级为1的时候(默认电压等级),5418的各个频率范围的可用上下限如下表所示:
5418各频率范围上下限详表
从这个表中可以看出,除了前边谈到的几个参数,还有大量的其他寄存器参数。具体的含义可以从参考文献中查知。如果觉得翻看pdf太累的话,可以向我索要xls格式的详表(moosewolerATgmailDOTcom),上边有我加的批注和公式,可以帮助大家方便的设置频率。
5.UCS关键寄存器
详表中我用颜色对8个UCS相关的寄存器进行了分组。这8个寄存器可以分为6组:
因为54xx系列单片机内置晶振(REFO),所以