[资料分享] MSP430F169单片机编程基础——(二)基本时钟系统

fish001   2017-11-9 22:04 楼主
二、 基本时钟系统

    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单片机的基本时钟系统寄存器

寄存器名称
寄存器缩写
DCO控制寄存器
DCOCTL
基本时钟系统控制寄存器1
BCSCTL1
基本时钟系统控制寄存器2
BCSCTL2
(一) 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: 选择最高的标称频率
360截图20171109220340152.jpg
(三) 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;
}


回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复