好问题,这正是理解 STM32F1 架构的关键点。RCC 的位置其实有"两个身份",很多人混淆就在这里。
一、RCC 到底在哪一层?——双重身份
物理上:RCC 是挂在 AHB 总线上的一颗"外设"
地址
0x40021000,有自己的寄存器组(CR、CFGR、AHBENR、APB1ENR、APB2ENR...)和 DMA、SDIO、CRC 一样是 AHB 总线上的成员
逻辑上:RCC 是整个芯片的"时钟分发中心"(中枢)
它决定 SYSCLK 来源(HSI/HSE/PLL)、各总线分频(HCLK/PCLK1/PCLK2)
它掌管每个外设的时钟使能(门控开关)——不开就点不亮
特殊性:RCC 是唯一不需要别人给它开时钟的外设。上电后芯片默认用 HSI 8MHz 直接运行,RCC 自己就能工作,然后它再去"点亮"其他所有人。所以它既是"外设",又是所有外设依赖链的第一环。
Cortex-M3
│
SYSCLK(系统时钟)
│
┌──────────┴──────────┐
│ AHB 总线 (72MHz) │
└──┬──────┬─────┬─────┘
│ │ │
┌──▼──┐ ┌▼───┐ ┌▼────────────┐
│ DMA │ │SDIO│ │ RCC ◄──── 时钟中枢 │
│ CRC │ │Flash│ │(自己先跑起来,再发 │
└─────┘ └────┘ │ 时钟给所有外设) │
└──────┬───────────┘
┌────────────┼────────────┐
┌─────▼─────┐ ┌────▼─────┐
│ APB2 总线 │ │ APB1 总线 │
│ (72MHz) │ │ (36MHz) │
└───────────┘ └──────────┘
二、F1 时钟树:RCC 输出哪些时钟
HSE 8MHz ──────┐
├─→ PLL(×9) ──→ SYSCLK 72MHz ──→ HCLK 72MHz
HSI 8MHz ──────┘ │ │
┌──────┴──────┐ ┌──────┴──────┐
│ APB1 分频 /2 │ │ APB2 分频 /1 │
▼ ▼ ▼ ▼
PCLK1 = 36MHz PCLK2 = 72MHz
LSE 32.768KHz ──→ RTC(独立于总线)
LSI 40KHz ──────→ IWDG(独立于总线)
PLL ─────────────→ USB 48MHz(专门输出)
三、各外设挂在哪个总线(F1 特例注意!)
APB2(高速 72MHz)——注意 F1 的 GPIO 在 APB2(F4 在 AHB1,别混):
APB1(低速 36MHz):
AHB(72MHz):DMA1/2、SDIO、CRC、Flash 接口
独立时钟源(不经过总线):IWDG←LSI、RTC←LSE/LSI
四、各外设完整依赖链(重点)
每个外设不是"开自己的时钟就行",它的完整依赖链如下(★=必须,☆=可选):
1. GPIO(最基础)
★ RCC 使能 GPIOx 时钟 → ★ 配置 MODER/OTYPER/PUPDR → (无 AFIO/NVIC)
只依赖 RCC,这就是为什么它排在阶段 1 最前。
2. AFIO(复用接线员)
★ RCC 使能 AFIO 时钟 → ★ 配置复用重映射
依赖 RCC;它本身是 GPIO"切换成外设功能"的桥梁。
3. EXTI 外部中断
★ RCC 使能 AFIO(EXTI 源选择在 AFIO 里)
★ GPIO 配输入模式
★ 配置 EXTI 线路 + 边沿
★ NVIC 使能 + 优先级
依赖:RCC + GPIO + AFIO + NVIC(四层全占)。
4. USART1(阶段 2)
★ RCC 使能 USART1(APB2)
★ RCC 使能 GPIOA
★ PA9/PA10 配置复用(AFIO)
★ 配置波特率/数据位
☆ NVIC(中断接收)
☆ DMA(DMA1_CH4=TX、CH5=RX)
依赖:RCC + GPIO + AFIO +(NVIC/DMA)。
5. TIM(阶段 3)
★ RCC 使能 TIMx
★ 配置 PSC/ARR/计数模式
☆ GPIO 复用(PWM 输出、输入捕获、编码器才需要)
☆ NVIC(定时中断)
基础定时只依赖 RCC;输出功能再加 GPIO。
6. ADC(阶段 7)
★ RCC 使能 ADCx(APB2)
★ RCC 使能 GPIO(模拟输入模式!)
★ ADC 时钟分频(APB2 72MHz → ADC ≤14MHz,如 /6=12MHz)
★ 校准 → 配置通道/采样时间
☆ DMA(ADC1→DMA1_CH1,多通道必备)
注意:模拟输入引脚不能配推挽/复用,要配 Analog 模式。
7. SPI(阶段 5)
★ RCC 使能 SPIx
★ RCC 使能 GPIO(PA5~7 或 PB13~15)
★ 复用功能配置
★ 配置速率/CPOL/CPHA
★ CS 用普通 GPIO 软件控制(F1 硬件 NSS 常不用)
8. I2C(阶段 6)
★ RCC 使能 I2Cx(APB1)
★ RCC 使能 GPIOB(PB6/7)
★ 复用**开漏**输出(I2C 特殊性!)
★ 上拉(内部或外部)
9. DMA(阶段 4)
★ RCC 使能 DMA1/2(AHB)
★ 配置通道/方向/源/目的/模式
☆ NVIC(传输完成中断)
DMA 自身只依赖 RCC,但它的意义是服务 USART/ADC/SPI,所以放在它们前面学。
10. CAN / USB(阶段 11/12,协议级)
CAN:★ RCC(CAN1) ★ GPIO(PA11/12 复用) ★ 波特率/滤波器 ★ 外部收发器 TJA1050
USB:★ RCC(USB) ★ PLL 输出 48MHz ★ GPIO(PA11/12 复用) ★ NVIC ★ USB 协议库
USB 是唯一额外要求"PLL 同时输出 48MHz"的外设,时钟配置最特殊。
11. RTC / IWDG(阶段 9/10,备份域与独立源)
RTC:★ RCC(PWR+BKP) → ★ 解锁备份域写保护(DBP) → ★ LSE 32.768KHz → ★ 配置分频
IWDG:★ 直接用 LSI,不开任何总线时钟(写保护解除即可)
五、一张图看懂"谁依赖谁"
RCC(时钟中枢,第一环)
│
┌────────┼──────────────────┐
▼ ▼ ▼
GPIO AFIO ←──GPIO的复用功能──┐
│ │ │
▼ ▼ │
EXTI ←──NVIC←──所有中断的入口──┤
│ │
▼ ▼
USART/TIM/ADC/SPI/I2C/CAN/USB DMA(服务它们的数据搬运)
│ │
└──────────┬────────────────┘
▼
综合项目(全部串联)
关键结论:
RCC 在 AHB 上,但它是时钟中枢——所有外设的第一依赖
GPIO + AFIO + NVIC 是三大公共前置——几乎所有通信/中断外设都要先过这三关
DMA 只依赖 RCC,但服务于外设——所以它早学(阶段 4),因为 USART/ADC/SPI 后面都要用
IWDG/RTC 是"独立王国"——不依赖总线时钟,学的时候不用管 RCC
这也正好解释了目录顺序为什么是 RCC→GPIO→AFIO→SysTick→EXTI→NVIC,先把公共前置全部打通,后面的外设实验就只剩"该外设自己的参数配置"了。