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))

  • 8
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MSP432P401R是德州仪器(Texas Instruments)推出的一款低功耗微控制器。它配备了多个定时器模块,用于实现各种定时功能。以下是关于MSP432P401R定时器的一些基本信息: 1. 定时器类型:MSP432P401R具有多个定时器模块,包括16位定时器TAx和32位定时器TBx。 2. 定时器功能:这些定时器模块可用于生成精确的时间延迟、测量输入脉冲的频率和脉宽、以及生成PWM信号等。 3. 定时器配置:您可以使用MSP432P401R的编程接口配置定时器的计数模式、时钟源、预分频因子和计数周期等。 4. 中断支持:MSP432P401R的定时器模块可以生成中断信号,以便在特定时间点执行中断服务程序。 5. 示例代码:以下是一个使用MSP432P401R定时器TA0生成1秒延迟的示例代码: ```c #include <msp.h> void TimerA0_Init(void) { // 停用定时器 TIMER_A0->CTL = TIMER_A_CTL_MC_0; // 配置定时器A0计数模式和时钟源(SMCLK) TIMER_A0->CTL = TIMER_A_CTL_SSEL__SMCLK | TIMER_A_CTL_MC__UP; // 设置预分频因子为1 TIMER_A0->CTL |= TIMER_A_CTL_ID__1; // 设置计数周期为 1 秒(SMCLK频率为 3MHz) TIMER_A0->CCR[0] = 3000000 - 1; // 启用定时器中断 TIMER_A0->CCTL[0] = TIMER_A_CCTLN_CCIE; // 清除定时器中断标志 TIMER_A0->CCTL[0] &= ~TIMER_A_CCTLN_CCIFG; // 使能全局中断 __enable_irq(); // 启动定时器A0 TIMER_A0->CTL |= TIMER_A_CTL_MC__UP; } // 定时器A0中断服务程序 void TA0_0_IRQHandler(void) { // 清除定时器中断标志 TIMER_A0->CCTL[0] &= ~TIMER_A_CCTLN_CCIFG; // 在此执行需要延迟执行的代码 } int main(void) { // 初始化定时器A0 TimerA0_Init(); while (1) { // 在此执行其他代码 } } ``` 这只是一个简单的示例,您可以根据具体需求进行配置和修改。请注意,示例代码中的SMCLK频率假设为3MHz,您需要根据实际情况进行调整。此外,您可能还需要查阅MSP432P401R的技术文档以获取更多详细信息和使用指南。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值