msp432快速入门第五节之时钟树详解及延时函数实现

(一)时钟树解析

(1)Usermanual中时钟树解析

在是clock system中有着时钟的介绍
在这里插入图片描述
解释为:
时钟支持低功耗模式,可以配置为外部时钟和内部时钟。
在这里插入图片描述

介绍了不同的时钟源频率以及特殊时钟源支持的频率范围
在这里插入图片描述

系统时钟树的介绍以及可能的配置信息,说明MSP432主要的时钟有5种类,分别是:
(1)ACLK:辅助时钟,给一些特殊外设提供时钟;
(2)MCLK:CPU时钟,最高可以配置成48M
(3)HSMCLK:高速设备时钟,类似于STM32的AHB总线
(4)SMCLK:低速设备时钟,类似STM32的APB总线
(5)BCLK:低功耗时可能会用到,猜测是RTC唤醒时用到;
后边一小段话是注意事项,解释为某些特殊设备无法使用某些时钟

通过Usermanual时钟的介绍,大概可以理解MSP432的时钟树了,按照常规TI的做法,为了展示芯片的低功耗特点,这些芯片的时钟不会配置成最高的运行速度,电赛中显然不需要考虑功耗,我们需要强大的性能,所以在后边时钟树的配置中,我们让MSP432运行在他的最高速率(CPU),其他总线时钟视情况而定

(二)时钟树修改

在初始化的.s汇编文件中,我们可以看到在配置堆栈后执行了这些函数,如下(以我配置的空工程为例):
在这里插入图片描述
可见TI使用SystemInit()函数配置了时钟树,这个函数可以使用全局搜索检索到:
在这里插入图片描述
解释为:该函数配置了时钟,看门狗,FPU,使能SRAM块,配置Flash等待时间,缓冲区等等
在这里插入图片描述
然后在这个文件中可以找到此宏,这代表了全局的CPU时钟,这些就是基本的时钟信息,按照如下步骤我们对其重新配置:
(1)修改__SYSTEM_CLOCK宏为48000000
(2)使用配置函数进行时钟配置,参照TI的DriverLib中时钟配置例子进行配置:

    //配置晶振pin
	GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_PJ,
            GPIO_PIN3 | GPIO_PIN2, GPIO_PRIMARY_MODULE_FUNCTION);
	//设置时钟频率
	CS_setExternalClockSourceFrequency(32000,48000000);
	//设置内核电压 bank延迟
	PCM_setCoreVoltageLevel(PCM_VCORE1);
    FlashCtl_setWaitState(FLASH_BANK0, 1);
    FlashCtl_setWaitState(FLASH_BANK1, 1);
    CS_startHFXT(false);
	//连接到外部时钟
	CS_initClockSignal(CS_MCLK	, CS_HFXTCLK_SELECT, CS_CLOCK_DIVIDER_1);
	CS_initClockSignal(CS_ACLK	, CS_REFOCLK_SELECT, CS_CLOCK_DIVIDER_1);
    CS_initClockSignal(CS_HSMCLK, CS_HFXTCLK_SELECT, CS_CLOCK_DIVIDER_2);
    CS_initClockSignal(CS_SMCLK	, CS_HFXTCLK_SELECT, CS_CLOCK_DIVIDER_4);
    CS_initClockSignal(CS_BCLK	, CS_REFOCLK_SELECT, CS_CLOCK_DIVIDER_1);

然后时钟就会工作在我们所需要的频率下:
在这里插入图片描述
然后可以使用函数获取时钟进行检验,注意变量的大小,我使用了自己构造的结构体获取,便于读取:
在这里插入图片描述
在这里插入图片描述
需要注意的是最好在我们重新配置完时钟后开启FPU,这样浮点计算就更便捷了:

//开fpu
FPU_enableModule();
FPU_enableLazyStacking();

在这里我直接将他封装成函数,在启动时进行调用:
如下:
在这里插入图片描述

(三)基于Systick的通用延时函数(cortexM通用)

在这里我使用systick作为基准来配置延时函数,便于调用:
H文件:

#ifndef NULL
#define NULL ((void *)0)
#endif


#define DELAY_CLK SystemCoreClock

#define USEC_TO_COUNT(us, clockFreqInHz)		(uint64_t)(((uint64_t)(us) * (clockFreqInHz)) / 1000000U)

//------------------------------------以下宏定义用于延时------------------------------------
void systick_delay(uint32 time);
void systick_delay_ms(uint32 ms);														// 毫秒级延时函数 由于滴答定时器最大只有24位,因此用函数实现,这样延时时间范围较宽
#define systick_delay_us(time)		systick_delay(USEC_TO_COUNT(time, DELAY_CLK))		// 设置延时时间 单位us 范围0 - 16777215(0xffffff)/(DELAY_CLK*1000)ms	主频48M systick最大延时时间大约为16ms
#define delay_ms(x)  				systick_delay_ms(x)
#define delay_us(x)  				systick_delay_us(x)

C文件:

//延时函数 systick实现 时钟刻度为系统频率
void systick_delay(uint32 t) 
{
	SysTick-> CTRL = 0x00;
	SysTick->LOAD = t - 1;
	SysTick->VAL = 0x00;
	SysTick->CTRL	=	SysTick_CTRL_CLKSOURCE_Msk |					//时钟源选择 (core clk)
						SysTick_CTRL_ENABLE_Msk;						//使能 systick
	while( !(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk));
}


