你说的“rcc时钟”一般是在嵌入式开发中,特别是 STM32 系列微控制器里,RCC 指的是 Reset and Clock Control,即“复位和时钟控制”模块。这个模块负责整个芯片内部各种外设和核心的时钟管理和复位控制。

下面帮你详细梳理 STM32 的 RCC 时钟系统及其相关内容。


STM32 RCC 时钟详解


1. RCC 的作用

  • 时钟管理:RCC 负责配置和控制微控制器内部所有外设及核心的时钟信号,包括时钟源选择、倍频、分频等。
  • 复位管理:控制芯片内各个模块的复位信号,确保模块初始化和重置。

2. STM32 时钟系统的主要组成部分

STM32 的时钟系统比较复杂,典型包含以下时钟源:

时钟源说明
HSIHigh-Speed Internal RC oscillator,内部高速振荡器,通常为 8 MHz 或 16 MHz,芯片内部集成
HSEHigh-Speed External oscillator,外部高速晶振,通常 8 MHz 或其他频率,通过外部晶体提供稳定时钟
PLLPhase-Locked Loop,锁相环,用于倍频,生成更高频率的系统时钟
LSILow-Speed Internal RC oscillator,内部低速振荡器,典型约 32 kHz,通常用于独立看门狗或RTC
LSELow-Speed External oscillator,外部低速晶振,通常 32.768 kHz,用于RTC等低功耗计时

3. 时钟树结构简述

时钟树是 STM32 内部的时钟信号分配结构:

  HSE  ----\
             --> PLL --> SYSCLK (系统时钟)
  HSI  ----/
  
SYSCLK --> AHB 总线时钟 (HCLK)
HCLK --> APB1 总线时钟 (PCLK1)
HCLK --> APB2 总线时钟 (PCLK2)

还有 RTC 时钟,独立看门狗时钟等
  • SYSCLK 是 CPU 和内核的主时钟。
  • AHB 总线驱动高速总线和外设。
  • APB1/APB2 总线驱动低速外设。
  • 各总线时钟可以通过分频器调整频率。

4. RCC 相关寄存器

常见寄存器(以 STM32F4 为例):

  • RCC_CR:控制寄存器,启动/关闭时钟源(HSI、HSE、PLL 等)。
  • RCC_PLLCFGR:PLL 配置寄存器,设置倍频系数。
  • RCC_CFGR:时钟配置寄存器,选择系统时钟源,设置分频系数。
  • RCC_AHB1ENRRCC_APB1ENRRCC_APB2ENR:外设时钟使能寄存器。
  • RCC_BDCR:备用域控制寄存器,控制 LSE 和 RTC。
  • RCC_CSR:时钟控制/状态寄存器。

5. 时钟配置流程举例(STM32F4)

  1. 使能 HSE(外部晶振)
    设置 RCC_CR 中 HSEON 位为 1,等待 HSE 就绪(HSERDY)位变1。
  2. 配置 PLL
    设置 RCC_PLLCFGR 寄存器,设置 PLL 输入源为 HSE,设置 PLL 的倍频、分频参数。
  3. 启动 PLL
    设置 PLLON 位为1,等待 PLLRDY 标志位。
  4. 切换系统时钟源为 PLL
    在 RCC_CFGR 中将系统时钟切换到 PLL。
  5. 配置 AHB、APB1、APB2 分频
    设置对应寄存器分频值,控制各总线时钟频率。
  6. 开启外设时钟
    通过对应的使能寄存器打开外设时钟,如 GPIO、USART、TIM 等。

6. RCC 时钟相关关键点

  • 时钟稳定性:HSE 和 PLL 启动后,都要等待稳定标志位,避免时钟抖动导致系统异常。
  • 分频器设置:合理设置分频器,保证外设时钟频率在规格范围内,避免外设工作异常。
  • 电源管理:通过 RCC 控制外设时钟使能,关闭未使用外设节省功耗。
  • 备份域时钟:RTC 和备份寄存器依赖 LSE 或 LSI 时钟。

7. 简单代码示例(STM32 HAL 库)

RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

// 1. 初始化振荡器,开启外部晶振 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;
RCC_OscInitStruct.PLL.PLLM = 8;
RCC_OscInitStruct.PLL.PLLN = 336;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 7;
HAL_RCC_OscConfig(&RCC_OscInitStruct);

// 2. 初始化时钟分频
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK
                             | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);

8. 总结

概念说明
RCC复位和时钟控制模块
HSI内部高速振荡器
HSE外部高速晶振
PLL锁相环,倍频生成更高时钟
SYSCLK系统主时钟,CPU 核心时钟
AHB/APB总线时钟系统总线及外设时钟
分频器控制时钟频率,满足外设要求
时钟使能开启/关闭外设时钟,节省功耗

如果你需要我帮你讲解某款具体 STM32 的 RCC 时钟配置(比如 STM32F1、F4、H7)或者更底层的寄存器操作,或者详细解释 PLL 参数含义,也可以告诉我。