MSP430FR5994LannchPad开发笔记之二:时钟系统及配置

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。

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值