//延时ms
void systick_delay_ms (uint32 time)
{
	while(time--) systick_delay(SystemCoreClock / 1000);
}

然后可以使用上一个教程中的GPIO翻转函数检验延时的正确性,注意这种延时跟配置的时钟频率无关,是基于内核的,通用的,时钟树以及延时的讲解到此结束。

克隆空白工程请使用 git , 如果你觉得还不错欢迎点亮 star !

git clone https://github.com/YGZone/Design-a-car-with-MSP432P401R.git

更多资料可以转步我的个人网站 www.eestr.com ( https://www.eestr.com)或者 Github[https://github.com/YGZone], 欢迎访问

  • 8
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: msp432e401y 是一款微控制器,延迟函数在程序设计中非常常见。延迟函数是一种实现延迟时间的方法,通常用于控制程序的执行速度。msp432e401y 延迟函数可以通过使用定时器或延时循环来实现。 使用定时器实现延迟函数可以提高系统的效率和精度。通过编程设置定时器的时间计数器和中断,当计数器达到预设的值时,中断会触发,此时可以执行所需的延迟操作。通过调整定时器的预设值,可以实现不同的延迟时间。 另一种常见的延迟函数实现方式是使用延时循环。延时循环通过使用空操作指令(NOP)或者执行一些不需要太多计算资源的指令,在循环中重复执行一定的次数来实现延迟。延时的时间取决于循环的执行次数和每次执行的指令的执行时间。 对于 msp432e401y 来说,选择使用哪种延迟函数的方式取决于具体的应用需求。如果需要较高的延迟精度和可调性,可以考虑使用定时器实现延迟函数,但这需要对定时器的配置和编程有一定的了解。如果对延迟精度要求不高,可以选择使用延时循环来实现延迟函数,这种方式简单易用,但需要根据延时需求进行适当的调整。 总之,msp432e401y 延迟函数的选择取决于应用的具体需求,通过合理地使用定时器和延时循环,可以实现不同精度和延时时间的延迟函数。 ### 回答2: MSP432E401Y是一款主要用于嵌入式系统的微控制器,它具有高性能和低功耗的特点。在这款微控制器中,可以使用延迟函数来实现时间延迟的功能。 延迟函数是一种通过控制系统时钟的方式来暂停程序执行一段时间的方法。在MSP432E401Y中,我们可以使用SysTick定时器来实现延迟函数。SysTick定时器是一个24位的向下计数器,可以通过编程进行配置和控制。 要实现延迟函数,我们需要首先配置SysTick定时器的时钟源和预分频因子,以确定每个时间单位的长度。然后,我们可以通过编写一个循环计数的程序来进行延迟。 下面是一个简单的延迟函数的伪代码示例: ``` void delay_ms(uint32_t milliseconds) { // 设置SysTick定时器的时钟源和预分频因子 SysTick->LOAD = (SystemCoreClock / 1000) * milliseconds; // 设置定时器加载值 SysTick->VAL = 0; // 清零当前定时器值 SysTick->CTRL = SysTick_CTRL_ENABLE_Msk; // 启动SysTick定时器 // 等待定时器到达,进行循环计数 while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)) { // 循环计数 } SysTick->CTRL = 0; // 关闭SysTick定时器 } ``` 上述代码中,`delay_ms`函数接受一个时间参数(以毫秒为单位),计算出所需的定时器加载值,并在循环中进行延时。当定时器计数到达时,程序会退出循环,延时结束。 需要注意的是,由于定时器的精度和系统时钟的影响,实际的延迟时间可能略有偏差。因此,在实际应用中,需要根据具体的延迟需求进行调试和测试,以确保所需的延迟时间得到准确的实现。 ### 回答3: MSP432E401Y是一款由德州仪器(Texas Instruments)推出的32位微控制器。延迟函数是在编程中经常使用的一个函数,它用于在程序执行过程中暂停一段时间。 在MSP432E401Y中,我们可以使用延迟函数来实现暂停的功能。延迟函数的原理是通过循环来消耗一定的时间,从而实现延迟效果。 实现延迟函数的基本思路是使用计时器来计算时间。通常情况下,我们可以使用SysTick定时器来实现延迟函数。SysTick定时器是MSP432E401Y中的一个系统定时器,它可以提供一个可编程的系统定时器中断。 具体实现延迟函数的步骤如下: 1. 初始化SysTick定时器,设置定时器的时钟源、计数器的初始值和中断时间间隔。 2. 定义一个全局变量用于记录延迟的时间。 3. 在延迟函数中,将要延迟的时间赋值给全局变量。 4. 启用SysTick定时器。 5. 在SysTick定时器中断中,每次触发中断时,将全局变量的值递减1,直到减为0。 6. 当全局变量的值减为0时,关闭SysTick定时器。 通过以上步骤,我们可以实现一个简单的延迟函数。在程序中调用延迟函数时,程序会在调用处暂停一段时间,然后再继续执行后面的代码。 需要注意的是,延迟函数的延迟时间是根据SysTick定时器的中断时间间隔来确定的。在实际使用中,我们可以根据需要自行调整定时器的中断时间间隔来达到所需的延迟时间。同时,由于延迟函数是通过循环来实现的,因此延迟时间并不是绝对准确的,会有一定的误差存在。 总之,MSP432E401Y的延迟函数可以通过使用SysTick定时器来实现,通过计算时间并在中断中进行倒计时,从而达到延迟的效果。这在一些需要暂停一段时间的应用场景中非常有用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YGZone

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值