目录
- 1. 结构体定义
- 2. 结构体成员说明
- (1) `OscillatorType`
- (2) `HSEState`
- (3) `LSEState`
- (4) `HSIState`
- (5) `HSICalibrationValue`
- (6) `LSIState`
- (7) `PLL`
- 3. 使用步骤
- (1) 定义结构体
- (2) 配置结构体成员
- (3) 调用 HAL 初始化函数
- 4. 示例代码
- 5. 注意事项
- (1) 时钟源的选择
- (2) 校准值
- (3) 时钟配置的先后顺序
- (4) HAL 库版本
- 6. 总结
RCC_OscInitTypeDef
是 STM32 微控制器固件库(如标准外设库或 HAL 库)中用于配置振荡器(Oscillator)的结构体。它定义了系统时钟的源(如 HSI、HSE、PLL 等)以及相关的配置参数。
1. 结构体定义
在 STM32 HAL 库中,RCC_OscInitTypeDef
结构体的定义如下:
typedef struct
{uint32_t OscillatorType; // 需要配置的振荡器类型uint32_t HSEState; // 外部高速时钟状态uint32_t LSEState; // 外部低速时钟状态uint32_t HSIState; // 内部高速时钟状态uint32_t HSICalibrationValue; // 内部高速时钟校准值uint32_t LSIState; // 内部低速时钟状态RCC_PLLInitTypeDef PLL; // 锁相环配置
} RCC_OscInitTypeDef;
2. 结构体成员说明
(1) OscillatorType
-
类型:
uint32_t
-
说明:指定需要配置的振荡器类型,可以是以下值的组合:
RCC_OSCILLATORTYPE_HSE
:外部高速时钟(HSE)。RCC_OSCILLATORTYPE_LSE
:外部低速时钟(LSE)。RCC_OSCILLATORTYPE_HSI
:内部高速时钟(HSI)。RCC_OSCILLATORTYPE_LSI
:内部低速时钟(LSI)。RCC_OSCILLATORTYPE_MSI
:内部多速时钟(MSI,用于某些 STM32 系列)。RCC_OSCILLATORTYPE_HSI48
:内部 48 MHz 时钟(HSI48,用于 USB 等外设)。
例如:
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI;
(2) HSEState
- 类型:
uint32_t
- 说明:指定外部高速时钟(HSE)的状态,常用值包括:
RCC_HSE_ON
:使能 HSE。RCC_HSE_OFF
:关闭 HSE。RCC_HSE_BYPASS
:HSE 通过外部时钟源(如晶振)绕过。
(3) LSEState
- 类型:
uint32_t
- 说明:指定外部低速时钟(LSE)的状态,常用值包括:
RCC_LSE_ON
:使能 LSE。RCC_LSE_OFF
:关闭 LSE。RCC_LSE_BYPASS
:LSE 通过外部时钟源绕过。
(4) HSIState
- 类型:
uint32_t
- 说明:指定内部高速时钟(HSI)的状态,常用值包括:
RCC_HSI_ON
:使能 HSI。RCC_HSI_OFF
:关闭 HSI。RCC_HSI_DIV1
:HSI 不分频。RCC_HSI_DIV2
:HSI 2 分频。
(5) HSICalibrationValue
- 类型:
uint32_t
- 说明:校准内部高速时钟(HSI)的精度,范围通常为 0 到 15。
(6) LSIState
- 类型:
uint32_t
- 说明:指定内部低速时钟(LSI)的状态,常用值包括:
RCC_LSI_ON
:使能 LSI。RCC_LSI_OFF
:关闭 LSI。
(7) PLL
- 类型:
RCC_PLLInitTypeDef
- 说明:配置锁相环(PLL)的参数,包括:
PLLState
:PLL 的状态(RCC_PLL_ON
或RCC_PLL_OFF
)。PLLSource
:PLL 的时钟源(如RCC_PLLSOURCE_HSE
或RCC_PLLSOURCE_HSI
)。PLLM
:PLL 的 M 分频器(输入分频)。PLLN
:PLL 的 N 倍频器(倍频)。PLLP
:PLL 的 P 分频器(输出分频)。PLLQ
:PLL 的 Q 分频器(输出分频,用于 USB 等外设)。PLLR
:PLL 的 R 分频器(输出分频,用于 STM32F4 及以上)。
3. 使用步骤
(1) 定义结构体
RCC_OscInitTypeDef RCC_OscInitStruct;
(2) 配置结构体成员
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; // 配置 HSE
RCC_OscInitStruct.HSEState = RCC_HSE_ON; // 使能 HSE
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; // 使能 PLL
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; // PLL 源为 HSE
RCC_OscInitStruct.PLL.PLLM = 8; // 8 分频
RCC_OscInitStruct.PLL.PLLN = 336; // 336 倍频
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; // PLLP 2 分频
RCC_OscInitStruct.PLL.PLLQ = 7; // PLLQ 7 分频
(3) 调用 HAL 初始化函数
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{// 初始化失败处理while (1);
}
4. 示例代码
以下是一个完整的配置示例,假设使用 HSE 作为时钟源,并配置 PLL:
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};// 配置 HSE 和 PLLRCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON; // 使能 HSERCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; // 使能 PLLRCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; // PLL 源为 HSERCC_OscInitStruct.PLL.PLLM = 8; // 8 分频RCC_OscInitStruct.PLL.PLLN = 336; // 336 倍频RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; // PLLP 2 分频RCC_OscInitStruct.PLL.PLLQ = 7; // PLLQ 7 分频if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){// 初始化失败处理while (1);}// 配置系统时钟为 PLL 输出__HAL_RCC_SYSCLK_CONFIG(RCC_SYSCLKSOURCE_PLLCLK);
}
5. 注意事项
(1) 时钟源的选择
- 如果使用 HSE 作为时钟源,确保外部晶振已正确连接。
- 如果使用 PLL,需配置 PLL 的倍频和分频参数,确保输出频率在芯片支持的范围内。
(2) 校准值
- 内部时钟(如 HSI)可以通过
HSICalibrationValue
进行校准,以提高精度。
(3) 时钟配置的先后顺序
- 通常先配置振荡器(如 HSE、HSI、PLL),然后再配置系统时钟源。
(4) HAL 库版本
- 不同版本的 HAL 库可能在结构体成员和宏定义上有所不同,根据实际使用的 HAL 库版本调整代码。
6. 总结
RCC_OscInitTypeDef
是用于配置 STM32 振荡器(Oscillator)的核心结构体,包含以下关键参数:
- 振荡器类型:如 HSE、HSI、LSE、LSI。
- 振荡器状态:如使能或禁用。
- PLL 配置:包括时钟源、倍频、分频等。