MSP430FR5994LannchPad开发笔记之二:时钟系统及配置
一、 MSP430FR5994时钟模块简介
时钟系统模块支持低系统成本和低功耗。使用三个系统时钟信号,用户可以选择性能和功耗的最佳平衡。时钟模块可以配置为在没有任何外部组件的情况下运行,只需一个或两个外部晶体,或使用谐振器,这些都可以通过软件配置实现。
1.1 时钟系统模块包括以下时钟源:
• LFXTCLK: 低频振荡器,可用于低频 32768-Hz 时钟、晶体、标准晶体、谐振器或50 kHz 及以下的外部时钟源。在旁路模式下,LFXTCLK 可以由外部方波信号驱动。
• VLOCLK: 内部超低功耗低频振荡器,典型频率为 10kHz。
• DCOCLK: 具有可选频率的内部数字控制振荡器 (DCO)。
• MODCLK: 内部低功耗振荡器,典型频率为 5 MHz。 LFMODCLK 是 MODCLK 分频通过 128。
• HFXTCLK: 高频振荡器,可与标准晶体或谐振器一起使用4MHz - 24MHz 范围。在旁路模式下,HFXTCLK 可以通过外部方波驱动。
1.2 时钟模块提供四个系统时钟信号:
• ACLK: 辅助时钟。 ACLK 可通过软件选择为 LFXTCLK、VLOCLK 或 LFMODCLK。时钟
可以被 1、2、4、8、16 或 32 分频。ACLK 通过软件配置,可由各外设独立使用。
• MCLK: 主时钟。 MCLK 可通过软件选择为 LFXTCLK、VLOCLK、LFMODCLK、DCOCLK、
MODCLK 或 HFXTCLK。 MCLK 可以被 1、2、4、8、16 或 32 分频。MCLK由CPU和系统使用。
• SMCLK: 子系统主时钟。 SMCLK 可通过软件选择为** LFXTCLK、VLOCLK、LFMODCLK、
DCOCLK、MODCLK 或 HFXTCLK**。 SMCLK 可由各个外围模块通过软件选择。
• MODCLK:模块时钟。 MODCLK 可被各种外围模块使用,并由MODOSC驱动。
• VLOCLK: VLO 时钟。 VLOCLK 也可以由各种外围模块直接使用,并且来源
通过 VLO。
如上图所示,左侧为时钟源,右侧为上四个为时钟信号。
二、 driveLib库cs模块简介
2.1 函数简介
2.1.1 CS_setExternalClockSource()
void CS_setExternalClockSource(uint32_t LFXTCLK_frequency, uint32_t HFXTCLK_frequency) ==
设置外部时钟源的频率 ,单位HZ。
2.1.2 CS_initClockSignal()
void CS_initClockSignal (uint8_t selectedClockSignal, uint16_t clockSource, uint16_t clockSourceDivider)
初始化时钟信号,使用此函数可以确定每一个时钟信号的时钟源、分频系数
selectedClockSignal可用参数:
- CS_ACLK
- CS_MCLK
- CS_SMCLK
- CS_MODOSC
clockSource可用参数:
- CS_VLOCLK_SELECT
- CS_DCOCLK_SELECT - [Not available for ACLK]
- CS_LFXTCLK_SELECT
- CS_HFXTCLK_SELECT - [Not available for ACLK]
- CS_LFMODOSC_SELECT
- CS_MODOSC_SELECT - [Not available for ACLK]
clockSourceDivider 可用参数:
- CS_CLOCK_DIVIDER_1 - [Default for ACLK]
- CS_CLOCK_DIVIDER_2
- CS_CLOCK_DIVIDER_4
- CS_CLOCK_DIVIDER_8 - [Default for SMCLK and MCLK]
- CS_CLOCK_DIVIDER_16
- CS_CLOCK_DIVIDER_32
2.1.3 打开或关闭时钟信号
外部低速时钟
void CS_turnOnLFXT (uint16_t lfxtdrive)
bool CS_turnOnLFXTWithTimeout (uint16_t lfxtdrive, uint32_t timeout)
void CS_turnOffLFXT (void)
外部高速时钟
void CS_turnOnHFXT (uint16_t hfxtdrive)
bool CS_turnOnHFXTWithTimeout (uint16_t hfxtdrive, uint32_t timeout)
void CS_turnOffHFXT (void)
SMCLK
void CS_turnOffSMCLK (void)
void CS_turnOnSMCLK (void)
VLO
void CS_turnOffVLO (void)
2.1.4 设置DCO时钟频率
void CS_setDCOFreq (uint16_t dcorsel, uint16_t dcofsel)
通过dcorsel和dcofsel相关寄存器位的设置,决定DCO的频率。参数都有宏定义以及对应的时钟选项。
2.1.5 外部时钟旁路
设置外部时钟,在调用下面的函数前,需要首先调用**CS_setExternalClockSource()**函数设置对应时钟的频率。
void CS_bypassLFXT (void)
void CS_bypassHFXT (void)
bool CS_bypassHFXTWithTimeout (uint32_t timeout)
2.1.6 使能或失能时钟请求
void CS_enableClockRequest (uint8_t selectClock)
void CS_enableClockRequest (uint8_t selectClock)
可用参数
- CS_ACLK
- CS_MCLK
- CS_SMCLK
- CS_MODOSC
2.1.7 获取时钟的频率
使用一下函数分别获取各自时钟信号的时钟频率,单位Hz。
uint32_t CS_getACLK (void)
uint32_t CS_getSMCLK (void)
uint32_t CS_getMCLK (void)
2.1.8 错误标志及清除
uint8_t CS_getFaultFlagStatus (uint8_t mask)
void CS_clearFaultFlag (uint8_t mask)
可用参数
- CS_LFXTOFFG - LFXT oscillator fault flag
- CS_HFXTOFFG - HFXT oscillator fault flag
清除所有振荡器标志
uint16_t CS_clearAllOscFlagsWithTimeout (uint32_t timeout)
三、cs配置
3.1 系统上电及复位后的时钟默认配置
系统上电后,默认时钟配置如下:
- LFXT 被选作 LFXTCLK 的振荡器源。 为ACLK 选择 LFXTCLK (SELAx = 0)且 ACLK 未分频 (DIVAx = 0)。
- 为MCLK 和 SMCLK (SELMx = SELSx = 3) 选择 DCOCLK,每个都除以 8(DIVMx = DIVSx = 3)。
- LFXIN 和 LFXOUT 引脚设置为通用 I/O,LFXT 保持禁用状态,直到 I/O端口配置为 LFXT 操作。
- HFXIN 和HFXOUT 引脚设置为通用I/O,HFXT 被
禁用。
测试
通过以下代码可以获取MCLK、SMCLK、ACLK三个时钟信号的频率:
printf("mclk=%ld\n",CS_getMCLK());
printf("smclk=%ld\n",CS_getSMCLK());
printf("Aclk=%ld\n",CS_getACLK());
结果:
mclk=1000000
smclk=1000000
Aclk=39062
3.2 系统配置
举例:
设置DCO为8MHz,SMCLK选择时钟源为VLO,MCLK选择时钟源为DCO。
在初始化中增加以下代码:
//Set DCO frequency to 8MHz
CS_setDCOFreq(CS_DCORSEL_1, CS_DCOFSEL_3);
//configure MCLK, SMCLK to be source by DCOCLK
CS_initClockSignal(CS_SMCLK,CS_VLOCLK_SELECT,CS_CLOCK_DIVIDER_1);
CS_initClockSignal(CS_MCLK,CS_DCOCLK_SELECT,CS_CLOCK_DIVIDER_1);
结果如下:
mclk=8000000
smclk=10000
Aclk=39062
3.3 使用外部低速时钟作为ACLK时钟源配置步骤如下:
/*
* Select Port J
* Set Pin 4, 5 to input Primary Module Function, XT1.
* 不同的芯片,引脚可能有差异,此代码来源于FR57**
*/
GPIO_setAsPeripheralModuleFunctionInputPin(
GPIO_PORT_PJ,
GPIO_PIN4 + GPIO_PIN5,
GPIO_PRIMARY_MODULE_FUNCTION
);
//Initialize ACLK=XT1 and no CLK DIVIDER set to 1
CS_initClockSignal(CS_ACLK,CS_XT1CLK_SELECT,CS_CLOCK_DIVIDER_1);
//Set XT1 frequency
CS_setExternalClockSource(32768,0);
//Start XT1 external crystal
CS_turnOnXT1(CS_XT1_DRIVE_0);
SFR_clearInterrupt(SFR_OSCILLATOR_FAULT_INTERRUPT);
// Now that XT1OSC is running, enable fault interrupt
SFR_enableInterrupt(SFR_OSCILLATOR_FAULT_INTERRUPT);
–END。