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

目录

    • [1. 结构体定义](#1. 结构体定义)
    • [2. 结构体成员说明](#2. 结构体成员说明)
      • [(1) `OscillatorType`](#(1) OscillatorType)
      • [(2) `HSEState`](#(2) HSEState)
      • [(3) `LSEState`](#(3) LSEState)
      • [(4) `HSIState`](#(4) HSIState)
      • [(5) `HSICalibrationValue`](#(5) HSICalibrationValue)
      • [(6) `LSIState`](#(6) LSIState)
      • [(7) `PLL`](#(7) PLL)
    • [3. 使用步骤](#3. 使用步骤)
      • [(1) 定义结构体](#(1) 定义结构体)
      • [(2) 配置结构体成员](#(2) 配置结构体成员)
      • [(3) 调用 HAL 初始化函数](#(3) 调用 HAL 初始化函数)
    • [4. 示例代码](#4. 示例代码)
    • [5. 注意事项](#5. 注意事项)
      • [(1) 时钟源的选择](#(1) 时钟源的选择)
      • [(2) 校准值](#(2) 校准值)
      • [(3) 时钟配置的先后顺序](#(3) 时钟配置的先后顺序)
      • [(4) HAL 库版本](#(4) HAL 库版本)
    • [6. 总结](#6. 总结)

RCC_OscInitTypeDef 是 STM32 微控制器固件库(如标准外设库或 HAL 库)中用于配置振荡器(Oscillator)的结构体。它定义了系统时钟的源(如 HSI、HSE、PLL 等)以及相关的配置参数。


1. 结构体定义

在 STM32 HAL 库中,RCC_OscInitTypeDef 结构体的定义如下:

c 复制代码
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 等外设)。

    例如:

    c 复制代码
    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_ONRCC_PLL_OFF)。
    • PLLSource:PLL 的时钟源(如 RCC_PLLSOURCE_HSERCC_PLLSOURCE_HSI)。
    • PLLM:PLL 的 M 分频器(输入分频)。
    • PLLN:PLL 的 N 倍频器(倍频)。
    • PLLP:PLL 的 P 分频器(输出分频)。
    • PLLQ:PLL 的 Q 分频器(输出分频,用于 USB 等外设)。
    • PLLR:PLL 的 R 分频器(输出分频,用于 STM32F4 及以上)。

3. 使用步骤

(1) 定义结构体

c 复制代码
RCC_OscInitTypeDef RCC_OscInitStruct;

(2) 配置结构体成员

c 复制代码
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 初始化函数

c 复制代码
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
    // 初始化失败处理
    while (1);
}

4. 示例代码

以下是一个完整的配置示例,假设使用 HSE 作为时钟源,并配置 PLL:

c 复制代码
void SystemClock_Config(void)
{
    RCC_OscInitTypeDef RCC_OscInitStruct = {0};

    // 配置 HSE 和 PLL
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_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 分频

    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 配置:包括时钟源、倍频、分频等。
相关推荐
代码游侠9 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
xuxg200511 小时前
4G 模组 AT 命令解析框架课程正式发布
stm32·嵌入式·at命令解析框架
CODECOLLECT13 小时前
京元 I62D Windows PDA 技术拆解:Windows 10 IoT 兼容 + 硬解码模块,如何降低工业软件迁移成本?
stm32·单片机·嵌入式硬件
BackCatK Chen13 小时前
STM32+FreeRTOS:嵌入式开发的黄金搭档,未来十年就靠它了!
stm32·单片机·嵌入式硬件·freertos·低功耗·rtdbs·工业控制
全栈游侠16 小时前
STM32F103XX 02-电源与备份寄存器
stm32·单片机·嵌入式硬件
Lsir10110_16 小时前
【Linux】中断 —— 操作系统的运行基石
linux·运维·嵌入式硬件
深圳市九鼎创展科技18 小时前
瑞芯微 RK3399 开发板 X3399 评测:高性能 ARM 平台的多面手
linux·arm开发·人工智能·单片机·嵌入式硬件·边缘计算
辰哥单片机设计18 小时前
STM32项目分享:车辆防盗报警系统
stm32·单片机·嵌入式硬件
風清掦20 小时前
【江科大STM32学习笔记-05】EXTI外部中断11
笔记·stm32·学习
小龙报20 小时前
【51单片机】从 0 到 1 玩转 51 蜂鸣器:分清有源无源,轻松驱动它奏响新年旋律
c语言·数据结构·c++·stm32·单片机·嵌入式硬件·51单片机