数字系统都需要时钟的驱动,单片机也不例外,基本时钟模块为MSP430x2xx器件提供时钟。
8.1 基本时钟模块介绍
基本时钟模块支持低系统成本和超低功耗,它使用三个内部时钟信号,用户可以在性能和低功耗上选择最好的平衡。基本时钟模块+可被设置运行于无任何外部器件、只有一个外部电阻、有一个或两个外部晶振、或者有谐振器的情形下。这些设置完全可以用软件控制。基本时钟模块包含2个、3个或4个时钟源:
·LFXT1CLK:低频/高频振荡器,可使用低频手表晶振或32768Hz的外部时钟源或标准晶振、谐振器或频率范围为400KHz至16MHz的外部时钟源。
·XT2CLK:可选的高频振荡器,可使用标准晶振、谐振器、或频率范围为400KHz至16MHz的外部时钟源。目前的MSP430G系列单片机不支持该高频振荡器,也即在MSP430G系列单片机的内部没有该高频振荡器部分。
·DCOCLK: 内部数字控制的振荡器。
·VLOCLK: 内部甚低功耗、低频振荡器,典型频率为12KHz。
从基本时钟模块+可以得到三个时钟信号MCLK、SMCLK和ACLK。
·MCLK (Master Clock)为主时钟,可以通过软件在LFXT1CLK、VLOCLK、XT2CLK(如果有的话)、或DCOCLK中选择,作为MCLK的时钟源,MCLK可以进行1,2,4,8分频。MCLK是专为CPU运行提供的时钟,MCLK配置的频率越高,CPU的执行速度就越快。MCLK一般都设置在1MHz以上,以发挥CPU的性能;一旦关闭MCLK,CPU也随之停止工作。CPU是系统中耗电较大的部件之一,但大部分应用中都只有少数时间需要CPU运算。因此,在超低功耗系统中都通过间歇开启MCLK(唤醒CPU)的方式来降低功耗。
·SMCLK(Sub-System MasterClock)为子系统时钟,可以通过软件在LFXT1CLK、VLOCLK、XT2CLK(如果有的话)、或DCOCLK中选择,作为SMCLK的时钟源,SMCLK可以进行1,2,4,8分频。单片机内部某些模块(如定时器、ADC等)需要高速时钟,SMCLK为这些需要高速运行的模块提供时钟源,而且SMCLK是独立于MCLK的,当关闭主时钟MCLK让CPU停止工作时,子系统时钟SMCLK仍然可以开启,从而让相关的外设继续工作。
·ACLK (Auxiliary Clock)为辅助时钟,可以通过软件在LFXT1CLK或VLOCLK中选择,作为ACLK的时钟源,ACLK可以进行1,2,4,8分频。ACLK的频率很低,可以用软件选择用于各个外围模块,特别是那些只需要低频时钟的片内外设。ACLK在单片机运行过程中一般不关闭,它被用于产生节拍时基,或者和定时器配合间歇唤醒CPU。
时钟系统中,对上述三种时钟不同程度的关闭,就可以实现不同的休眠模式。关闭的时钟越多,休眠的越深。当全部的时钟,包括ACLK也被关闭的时候,功耗降到最低,只有0.1uA。
图8.1为基本时钟模块的方框图,它表明了ACLK、MCLK及SMCLK的时钟源及分频情况。
图8.1 基本时钟模块的方框图
8.2 基本时钟模块的运作
上电清除(PUC)后,MCLK和SMCLK源自DCOCLK,频率为1.1MHz。ACLK源自LFXT1CLK,处于低频模式,它使用一个6pF的内部负载电容。
状态寄存器的控制位SCG0,SCG1,OSCOFF和CPUOFF设置MSP430的运行模式,并且使能或禁用基本时钟模块+的某些部分。DCOCTL、BCSCTL1、 BCSCTL2和 BCSCTL3寄存器设置基本时钟模块+。在程序执行的任何时间都可以用软件来设置或重新设置基本时钟模块+。
8.2.1基本时钟模块用于低功耗应用的特点
在电池供电的应用中,存在典型的冲突要求:
·低频率时钟用于能量节省和计时(time keeping)
·高频率时钟用于对事件快速反应和快速的突发处理能力
·在运行温度和供电电压下,时钟稳定
通过允许用户在三个可以得到的时钟信号:ACLK、MCLK和SMCLK中选择,基本时钟模块+能够处理上述的冲突需求。为了理想的低功耗性能,ACLK可被源自于一个低功耗的32768Hz手表晶振(如果有的话),从而为系统和低功耗的待机运行提供一个稳定的时基。当不需要晶体精确计时时,也可以从内部低频振荡器获得ACLK。MCLK可被设置为从片上DCO获得,当中断驱动事件有需求时,MCLK可被激活。根据外围模块需求,SMCLK可被设置为从晶振或DCO获得。基本时钟模块提供一个灵活的时钟分配和分频系统,用来细调各个时钟的需求。
8.2.2内部甚低功耗低频振荡器(Internal Very-Low-Power Low-Frequency Oscillator,VLO)
无需晶振,内部甚低功耗低频振荡器(VLO)提供一个典型的12KHz频率。当XTS=0时,设置LFXT1Sx=10,则VLO被选择为时钟源。在低功耗LPM4时,OSCOFF位关闭VLO。当VLO被选择时,LFXT1晶振被禁用,以减少电流消耗。VLO不被使用时不消耗能量。
8.2.3 LFXT1振荡器
在低频模式下(XTS=0),LFXT1振荡器使用一个32768Hz手表晶振,LFXT1振荡器支持超低电流消耗。手表晶振接于XIN和XOUT,无需任何其它外部元件。软件可选的XCAPx位为低频模式的LFXT1晶振设置内部提供的负载电容,这一电容的典型值可被选为1pF,6pF,10pF或12.5pF。如果需要,也可添加另外的外部电容。
在高频模式时(XTS=1,XCAPx=00),LFXT1振荡器也支持高速晶振或谐振器。高速晶振或谐振器连接到XIN和XOUT,并且在这两个管脚上需要外部电容。需要根据晶振或谐振器的规格要求,确定这些电容的大小。当LFXT1在高频模式时,LFXT1Sx位选择晶振的频率范围。
无论低频或高频模式,当LFXT1Sx=11,OSCOFF=0和XCAPx=00时,一个在XIN管脚上的外部时钟信号可被用作为LFXT1。当使用外部信号时,对于选择的模式,外部频率必须满足手册参数。当输入频率低于要求的低频限制时,LFXT1OF位会被置位,防止CPU以LFXT1CLK作为时钟。
如果LFXT1CLK没用于产生SMCLK或MCLK,通过置位OSCOFF,软件可以关闭LFXT1。
注意:LFXT1振荡器特点
1)取决于晶振,低频晶振通常需要几百个毫秒去开启。
2)超低功耗振荡器,例如低频模式的LFXT1,应被保护以免受其它来源的噪声耦合。晶振应放置的尽可能靠近MSP430,晶振的外壳接地,晶振的走线用地线进行保护。
8.2.4 数控振荡器(DCO,Digitally-Controlled Oscillator)
DCO是一个集成的数控振荡器。使用DCOx,MODx和RSELx位,DCO的频率可用软件进行调节。
当DCO时钟没被用于产生活跃模式的SMCLK或MCLK时,通过软件置位SCG0可以禁用DCO。
8.2.5 调整DCO频率
上电清除后,RSELx=7,DCOx=3,允许DCO从一个中等频率开始。此时,MCLK和SMCLK源自DCO时钟。因为CPU以MCLK执行代码,而MCLK源自快速启动的DCO,代码执行典型地开始于上电清除后的2uS之内。典型的DCOx和RSELx范围和台阶如图8.2所示。
DCO时钟的频率由以下功能来设置:
·4位的RSELx为DCO选择十六个标称频率(从RSEL=0到RSEL=15)范围中的一个。在器件手册中这些范围对每个器件都有定义。
图8.2 典型的DCOx范围和RSELx台阶
·3位的DCOx把RSELx位选择的DCO范围分成8个频率台阶,相互的间隔大约为10%。
·5位的MODx在DCOx位选择的频率和下一个由DCOx+1设置的更高的频率间切换。当DCOx=07h时,MODx位不再起作用,因为对于选择的RSELx范围,DCO已经在最高的设置。
每一个MSP430F2xx器件,对特定的频率有标定好的DCOCTL和BCSCTL1寄存器设置,它们保存在信息存储器的A段中。要使用标定的设置,可以把信息拷入DCOCTL和BCSCTL1寄存器。标定的设置会影响DCOx、MODx和RSELx位,并清除其它位,XT2OFF位除外,它保持置位。BCSCTL1的其它位可以根据需要用BIS.B或BIC.B指令置位或清除。
例如:
//设置DCO为1MHz
DCOCTL=0X00; //选择最低的DCOx和MODx设置
BCSCTL1=CALBC1_1MHZ; //设置范围
DCOCTL=CALDCO_1MHZ;//设置DCO台阶和调制
8.2.6 基本时钟模块故障保护操作
基本时钟模块包括一个振荡器失效故障保护功能。该功能检测LFXT1和XT2的振荡器失效,可能的失效条件为:
·LFXT1在低频模式时的低频振荡器失效(LFXT1OF)
·LFXT1在高频模式时的高频振荡器失效(LFXT1OF)
·XT2的高频振荡器失效(XT2OF)
注:LFXT1OF和XT2OF均位于寄存器BCSCTL3内。
如果相应的晶振被打开,并且没有正常运行,晶振失效位LFXT1OF和XT2OF就被置位。只要失效状态存在,失效位就保持置位。如果使能的振荡器功能正常,失效位会被自动清除。
上电复位时或者当一个振荡器失效(LFXT1OF或XT2OF)被检测到时,振荡器失效标志OFIFG被置位并被锁存。当OFIFG被置位时,MCLK源自于DCO,而且如果OFIE被置位,则OFIFG请求一个不可屏蔽中断。当中断被接受时,OFIE自动地被复位。OFIFG标志必须用软件清除。通过检查单个的失效位可以确定失效源。
如果一个产生MCLK的晶振被检测到失效,MCLK会被自动地切换至DCO作为它的时钟源,这不会改变SELMx位的设置。
8.2.7 从一个晶振产生MCLK
上电清除后,基本时钟模块+使用DCOCLK作为MCLK。如果需要,MCLK可被设为源自LFXT1或者XT2(如果能够得到LFXT1和XT2的话)。
把MCLK的时钟源从DCO时钟切换至晶振时钟(LFXT1CLK或XT2CLK)的顺序是:
- 打开晶振并选择合适的模式
- 清除OFIFG标志
- 等待至少50uS
- 检测OFIFG,并重复2到4的步骤直到OFIFG保持清除。
以下为实现上述过程的汇编编程的例子:
例8.1 选择LFXT1(高频模式)作为MCLK的时钟源
BIC.W #OSCOFF, SR ;开启LFXT1振荡器.
BIS.B #XTS,&BCSCTL1 ;选择高频模式
MOV.B#LFXT1S0,&BCSCTL3 ;选择1-3MHz的晶振
L1 BIC.B#OFIFG,&IFG1 ;清除OFIFG标志(位)
MOV.W #0FFh,R15 ;延时
L2 DEC.W R15 ;
JNZ L2 ;
BIT.B #OFIFG,&IFG1 ;重新检测OFIFG标志(位)
JNZ L1 ;如果OFIFG标志(位)不为0,则再次检测
BIS.B #SELM1+SELM0,&BCSCTL2 ;选择LFXT1CLK作为MCLK的时钟源
8.3 MCLK、SMCLK、ACLK三种时钟的基本设置方法
由上述可知,基本时钟模块可以为单片机系统提供三个时钟信号:MCLK、SMCLK、ACLK。
MCLK的默认值(单片机上电后的值)为DCOCLK。由控制寄存器BCSCTL2中的SELMx位来选择时钟源,可选择DCOCLK、LFXT1CLK或者VLOCLK。并由BCSCTL2中的DIVMx位来选择分频值,默认值为不分频。当选择DCOCLK为时钟源时,可以对其进行频率校准。
SMCLK的默认值为DCOCLK。由BCSCTL2中的SELS位来选择时钟源,可选择DCOCLK、LFXT1CLK或者VLOCLK。并由BCSCTL2中的DIVSx位来选择分频值,默认值为不分频。当选择DCOCLK为时钟源时,可以对其进行频率校准。
ACLK的默认值为32768Hz。由BCSCTL3中的LFXT1Sx位来选择时钟源,可选择32768Hz、VLOCLK或外部数字时钟。并由BCSCTL1中的DIVAx位来选择分频,默认值为不分频。
例5.2 将MCLK和SMCLK均设置为8MHz,不分频。将ACLK设为VLOCLK,不分频。
其相关程序为:
BCSCTL2 = SELM_0 | DIVM_0 | DIVS_0; //为MCLK选择DCOCLK,SMCLK使用默认值(即DCOCLK),
//MCLK和SMCLK均不分频。
DCOCTL = 0x00; //清除DCOCTL中所有的DCOx和MODx位
BCSCTL1 = CALBC1_8MHZ; //设定新的RSELx的值
DCOCTL = CALDCO_8MHZ; //设定新的DCOx和MODx的值,使DCOCLK为8MHz。
BCSCTL1 |= XT2OFF | DIVA_0; //关掉XT2,ACLK不分频
BCSCTL3 = LFXT1S_2 | XCAP_0; //为ACLK选择VLOCLK,为LFXT1晶振选择内置的1pF电容
在上述程序中,BCSCTL1、BCSCTL2、BCSCTL3为基本时钟系统的控制寄存器,DCOCTL为DCO控制寄存器,它们各个位的定义及设置方法,请参阅MSP430x2xx Family User’s Guide中对基本时钟模块部分的详细说明。
例5.3 将MCLK设置为16MHz,SMCLK 设置为8MHz。将ACLK设为使用32768Hz晶振,且4分频。
其相关程序为:
BCSCTL2 = SELM_0 | DIVM_0 | DIVS_1; //为MCLK选择DCOCLK,SMCLK使用默认值(即DCOCLK),
//MCLK不分频,对DCOCLK 2分频后得到SMCLK。
DCOCTL = 0x00; //清除DCOCTL中所有的DCOx和MODx位
BCSCTL1 = CALBC1_16MHZ; //设定新的RSELx的值
DCOCTL = CALDCO_16MHZ; //设定新的DCOx和MODx的值,使DCOCLK为16MHz。
BCSCTL1 |= XT2OFF | DIVA_2; //关掉XT2,为ACLK 4分频
BCSCTL3 =LFXT1S_0 | XCAP_0; //为ACLK选择32768Hz晶振,为LFXT1晶振选
//内置的1pF电容。
注意:如果MSP430G2的LaunchPad实验板上没有焊接32768Hz的晶振,或者没有接32768Hz的外部时钟,则不能为ACLK选择32768Hz的时钟源,只能为ACLK选择VLOCLK作为时钟源。