This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

请教MSP430F5438A 系统晶振配置

Other Parts Discussed in Thread: MSP430F5438

最近才学MSP430,对系统晶振的配置不太清楚,请教几个问题,

1、使用5438A的XT1为晶振源,晶振为:3.6864MHz,MLCK选用XT1为晶振源4分频,SMCLK选用XT1晶振源1分频,并在P4.7输出提供外部,我编写代码如下

// 初始化 LFXT1
  P7SEL |= 0x03;                            // Select XT1
  UCSCTL6 &= ~(XT1OFF);                     // XT1 On
  UCSCTL6 |= XTS;
  // 循环等待 XT1 故障标志清除,XT1振动稳定
  do
  {
    UCSCTL7 &= ~XT1LFOFFG;                  // 清除 XT1 故障标志
  }while (UCSCTL7&XT1LFOFFG);               // 测试 XT1 故障标志

  __bis_SR_register(SCG0);                  // 停止 FLL 控制回路
  UCSCTL0 = 0x0000;                         //
  UCSCTL1 = DCORSEL_4;                      //
  UCSCTL2 = FLLD_1+FLLN1_L;
  UCSCTL3 = SELREF__XT1CLK+FLLREFDIV_2;                         //FLL选择XT1时钟源 1分频
  UCSCTL4 = SELM__XT1CLK+SELS__XT1CLK+SELA__XT1CLK;             //ACLK、SMLCK、MLCK择XT1时钟源
  UCSCTL5 =DIVM_2+DIVS_0+DIVA_2+DIVPA_2;                           //ACLK、SMLCK 一分频输出、MLCK 4分频输出
  UCSCTL6 &= ~(SMCLKOFF_L);                    //打开SMCLK
  P4SEL |= 0x80;                            //输出SMCLK
  P4DIR |= 0x80;                            //输出SMCLK
  __bic_SR_register(SCG0);                  // Enable the FLL control loop

请大虾们看看有无问题或给一分详细的程序代码,

2、5438A晶振配置系统中,如果不用到FLL环节(如上),UCSCTL0、UCSCTL1、UCSCTL2、UCSCTL3 是不是可以不用设置,或者关闭FLL,我测试发现如果UCSCTL1不设置,系统的晶振就不正常,请指教。

  • MSP430F5438时钟系统 要了解一款芯片,最直观的就是官方给的芯片的特点(FEATURES);要用好一款芯片,就必须从数据手册了解芯片的各个功能;要开发一款芯片,我们就不许从最基本的时钟系统出发。本文着重介绍下MSP430F5438的时钟系统,也是整个5系列的时钟系统,这是我接触的第一款430芯片,如有错误,欢迎指正。

    统一时钟系统( Unified Clock System (UCS) )为芯片提供不同的时钟,下图可以看出:5438有4个时钟系统,分别是辅助时钟(ACLK),主时钟(MCLK),子系统时钟(SMCLK),以及专用时钟(MODCLK)。 首先看看这些时钟的来源。

    除了专用时钟外,他们都可以来至XT1CLK,VLOCLK,REFOCLK,DCOCLK,DCOCLKDIV,XT2CLK,只需要配置对应的寄存器即可应需选择。其中,XT1CLK来至外部的XIN和XOUT管脚通过OSC寄存器得到,通常用32768Hz晶振;VLO(Very-Low-Power Low-Frequency Oscillator)和REFO(Low-FrequencyReference Oscillator)直接由OSC寄存器产生(属于内部时钟);DCOCLK(Digitally-Controlled Oscillator)和DCOCLKDIV(DCO分频得到)来至FLL(FrequencyLocked Loop)寄存器(属于内部数字时钟);XT2CLK来至外部的XT2IN和XT2OUT管脚。

    在5438芯片PUC(Power up clear)即上电清除过后,UCS(Unified Clock System)默认配置为: 1.

    • XT1 工作在 LF(Low-Frequency)模式 作为ACLK(与第5条冲突,但手册就是这么写的,我也不懂); 2.

    • DCOCLKDIV 作为 MCLK; 3.

    • DCOCLKDIV 作为 SMCLK; 4.

    • FLL 工作,而且 XT1CLK 作为FLL的参考时钟(FLLREFCLK); 5.

    •XTIN和XTOUT若不配置则作为通用I/O口,XT1禁止;配置后才作为XT1; 6.

    • XT2IN和XT2OUT作为通用I/O口,XT2禁止。

    那么现在就开始配置时钟了。我就选其中一个时钟MCLK(主时钟)的配置讲解,其他的时钟大同小异。

    要得到MCLK就得配置上图的寄存器(调整模块)。需要配置的有DIVM(分频选择),SELM(时钟源选择),CPUOFF(关闭CPU,因为是主时钟,所以关闭MLCK就相当于关闭CPU),MCLK_REQEN(MCLK conditional requests条件要求使能),MCLK_REQ(不需要配置,从手册上看作用是:外围模块如果需要其正确的运作需要它自动从UCS模块调整,而不管当前的操作模式)。

    下面再讲讲内部时钟源VLO和REFO以及DCO,MODOSC。

    REFO是内建的参考时钟,它很稳定,一般作为FLL的时钟基准。MSP430F5438上的REFOCLK是32768Hz。

    MODOSC是个专用时钟(我知道可以用在AD采样上),大概5MHz(不知道为什么手册上没有他的资料)。 VLO是一个内建的低频时钟。在5438上,它的频率是6-14kHz。 DCO是Digitally-ControlledOscillator,数控晶振。它可以通过FLL产生频率很高而且比较稳定的时钟。通过配置FLL,它甚至可以产生百兆以上的时钟信号。FLL是FrequencyLocked Loop,锁频环。它能通过反馈稳定DCO的输出,下图是它的框图: 首先它需要一个参考,可以是XT1,XT2,REFO的其中一个,当启用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为REFO,XT1或XT2的实际频率。

    时钟系统差不多就这些了,看起来复杂其实挺简单的,自己在板子上动手试试才能了解 到底哪块还没有理解透彻,下面贴出我自己的5438时钟配置。 #include "msp430.h"int main( void ){

    // Stop watchdog timer to prevent time out reset

    WDTCTL = WDTPW + WDTHOLD;

    P11DIR = BIT2 + BIT1 + BIT0;

    // P11.2,1,0 to output direction

    P11SEL = BIT2 + BIT1 + BIT0;

    // P11.2 to output SMCLK, P11.1

    // to output MCLK and P11.0 to

    // output ACLK

    //ACLK = REFO = 32kHz, MCLK = SMCLK = 25MHz

    UCSCTL3 |= SELREF__REFOCLK;

    // Set DCO FLL reference = REFO

    UCSCTL4 |= SELA__REFOCLK;

    // 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

    while(1);

    // Loop in place

    return 0;}
  • www.ti.com.cn/.../MSP430F5438A
    www.ti.com/.../SLAC375
    现在好多了,TI在每个芯片主页下面提供了例子
  • 这个XT1的用法,你这里有些问题。

    XT1作为Low-Frequency Mode时,一般接32.768k,最大不超过50k

    作为High-Frequency Mode时,有5种配置模式,详情见http://www.ti.com/cn/lit/ds/symlink/msp430f5438a.pdf中第23页。

    使用外部高速晶振时,一般使用HF0~HF3四种配置模式中的一种,但这时支持的外部晶振最低频率时4MHz。