STM32 微控制器库RCC_ClkInitTypeDef结构参数介绍

目录

    • [1. 结构体定义](#1. 结构体定义)
    • [2. 结构体成员说明](#2. 结构体成员说明)
      • [(1) `ClockType`](#(1) ClockType)
      • [(2) `SYSCLKSource`](#(2) SYSCLKSource)
      • [(3) `AHBCLKDivider`](#(3) AHBCLKDivider)
      • [(4) `APB1CLKDivider`](#(4) APB1CLKDivider)
      • [(5) `APB2CLKDivider`](#(5) APB2CLKDivider)
    • [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 系列的低功耗域时钟(可选)。

    例如:

    c 复制代码
    RCC_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 系统时钟的灵活控制,满足不同应用场景的需求。

相关推荐
SY师弟24 分钟前
台湾TEMI协会竞赛——1、龙舟机器人组装教学
c语言·单片机·嵌入式硬件·机器人·嵌入式·台湾temi协会
星宇CY28 分钟前
STM32 定时器应用:从精准延时到智能控制的实战指南
stm32·单片机·嵌入式硬件
WIZnet 中国社区官方博客38 分钟前
第二章 开发板与芯片介绍
嵌入式硬件·wiznet·高性能以太网单片机·w55mh32·系统框架·开发板介绍·硬件资源
学习噢学个屁39 分钟前
基于STM32音频频谱分析设计
c语言·stm32·单片机·嵌入式硬件·音视频
电子科技圈2 小时前
IAR开发平台升级Arm和RISC-V开发工具链,加速现代嵌入式系统开发
arm开发·嵌入式硬件·设计模式·性能优化·软件工程·代码规范·risc-v
位东风3 小时前
【凌智视觉模块】rv1106 部署 ppocrv4 检测模型 rknn 推理
c++·人工智能·嵌入式硬件
is08154 小时前
调试`build.sh` 和用 `CMake` 编译出来的 `.elf` / `.bin` / `.hex` 文件大小或行为不同?
stm32
智驾4 小时前
电机控制基础,小白入门篇
嵌入式硬件·电机·电机控制
Peter_Deng.5 小时前
单片机 - STM32 非阻塞式编程详解:以 LED 和按键为例(附超详细寄存器级代码)
stm32·单片机·嵌入式硬件
平凡灵感码头6 小时前
基于 STM32 的四路 PWM 控制智能小车运动的模块化控制程序
stm32·单片机·嵌入式硬件