浮云落笔

浮云落笔

首页
瞬间
反馈
浮云落笔

浮云落笔

首页 瞬间 反馈
  1. 首页
  2. RCC外设依赖

RCC外设依赖

  • 发布于 2026-08-20
  • 63 次阅读
flor
flor

好问题,这正是理解 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,别混):

外设

时钟使能函数

GPIOA~GPIOG

__HAL_RCC_GPIOx_CLK_ENABLE()

AFIO

__HAL_RCC_AFIO_CLK_ENABLE()

USART1

__HAL_RCC_USART1_CLK_ENABLE()

SPI1

__HAL_RCC_SPI1_CLK_ENABLE()

TIM1 / TIM8

__HAL_RCC_TIM1/8_CLK_ENABLE()

ADC1/2/3

__HAL_RCC_ADCx_CLK_ENABLE()

EXTI

(由 AFIO 管理,使能 AFIO 即可)

APB1(低速 36MHz):

外设

时钟使能函数

USART2/3

__HAL_RCC_USART2/3_CLK_ENABLE()

SPI2/3

__HAL_RCC_SPI2/3_CLK_ENABLE()

I2C1/2

__HAL_RCC_I2Cx_CLK_ENABLE()

TIM2~TIM7

__HAL_RCC_TIMx_CLK_ENABLE()

CAN1

__HAL_RCC_CAN1_CLK_ENABLE()

USB

__HAL_RCC_USB_CLK_ENABLE()(还要 PLL 出 48MHz)

DAC

__HAL_RCC_DAC_CLK_ENABLE()

PWR / BKP

__HAL_RCC_PWR_CLK_ENABLE()(RTC 解锁用)

WWDG

__HAL_RCC_WWDG_CLK_ENABLE()

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(服务它们的数据搬运)
     │                           │
     └──────────┬────────────────┘
                ▼
        综合项目(全部串联)

关键结论:

  1. RCC 在 AHB 上,但它是时钟中枢——所有外设的第一依赖

  2. GPIO + AFIO + NVIC 是三大公共前置——几乎所有通信/中断外设都要先过这三关

  3. DMA 只依赖 RCC,但服务于外设——所以它早学(阶段 4),因为 USART/ADC/SPI 后面都要用

  4. IWDG/RTC 是"独立王国"——不依赖总线时钟,学的时候不用管 RCC

这也正好解释了目录顺序为什么是 RCC→GPIO→AFIO→SysTick→EXTI→NVIC,先把公共前置全部打通,后面的外设实验就只剩"该外设自己的参数配置"了。

目录
  1. 一、RCC 到底在哪一层?——双重身份
  2. 二、F1 时钟树:RCC 输出哪些时钟
  3. 三、各外设挂在哪个总线(F1 特例注意!)
  4. 四、各外设完整依赖链(重点)
    1. 1. GPIO(最基础)
    2. 2. AFIO(复用接线员)
    3. 3. EXTI 外部中断
    4. 4. USART1(阶段 2)
    5. 5. TIM(阶段 3)
    6. 6. ADC(阶段 7)
    7. 7. SPI(阶段 5)
    8. 8. I2C(阶段 6)
    9. 9. DMA(阶段 4)
    10. 10. CAN / USB(阶段 11/12,协议级)
    11. 11. RTC / IWDG(阶段 9/10,备份域与独立源)
  5. 五、一张图看懂"谁依赖谁"
湘ICP备2025147565号-1
gongan beian 湘公网安备43102602000213号