浮云落笔

浮云落笔

首页
瞬间
反馈
浮云落笔

浮云落笔

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

RCC外设依赖

  • 发布于 2026-08-20
  • 5 次阅读
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,先把公共前置全部打通,后面的外设实验就只剩"该外设自己的参数配置"了。

目录
湘ICP备2025147565号-1
gongan beian 湘公网安备43102602000213号