你说的“rcc时钟”一般是在嵌入式开发中,特别是 STM32 系列微控制器里,RCC 指的是 Reset and Clock Control,即“复位和时钟控制”模块。这个模块负责整个芯片内部各种外设和核心的时钟管理和复位控制。
下面帮你详细梳理 STM32 的 RCC 时钟系统及其相关内容。
STM32 RCC 时钟详解
1. RCC 的作用
- 时钟管理:RCC 负责配置和控制微控制器内部所有外设及核心的时钟信号,包括时钟源选择、倍频、分频等。
- 复位管理:控制芯片内各个模块的复位信号,确保模块初始化和重置。
2. STM32 时钟系统的主要组成部分
STM32 的时钟系统比较复杂,典型包含以下时钟源:
时钟源 | 说明 |
---|---|
HSI | High-Speed Internal RC oscillator,内部高速振荡器,通常为 8 MHz 或 16 MHz,芯片内部集成 |
HSE | High-Speed External oscillator,外部高速晶振,通常 8 MHz 或其他频率,通过外部晶体提供稳定时钟 |
PLL | Phase-Locked Loop,锁相环,用于倍频,生成更高频率的系统时钟 |
LSI | Low-Speed Internal RC oscillator,内部低速振荡器,典型约 32 kHz,通常用于独立看门狗或RTC |
LSE | Low-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_AHB1ENR
、RCC_APB1ENR
、RCC_APB2ENR
:外设时钟使能寄存器。RCC_BDCR
:备用域控制寄存器,控制 LSE 和 RTC。RCC_CSR
:时钟控制/状态寄存器。
5. 时钟配置流程举例(STM32F4)
- 使能 HSE(外部晶振)
设置RCC_CR
中 HSEON 位为 1,等待 HSE 就绪(HSERDY)位变1。 - 配置 PLL
设置RCC_PLLCFGR
寄存器,设置 PLL 输入源为 HSE,设置 PLL 的倍频、分频参数。 - 启动 PLL
设置PLLON
位为1,等待PLLRDY
标志位。 - 切换系统时钟源为 PLL
在RCC_CFGR
中将系统时钟切换到 PLL。 - 配置 AHB、APB1、APB2 分频
设置对应寄存器分频值,控制各总线时钟频率。 - 开启外设时钟
通过对应的使能寄存器打开外设时钟,如 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 参数含义,也可以告诉我。
发表回复