MSP430-USC(二)

一、USC介绍

USC即Unified Clock System,统一时钟系统。我个人理解类似于STM32中的SYS时钟树,只不过这里叫做USC时钟模块。

通过翻阅用户手册可以知道该模块有五个可用的时钟源,分别是VLO, REFO, XT1, XT2 和 DCO。可输出三个时钟信号,分别是MCLK, SMCLK, ACLK,在开发板的原理图上可以找到对应的引脚。

5529中分别ACLK-P1.0,SMCLK-P2.2,MCLK-P7.7

那么五个时钟源分别是什么意思呢?
VLO(very low oscillator)-内置超低功率低频振荡器
REFO(reference oscillator)-32KHZ的参考振荡器
XT1-低频时钟源。有外接晶体振荡器,而无需外接振荡电容。经典值为32768HZ,主要给ACLK提供低频时钟信号,也可以接4MHZ-8MHZ.
XT2-高频时钟源。可接4MHZ-32MHZ的标准晶体
DCO-内部数字可控振荡器。通过频率锁相环FTT来设置频率。

下面是摘自数据手册的USC BLOCK Diagram
在这里插入图片描述

下面通过一个例程来介绍系统时钟的配置:
系统时钟的频率配置同时也需要配置电压。
在这里插入图片描述
在这里插入图片描述

#include "driverlib.h"
//*****************************************************************************
//
//Target frequency for MCLK in kHz
//
//*****************************************************************************
#define UCS_MCLK_DESIRED_FREQUENCY_IN_KHZ   1000

//*****************************************************************************
//
//MCLK/FLLRef Ratio
//
//*****************************************************************************
#define UCS_MCLK_FLLREF_RATIO   30

//*****************************************************************************
//
//Variable to store current Clock values
//
//*****************************************************************************
uint32_t clockValue = 0;

//*****************************************************************************
//
//Variable to store status of Oscillator fault flags
//
//*****************************************************************************
uint16_t status;

void main (void)
{
    //Stop WDT
    WDT_A_hold(WDT_A_BASE);

    //Set VCore = 1 for 12MHz clock
    PMM_setVCore(PMM_CORE_LEVEL_1);

    //Set P1.0 to output direction
    GPIO_setAsOutputPin(
        GPIO_PORT_P4,
        GPIO_PIN7
        );

    //ACLK, MCLK, MCLK set out to pins
    GPIO_setAsPeripheralModuleFunctionOutputPin(
        GPIO_PORT_P2,
        GPIO_PIN2
        );

    //Set DCO FLL reference = REFO
    UCS_initClockSignal(
        UCS_FLLREF,
        UCS_REFOCLK_SELECT,
        UCS_CLOCK_DIVIDER_1
        );
    //Set ACLK = REFO
    UCS_initClockSignal(
        UCS_ACLK,
        UCS_REFOCLK_SELECT,
        UCS_CLOCK_DIVIDER_1
        );

    //Set Ratio and Desired MCLK Frequency  and initialize DCO
    UCS_initFLLSettle(
        UCS_MCLK_DESIRED_FREQUENCY_IN_KHZ,
        UCS_MCLK_FLLREF_RATIO
        );

    // Enable global oscillator fault flag
    SFR_clearInterrupt(SFR_OSCILLATOR_FAULT_INTERRUPT);
    SFR_enableInterrupt(SFR_OSCILLATOR_FAULT_INTERRUPT);

    // Enable global interrupt
    __bis_SR_register(GIE);

    //Verify if the Clock settings are as expected
    clockValue = UCS_getSMCLK();
    clockValue = UCS_getMCLK();
    clockValue = UCS_getACLK();

    while (1)
    {
        //Toggle P1.0
        GPIO_toggleOutputOnPin(
            GPIO_PORT_P4,
            GPIO_PIN7
            );

        //Delay
        __delay_cycles(1000000);
    }
}


#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=UNMI_VECTOR
__interrupt
#elif defined(__GNUC__)
__attribute__((interrupt(UNMI_VECTOR)))
#endif
void NMI_ISR(void)
{
  do {
    // If it still can't clear the oscillator fault flags after the timeout,
    // trap and wait here.
    status = UCS_clearAllOscFlagsWithTimeout(1000);
  } while(status != 0);
}


我们只需要修改宏定义中的UCS_MCLK_DESIRED_FREQUENCY_IN_KHZ,UCS_MCLK_FLLREF_RATIO即可。

这里设置的1MHZ,所以UCS_MCLK_FLLREF_RATIO为1000000/32768

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值