目录
-
- [1. 结构体定义](#1. 结构体定义)
- [2. 结构体成员说明](#2. 结构体成员说明)
-
- [(1) `ClockType`](#(1)
ClockType
) - [(2) `SYSCLKSource`](#(2)
SYSCLKSource
) - [(3) `AHBCLKDivider`](#(3)
AHBCLKDivider
) - [(4) `APB1CLKDivider`](#(4)
APB1CLKDivider
) - [(5) `APB2CLKDivider`](#(5)
APB2CLKDivider
)
- [(1) `ClockType`](#(1)
- [3. 使用步骤](#3. 使用步骤)
-
- [(1) 定义结构体](#(1) 定义结构体)
- [(2) 配置结构体成员](#(2) 配置结构体成员)
- [(3) 调用 HAL 初始化函数](#(3) 调用 HAL 初始化函数)
- [4. 示例代码](#4. 示例代码)
- [5. 注意事项](#5. 注意事项)
-
- [(1) 时钟源的选择](#(1) 时钟源的选择)
- [(2) FLASH 等待周期](#(2) FLASH 等待周期)
- [(3) 时钟树的理解](#(3) 时钟树的理解)
- [(4) HAL 库版本](#(4) HAL 库版本)
- [6. 总结](#6. 总结)
RCC_ClkInitTypeDef
是 STM32 微控制器固件库(如标准外设库(Standard Peripheral Library)或 HAL 库)中用于配置系统时钟(System Clock,简称 SYSCLK)的结构体。它定义了系统时钟的源、分频器以及其他相关参数。
1. 结构体定义
在 STM32 HAL 库中,RCC_ClkInitTypeDef
结构体的定义如下:
c
typedef struct
{
uint32_t ClockType; // 需要配置的时钟类型
uint32_t SYSCLKSource; // 系统时钟源(如 HSI、HSE、PLL)
uint32_t AHBCLKDivider; // AHB 总线时钟分频器
uint32_t APB1CLKDivider; // APB1 总线时钟分频器
uint32_t APB2CLKDivider; // APB2 总线时钟分频器
} RCC_ClkInitTypeDef;
2. 结构体成员说明
(1) ClockType
-
类型 :
uint32_t
-
说明:指定需要配置的时钟类型,可以是以下值的组合:
RCC_CLOCKTYPE_SYSCLK
:系统时钟。RCC_CLOCKTYPE_HCLK
:AHB 总线时钟。RCC_CLOCKTYPE_PCLK1
:APB1 总线时钟。RCC_CLOCKTYPE_PCLK2
:APB2 总线时钟。RCC_CLOCKTYPE_D3PCLK1
:用于 STM32H7 系列的高性能域时钟(可选)。RCC_CLOCKTYPE_D1PCLK1
:用于 STM32H7 系列的低功耗域时钟(可选)。
例如:
cRCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
(2) SYSCLKSource
- 类型 :
uint32_t
- 说明 :指定系统时钟源,常用值包括:
RCC_SYSCLKSOURCE_HSI
:内部高速时钟(HSI,通常为 16 MHz)。RCC_SYSCLKSOURCE_HSE
:外部高速时钟(HSE,通常为 8 MHz 或更高)。RCC_SYSCLKSOURCE_PLLCLK
:锁相环时钟(PLL 输出)。RCC_SYSCLKSOURCE_PLLRCLK
:PLL 的 R 分频输出(用于 STM32F4 及以上)。
(3) AHBCLKDivider
- 类型 :
uint32_t
- 说明 :指定 AHB 总线时钟的分频系数,常用值包括:
RCC_SYSCLK_DIV1
:不分频(1 分频)。RCC_SYSCLK_DIV2
:2 分频。RCC_SYSCLK_DIV4
:4 分频。RCC_SYSCLK_DIV8
:8 分频。RCC_SYSCLK_DIV16
:16 分频。
(4) APB1CLKDivider
- 类型 :
uint32_t
- 说明 :指定 APB1 总线时钟的分频系数,常用值包括:
RCC_HCLK_DIV1
:不分频。RCC_HCLK_DIV2
:2 分频。RCC_HCLK_DIV4
:4 分频。RCC_HCLK_DIV8
:8 分频。RCC_HCLK_DIV16
:16 分频。
(5) APB2CLKDivider
- 类型 :
uint32_t
- 说明 :指定 APB2 总线时钟的分频系数,常用值与
APB1CLKDivider
类似。
3. 使用步骤
(1) 定义结构体
c
RCC_ClkInitTypeDef RCC_ClkInitStruct;
(2) 配置结构体成员
c
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; // 使用 PLL 作为系统时钟源
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // AHB 时钟不分频
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; // APB1 时钟 4 分频
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; // APB2 时钟 2 分频
(3) 调用 HAL 初始化函数
c
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
- 第二个参数
FLASH_LATENCY_5
指定了 FLASH 等待周期,具体值根据系统时钟频率选择。
4. 示例代码
以下是一个完整的配置示例,假设使用 HSE 作为系统时钟源,并配置 PLL:
c
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
// 使能 HSE
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
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 分频
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
// 初始化失败处理
while (1);
}
// 配置时钟
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; // 使用 PLL 作为系统时钟源
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // AHB 时钟不分频
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; // APB1 时钟 4 分频
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; // APB2 时钟 2 分频
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
{
// 初始化失败处理
while (1);
}
}
5. 注意事项
(1) 时钟源的选择
- 如果使用 HSE 作为时钟源,确保外部晶振已正确连接。
- 如果使用 PLL,需配置 PLL 的倍频和分频参数,确保输出频率在芯片支持的范围内。
(2) FLASH 等待周期
- 系统时钟频率越高,FLASH 等待周期需要配置得越长。否则,可能导致系统不稳定或无法启动。
(3) 时钟树的理解
- 理解 STM32 的时钟树结构,包括 AHB、APB1、APB2 的分频关系。
(4) HAL 库版本
- 不同版本的 HAL 库可能在结构体成员和宏定义上有所不同,根据实际使用的 HAL 库版本调整代码。
6. 总结
RCC_ClkInitTypeDef
是用于配置 STM32 系统时钟的核心结构体,包含以下关键参数:
- 系统时钟源:如 HSI、HSE、PLL。
- AHB/APB1/APB2 分频器:控制各总线的时钟频率。
- 时钟类型:指定需要配置的时钟类型。
通过合理配置 RCC_ClkInitTypeDef
结构体,可以实现对 STM32 系统时钟的灵活控制,满足不同应用场景的需求。