MSP430F169单片机编程基础——(二)基本时钟系统
[复制链接]
二、 基本时钟系统 Basic Clock System MSP430F169单片机的基本时钟系统由高速晶体震荡器,低速晶体震荡器,数字控制震荡器等部件构成。各个震荡器产生的时钟信号可以通过软件的设置分配到 ACLK,MCLK,SMCLK三路重要的时钟信号通道上。 一般来说,单片机的时钟系统必须满足下列要求 ■ 高频率,用来系统硬件需求,运算和外部事件的快速响应。
■ 低频率,用于降低系统的电流消耗。 ■ 稳定的频率,以满足定时的需要,例如RTC 实时时钟。 注意:下面基本时钟系统所提及的寄存器,控制方式等只适用于MSP430F169单片机。 时钟源概述 基本时钟模块包括 3个时钟输入源: 1. LFXT1CLK 默认工作在低频模式(32.768kHz)手表晶振 也可以通过外接450kHz~8MHz的高速晶体振荡器或谐振器工作在高频模式。 2. XT2CLK 可选择的高频振荡器,可以通过标准的晶体振荡器、谐振器或外接 450kHz~8MHz的时钟源工作。 3. DCOCLK 内部数控RC 振荡器。
时钟信号概述 通过这些基本的时钟模块,我们可以得到3个有用的时钟信号: 1. ACLK辅助时钟(Auxillary Clock) ACLK是LFXT1CLK时钟源经1、2、4、8分频后得到的。 ACLK可由软件选择作为各个外围模块的时钟信号,一般用于低速外设。 2. MCLK主系统时钟(Main System Clock) MCLK可由软件选择来自LFXT1CLK、XT2CLK、DCOCLK三者之一,然后经 1、2、4、8分频。 MCLK通常用于 CPU运行,程序的执行和其他使用到高速时钟的模块。 3. SMCLK子系统时钟(Sub System Clock) SMCLK可由软件选择来自XT2CLK或DCOCLK,然后经 1、2 、4、8分频。 SMCLK通常用于高速外围模块。 时钟源 1. 低速晶体震荡器(LFXT1) 手表晶振(32.768kHz)经过XIN和XOUT引脚直接连接到单片机,不需要其他外部器件 (内部有 12pF的负载电容)。此时LFXT1振荡器工作于低频模式(XTS=0) 。 如果单片机外接高速晶体振荡器或谐振器时,OSCOFF=0 可使 LFXT1 振荡器工作于高频模式(XTS=1) 。此时高速晶体振荡器或谐振器经过 XIN和 XOUT引脚连接,并且需要外接电容,电容的大小根据晶体振荡器或谐振器的特性来选择。 如果LFXT1CLK信号没有用作SMCLK或 MCLK信号,可用软件将 OSCOFF=1以禁止 LFXT1工作以减少单片机耗电。 2. 高速晶体震荡器 XT2 振荡器产生 XT2CLK 时钟信号,它的工作特性与 LFXT1 振荡器工作在高频模式时类似。如果XT2CLK没有用作MCLK和SMCLK时钟信号,可用控制位 XT2OFF 禁止 XT2振荡器。 3. 数控震荡器 单片机的XT2振荡器产生的时钟信号可以经过 1、2、4、8分频后当作系统主时钟 MCLK。当振荡器失效时,DCO振荡器会被自动选为MCLK的时钟源。 DCO 振荡器的频率可由软件对 DCOx、MODx 和 RSELx 位的设置来调整。当 DCOCLK 信号没有用作SMCLK和MCLK时钟信号时,可以用控制位 SCG0禁止直流发生器。 在 PUC 信号之后,DCOCLK 被自动选作 MCLK 时钟信号,根据需要,MCLK 的时钟源可以另外设置为LFXT1或者XT2。设置顺序如下: (1) 让OSCOFF=1 (2) 让OFIFG=0 (3) 延时等待至少50us (4) 再次检查 OFIFG,如果OFIFG=1,重复(3)、(4)步骤,直到 OFIFG=0为止。 基本时钟寄存器 MSP4630F169单片机的基本时钟系统寄存器
(一) DCOCTL DCO控制寄存器
DCOx: DCO频率选择 用来选择8种频率,可分段进行调节 DCOCLK频率。该频率是建立在RSELx选定的频段上。 MODx:DAC 调制器设定 控制切换DCOx和DCOx+1选择的两种频率,来微调 DCO的输出频率。 如果DCOx 常数是7,表示已经选择最高频率,此时MODx 失效,不能用来进行频率调整。 (二) BCSCTL1 基本时钟系统控制寄存器 1
XT2OFF:XT2高速晶振控制 此位用于控制 XT2振荡器的开启与关闭。 0: XT2高速晶振开 1: XT2高速晶振关 XTS:LFXT1高速/低速模式选择 0: LFXT1工作在低速晶振模式(默认) 1: LFXT1工作在高速晶振模式 DIVAx:ACLK分频选择 0: 不分频 1: 2分频 2: 4分频 3: 8分频 XT5V:不使用 通常此位复位XT5V=0 RSELx:DCO震荡器的频段选择 该3位控制某个内部电阻以决定标称频率。 0: 选择最低的标称频率 ...... 7: 选择最高的标称频率 (三) BCSCTL2 基本时钟系统控制寄存器 2
SELMx:选择MCLK时钟源 0: MCLK时钟源为DCOCLK(默认) 1: MCLK时钟源为DCOCLK 2: MCLK时钟源为XT2CLK 3: MCLK时钟源为LFXT1CLK DIVMx:选择MCLK分频 0: 不分频(默认) 1: 2分频 2: 4分频 3: 8分频 SELS:选择SMCLK时钟源 0: SMCLK时钟源为DCOCLK(默认) 1: SMCLK时钟源为XT2CLK DIVSx:选择SMCLK分频 0: 不分频(默认) 1: 2分频 2: 4分频 3: 8分频 DCOR:选择DCO震荡电阻 0: 内部电阻 1: 外部电阻
基本时钟范例 // 设ACLK=MCLK=LFXT1=HF,将MCLK通过P5.4输出 #include void main(void) { unsigned int i; WDCTL = WDTPW + WDTHOLD; // 停看门狗 P5DIR |= 0x10; // P5.4设置为输出状态 (00010000B) P5SEL |= 0x10; // P5.4设置为第二功能口(00010000B),即MCLK BCSCTL1 |= XTS; // ACLK = LFXT1 = HF模式 (can't understand it) do { IFG1 &= ~OFIFG; // 清除振荡器失效标志,~ 为按位取反 for(i = 0Xff;i > 0;i--); // 从0加到256,软件延时,稳定时间 } while((IFG1 & OFIFG) != 0); // 如果振荡器失效标志存在 (can't understand it) BCSCTL2 |= SELM1 + SELM0; // MCLK = LFXT1 (can't understand it) While(1){_NOP();} (can't understand it) } // 时钟设置函数 // 系统时钟设定 // DCO设置为 3030KHz // ACLK 为 LFXT1(低频模式) // MCLK 为 XT2CLK // SMLCK为XT2CLK void BCSInit (void) (can't understand it) { DCOCTL = 0x60 + 0x00; BCSCTL1 = DIVA_0 + 0x07; BCSCTL2 = SELM_2 + DIVM_0 + SELS + DIVS_0; }
|