一、记录以下代码

准备电子设计大赛,浅浅的学习了MSP432的时钟设置模块,记录如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
//常用的函数库

#include "normal.h"


//延时函数 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);
}


SysClockStructure SysClock;
//时钟配置
/*
MCLK = 48MHz
ACLK = 32.768KHz
HSMCLK = 48MHz
SMCLK = 48MHz
BCLK = 32.768KHz
*/

void Clock_ReConfig(void) //技术手册380页
{
//配置晶振pin,GPIO_setAsPeripheralModuleFunctionOutputPin()函数用来配置两个GPIO引脚(PJ3和PJ2),将其配置为主要的
//的外设模块功能引脚,GPIO_PRIMARY_MODULE_FUNCTION
GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_PJ,GPIO_PIN3 | GPIO_PIN2, GPIO_PRIMARY_MODULE_FUNCTION);
//设置时钟频率,外部时钟源,其中32000表示外部时钟源的频率为32kHz,48000000表示系统主时钟(MCLK)的频率围为48MHz
CS_setExternalClockSourceFrequency(32000,48000000);
//设置内核电压 bank延迟
PCM_setCoreVoltageLevel(PCM_VCORE1); //设置内核电压为VCOE1,以供MSP432的核心运作
FlashCtl_setWaitState(FLASH_BANK0, 1); //增加闪存的等待时间,以确保数据正确的存储和读取
FlashCtl_setWaitState(FLASH_BANK1, 1);
CS_startHFXT(false); //启动外部晶体振荡器

//连接各部分时钟,对各个时钟信号进行初始化
/*
通过`CS_initClockSignal`函数对各个时钟信号进行初始化。具体来说:
`CS_MCLK`表示主时钟,即MCLK;
`CS_ACLK`表示辅助时钟,即ACLK;
`CS_HSMCLK`表示高速模块时钟,即HSMCLK;
`CS_SMCLK`表示系统时钟,即SMCLK;
`CS_BCLK`表示备用时钟,即BCLK。
`CS_HFXTCLK_SELECT`表示高频晶振时钟源;
`CS_REFOCLK_SELECT`表示低功耗参考时钟源。
`CS_CLOCK_DIVIDER_1`表示选择时钟分频系数为1,即不分频。

然后,通过`CS_getACLK()`、`CS_getMCLK()`、`CS_getSMCLK()`、`CS_getHSMCLK()`、`CS_getBCLK()`函数获取当前各个时钟信号的频率值,并将其保存在`SysClock`结构体中。
*/
//可以通过改变CS_CLOCK_DIVIDER_x,改变分频器分频的量
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_1);
CS_initClockSignal(CS_SMCLK , CS_HFXTCLK_SELECT, CS_CLOCK_DIVIDER_1);
CS_initClockSignal(CS_BCLK , CS_REFOCLK_SELECT, CS_CLOCK_DIVIDER_1);
SysClock.aclk = CS_getACLK();
SysClock.mclk = CS_getMCLK();
SysClock.smclk = CS_getSMCLK();
SysClock.hsmclk = CS_getHSMCLK();
SysClock.bclk = CS_getBCLK();
//开fpu,浮点运算单元,启用懒惰堆栈保护
//FPU是处理浮点数的硬件单元,可以提高浮点运算的速度和精度
//懒惰堆栈保护是指在发生浮点异常时,只在需要时才保存堆栈信息,以提高运行效率
FPU_enableModule();
FPU_enableLazyStacking();
}