MSP432P401R LaunchPad教程(一):时钟配置详解

MSP432P401R LaunchPad教程(一)时钟配置

专栏目录
MSP432P401R LaunchPad教程 基于keil的开发环境
MSP432P401R LaunchPad教程(一)时钟配置
MSP432P401R LaunchPad教程(二)keil环境配置
MSP432P401R LaunchPad教程(三)滴答定时器

如何将性能拉满 配置到48MHz 具体见下文

一.时钟树

image-20221231142321017

1.七个时钟源

从官方参考手册可以看出,这个mcu的时钟信号一共有七个时钟源,意思就是说所有的时钟信号由这七个时钟源通过各种配置 (分频倍频 选择啥的)出来的

这七个时钟源是

两个外部时钟源

HFXTCLK:

高速振荡器时钟源 允许的频率范围1-MHz to 48-MHz LaunchPad上就有一个48Mhz的晶振 Q2

image-20221231143226609

LFXTCLK:

低速振荡器时钟源 允许的频率范围32KHz以下 LaunchPad上就有一个32768Hz的晶振 Q1

image-20221231143542008

五个内部时钟源

DCOCLK:

数字控制振荡器时钟源 意味着其频率可编程的 默认频率为3MHz 我们为了达到mcu最大工作频率48MHz的话 也可以用DCO当作时钟源 只要把DCO的频率编程设置为48MHz 当然没有外部晶振作为时钟源精确 我的工程文件中都用的是外部高速晶振

VLOCLK :

具有9.4-kHz典型频率的内部极低功率低频振荡器(VLO)

REFOCLK :

内部低功耗低频振荡器(REFO),可选择32.768-kHz或128kHz典型频率

MODCLK :

内部低功耗振荡器,典型频率为25 MHz

SYSOSC :

典型频率为5MHz的内部振荡器

2.五个时钟信号

MCLK

主时钟 master clk 为cpu和外设提供时钟的

其时钟源可以来自LFXTCLK, VLOCLK, REFOCLK, DCOCLK,
MODCLK, or HFXTCLK.

MCLK can be divided by 1, 2, 4, 8, 16, 32, 64, or 128.

HSMCLK

子系统主时钟 为外设提供时钟

其时钟源可以来自LFXTCLK, VLOCLK,REFOCLK, DCOCLK, MODCLK, HFXTCLK.

HSMCLK can be divided by 1, 2, 4, 8, 16, 32, 64, or 128.

SMCLK

低速子系统主时钟 为外设提供时钟

其时钟源可以来自HSMCLK 参考手册里说SMCLK的频率限制为HSMCLK额定最大频率的一半 可以我竟然能把SMCLK设置成48MHz 和HSMCLK一样不知道咋回事

image-20221231153058506

我通过这些函数观测到我设置的时钟频率 发现SMCLK也能到48MHz

image-20221231153354609

image-20221231153317898

SMCLK can be divided independently from HSMCLK by 1, 2, 4, 8, 16, 32, 64, or 128.

ACLK

辅助时钟 为外设提供时钟

其时钟源可以来自LFXTCLK, VLOCLK, or REFOCLK

ACLK canbe divided by 1, 2, 4, 8, 16, 32, 64, or 128.

BCLK

低速备用域时钟 为LPM外设提供时钟

其时钟源可以来自

3.默认时钟配置

image-20221231145435740

默认的是时钟配置都是内部时钟源

默认时钟配置是在启动文件system_msp432p401r.c里SystemInit(void)设置的 这个函数是在启动文件汇编文件里调用的 学过stm32的应该都熟悉

image-20221231152307080

可以在system_msp432p401r.c里通过修改这个宏 更改MCLK的频率 即cpu的主频 通过配置发现 HAMCLK和SMCLK也会跟着改变 所以这个宏应该是同时改变这三者频率

image-20221231151032816

二.用外部晶振作为时钟源

上文所说LaunchPad上板载着两个外部晶振 一个高速一个低速

我们就可以用其作为我们的HFXTCLK和LFXTCLK

配置函数如下

/// @brief 使用外部晶振 达到48MHz
/// @param  
void SysInit(void)
{
	//High:48MHz  Low:32768Hz
	//MCLK=48MHz  SMCLK=48MHz
    WDTCTL = WDTPW | WDTHOLD; // 停用看门狗

    /* 第一步需要配置我们的时钟引脚,这里的高速时钟使用的是外部晶振*/
    //低速时钟初始化比较慢
    MAP_GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_PJ, GPIO_PIN3 | GPIO_PIN2, GPIO_PRIMARY_MODULE_FUNCTION); //High
    MAP_GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_PJ, GPIO_PIN0 | GPIO_PIN1, GPIO_PRIMARY_MODULE_FUNCTION); //Low
    CS_setExternalClockSourceFrequency(32768, 48000000);

    /* Starting HFXT in non-bypass mode without a timeout. Before we start
     * we have to change VCORE to 1 to support the 48MHz frequency */
    MAP_PCM_setCoreVoltageLevel(PCM_VCORE1);

    /* 更改闪存控制器使用的等待状态数用于读取操作。
    当改变时钟的频率范围时,必须使用此函数以允许可读闪存
    通俗来讲就是CPU跑太快了,Flash跟不上,让CPU等等它 */
    MAP_FlashCtl_setWaitState(FLASH_BANK0, 1);
    MAP_FlashCtl_setWaitState(FLASH_BANK1, 1);

    CS_startHFXT(false);          //这是晶体 需要驱动
    CS_startLFXT(CS_LFXT_DRIVE3); //驱动等级3

    MAP_CS_initClockSignal(CS_MCLK, CS_HFXTCLK_SELECT, CS_CLOCK_DIVIDER_1);  //MCLK    48MHz   16分频时,滴答延时可达到最长
    MAP_CS_initClockSignal(CS_SMCLK, CS_HFXTCLK_SELECT, CS_CLOCK_DIVIDER_1); //SMCLK   48MHz
	CS_initClockSignal(CS_HSMCLK, CS_HFXTCLK_SELECT, CS_CLOCK_DIVIDER_1);	 //HSMCLK  48MHz
    CS_initClockSignal(CS_ACLK	, CS_LFXTCLK_SELECT, CS_CLOCK_DIVIDER_1); 	 //ACLK	   32768Hz	
	CS_initClockSignal(CS_BCLK	, CS_LFXTCLK_SELECT, CS_CLOCK_DIVIDER_1);	 //BCLK	   32768Hz
	
	// CS_initClockSignal(CS_ACLK	, CS_REFOCLK_SELECT, CS_CLOCK_DIVIDER_1); 	 //ACLK		这是不用外部低俗晶振  时钟源为CS_REFOCLK_SELECT
	// CS_initClockSignal(CS_BCLK	, CS_REFOCLK_SELECT, CS_CLOCK_DIVIDER_1);	 //BCLK
}

这个函数我参考了一个B站up主和官方例程

三.具体工程

我目前基于ti的固件库 进行了二次封装 欢迎大家到我的个人博客中下载

[博客链接](小吕的博客 (dxclv.top))

物联沃分享整理
物联沃-IOTWORD物联网 » MSP432P401R LaunchPad教程(一):时钟配置详解

发表评论