MSP432P401R LaunchPad教程(一)时钟配置
专栏目录
MSP432P401R LaunchPad教程 基于keil的开发环境
MSP432P401R LaunchPad教程(一)时钟配置
MSP432P401R LaunchPad教程(二)keil环境配置
MSP432P401R LaunchPad教程(三)滴答定时器
如何将性能拉满 配置到48MHz 具体见下文
一.时钟树
1.七个时钟源
从官方参考手册可以看出,这个mcu的时钟信号一共有七个时钟源,意思就是说所有的时钟信号由这七个时钟源通过各种配置 (分频倍频 选择啥的)出来的
这七个时钟源是
两个外部时钟源
HFXTCLK:
高速振荡器时钟源 允许的频率范围1-MHz to 48-MHz LaunchPad上就有一个48Mhz的晶振 Q2
LFXTCLK:
低速振荡器时钟源 允许的频率范围32KHz以下 LaunchPad上就有一个32768Hz的晶振 Q1
五个内部时钟源
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一样不知道咋回事
我通过这些函数观测到我设置的时钟频率 发现SMCLK也能到48MHz
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.默认时钟配置
默认的是时钟配置都是内部时钟源
默认时钟配置是在启动文件system_msp432p401r.c里SystemInit(void)设置的 这个函数是在启动文件汇编文件里调用的 学过stm32的应该都熟悉
可以在system_msp432p401r.c里通过修改这个宏 更改MCLK的频率 即cpu的主频 通过配置发现 HAMCLK和SMCLK也会跟着改变 所以这个宏应该是同时改变这三者频率
二.用外部晶振作为时钟源
上文所说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的固件库 进行了二次封装 欢迎大家到我的个人博客中下载文章来源:https://www.toymoban.com/news/detail-589725.html
[博客链接](小吕的博客 (dxclv.top))文章来源地址https://www.toymoban.com/news/detail-589725.html
到了这里,关于MSP432P401R LaunchPad教程(一)时钟配置的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!