一、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