写完这篇文章过了两天我才知道原来把官方例程下载下来可以用图形界面设置时钟。我是🐷

简介

MSP430有三个时钟,分别是MCLK、SMCLK、ACLK。

  • MCLK:主系统时钟。MCLK是CPU的运行时钟,MCLK频率越高,CPU运行越快,同时功耗越高。
  • SMCLK:子系统时钟。SMCLK可以提供给需要高速时钟的外设(如ADC、定时器。
  • ACLK:辅助时钟。辅助时钟的频率一般很低,功耗小,可以一直开启。 这三个时钟可由五个时钟源经过分频后提供,分别是XT1CLK、XT2CLK、VLOCLK、REFCLK、DCOCL。
  • XT1CLK(低频/高频时钟源):XT1CLK可以作为内部FLL模块的参考时钟,且它是FLL模块(频锁环模块)的默认参考时钟。FLL时钟除锁频之外还可以对时钟进行倍频或分频。
  • XT2CLK(高频时钟源):XT2CLK可以作为FLL的内部参考时钟。
  • VLOCLK(低频内部时钟源)
  • REFCLK(低频时钟源,内部的参考时钟源):可以作为内部FLL的参考时钟。
  • DCOCLK(片内数字控制时钟源):通过内部FLL模块稳定,一般为1MHz。
    其中XT1CLK、XT2CLK可由外部晶振提供。片内时钟源受温度影响大,频率一般不会很准确。

设置MSP430F5529的时钟

目的是将MCLK、SMCLK设置为XT2CLK(外部晶振 4Mhz)经过倍频后得到的24Mhz时钟;将ACLK设置为XT1CLK(外部晶振 32.768Khz)。 芯片的默认电压低,不足以支持高速的时钟频率,所以首先提升电压:

PMM_setVCore(PMM_CORE_LEVEL_3);

设置XT1CLK与XT2CLK引脚为复用功能:

GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5,GPIO_PIN4 + GPIO_PIN5);  
GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5,GPIO_PIN2 + GPIO_PIN3);

设置XT1CLK与XT2CLK外接晶振的频率:

UCS_setExternalClockSource(32768,4000000);

开启XT1CLK与XT2CLK:

UCS_turnOnLFXT1WithTimeout(UCS_XT1_DRIVE_0,UCS_XCAP_3,50000);  
UCS_turnOnXT2WithTimeout(UCS_XT2_DRIVE_4MHZ_8MHZ,50000);

将XT1CLK作为ACLK时钟源,XT2CLK作为FLL参考时钟源:

UCS_initClockSignal(UCS_ACLK,UCS_XT1CLK_SELECT,UCS_CLOCK_DIVIDER_1)  
UCS_initClockSignal(UCS_FLLREF,UCS_XT2CLK_SELECT,UCS_CLOCK_DIVIDER_1);

提升MCLK的频率:

UCS_initFLLSettle(24000, 6); // 6*4Mhz = 24Mhz

最后开启时钟源中断:

SFR_clearInterrupt(SFR_OSCILLATOR_FAULT_INTERRUPT);  
SFR_enableInterrupt(SFR_OSCILLATOR_FAULT_INTERRUPT);

但我还有一个疑问,就是为什么不用使用UCS_initClockSignal函数将XT2CLK作为MCLK和SMCLK的时钟源,或者说将FLL参考时钟源设置为MCLK和SMCLK的时钟。我不这么做MCLK和SMCLK照样会被设置为XT2CLK倍频后的时钟。如果有大神知道原因,希望能留评论告诉我。

完整代码

clock.h

#ifndef __CLOCK_H__  
#define __CLOCK_H__  
  
#include "driverlib.h"  
  
#define UCS_XT1_TIMEOUT 50000  
#define UCS_XT2_TIMEOUT 50000  
  
#define UCS_XT1_CRYSTAL_FREQUENCY 32768  
#define UCS_XT2_CRYSTAL_FREQUENCY 4000000  
  
#define UCS_MCLK_DESIRED_FREQUENCY_IN_KHZ 24000  
#define UCS_MCLK_FLLREF_RATIO 6  
  
void Clock_Init(void);  
  
#endif

clock.c

#include "clock.h"  
  
void Clock_Init(void)  
{  
    PMM_setVCore(PMM_CORE_LEVEL_3);  
  
    GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5,GPIO_PIN4 + GPIO_PIN5);  
  
    UCS_setExternalClockSource(UCS_XT1_CRYSTAL_FREQUENCYUCS_XT2_CRYSTAL_FREQUENCY);  
  
    UCS_turnOnLFXT1WithTimeout(UCS_XT1_DRIVE_0,UCS_XCAP_3,UCS_XT1_TIMEOUT);  
  
    GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5,GPIO_PIN2 +GPIO_PIN3);  
  
    UCS_turnOnXT2WithTimeout(UCS_XT2_DRIVE_4MHZ_8MHZ,UCS_XT2_TIMEOUT);  
  
    UCS_initClockSignal(UCS_ACLK,UCS_XT1CLK_SELECT,UCS_CLOCK_DIVIDER_1);  
  
    UCS_initClockSignal(UCS_FLLREF,UCS_XT2CLK_SELECT,UCS_CLOCK_DIVIDER_1);  
  
    UCS_initClockSignal(UCS_MCLK, UCS_XT2CLK_SELECT, UCS_CLOCK_DIVIDER_1);  
    UCS_initClockSignal(UCS_SMCLK, UCS_XT2CLK_SELECT, UCS_CLOCK_DIVIDER_1);  
  
    UCS_initFLLSettle(UCS_MCLK_DESIRED_FREQUENCY_IN_KHZ,UCS_MCLK_FLLREF_RATIO);  
  
    SFR_clearInterrupt(SFR_OSCILLATOR_FAULT_INTERRUPT);  
    SFR_enableInterrupt(SFR_OSCILLATOR_FAULT_INTERRUPT);  
}

参考资料

MSP430x5xx and MSP430x6xx Family User’s Guide
MSP430F5529 LaunchPad Development Kit (MSP-EXP430F5529LP) User’s Guide (Rev. D)