一、STM32高级外设总线
在STM32中,APB1和APB2是两条用于连接不同外设的高级外设总线(Advanced Peripheral Bus)。
它们之间最核心的区别在于速度等级,我们可以把它们理解为芯片内部连接不同外设的“高速路”和“普通路”。
🔎 APB1 vs APB2:核心差异速览
| 特性 | APB1 (低速总线) | APB2 (高速总线) |
|---|---|---|
| 速度等级 | 低速外设总线 | 高速外设总线 |
| 最大频率 (F1系列) | 36 MHz | 72 MHz |
| 最大频率 (F4系列) | 42 MHz | 84 MHz |
| 主要特点 | 连接对时钟频率要求不高的外设,有助于优化功耗 | 连接需要高响应速度的外设,保证性能 |
| 典型外设 | USART2/3, I2C, SPI2/3, 通用定时器(TIM2-7), CAN等 | 所有GPIO(GPIOA-GPIOG), USART1, SPI1, ADC, 高级定时器(TIM1/8)等 |
从表格中可以看到,所有GPIO端口都挂载在高速的APB2总线上,这也是为什么你的代码中开启GPIOA时钟时,使用的是RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE)。
💡 为什么这样设计?
这种设计主要有两个目的:
按需分配,保障性能:将USART1(高速串口)、SPI1(高速SPI)、ADC(模数转换器)等需要高速时钟的外设挂在APB2上;而将I2C、CAN、USART2/3等对速度不敏感的外设放在APB1上。
优化功耗:STM32为了省电,所有外设时钟默认是关闭的。这种分组设计允许我们独立控制每条总线的时钟频率,甚至可以单独关闭某条总线上所有不用的外设时钟,从而精细管理功耗。
🧭 如何查找外设挂在哪个总线?
最可靠的方法是查阅你所用芯片的《参考手册》(Reference Manual)。在手册的存储器映射(Memory Map)章节,通常会有一个表格,清晰地列出所有外设及其所属的总线和地址。
一个小技巧是,在代码中通过宏定义的名字也能看出来:
APB1的外设,其时钟使能宏通常以
RCC_APB1Periph_开头。APB2的外设,其时钟使能宏通常以
RCC_APB2Periph_开头。
💎 总结
简单来说,配置外设时钟时,可以遵循这个原则:高速外设(如GPIO、USART1、SPI1、ADC、高级定时器)找APB2,低速外设(如USART2/3、I2C、SPI2/3、通用定时器)找APB1。
二、STM32 GPIO 的输出模式
STM32 GPIO 的输出模式一共有四种,可以分为“通用输出”和“复用输出”两大类。
通用输出:引脚由你写的代码(如
GPIO_SetBits)直接控制。复用输出:引脚由芯片内部的外设(如串口、定时器)控制。
下面我们来逐一了解这四种模式。
⚡️ 推挽输出 (Push-Pull Output)
这就是在代码里用的GPIO_Mode_Out_PP。
原理:内部有两个开关管,一个接电源(VCC),一个接地(GND)。输出高电平时,接电源的开关导通,“推”出电流;输出低电平时,接地的开关导通,“拉”回电流。
特点:
驱动能力强:可以主动输出高低电平。
速度快:电平切换迅速,上升沿时间短。
应用场景:适合驱动数字器件,比如你用来控制LED、驱动蜂鸣器、控制继电器等。
🌊 开漏输出 (Open-Drain Output)
对应代码中的GPIO_Mode_Out_OD。
原理:内部只有接地的开关管(N-MOS)。输出低电平时,开关导通,引脚被拉到地(0V);输出高电平时,开关断开,引脚处于高阻态(High-Z),既不输出高也不输出低。
特点:
不能独立输出高电平:要输出高电平,必须在外部接一个上拉电阻到电源。
可实现“线与”功能:多个开漏引脚可以直接连在一起,共用一个上拉电阻。只要有一个输出低电平,整条线就是低电平,实现了“逻辑与”。
应用场景:
I2C总线:这是最典型的应用,用于实现多设备通信。
电平转换:通过改变上拉电阻的电源电压(如5V),可以让输出高电平匹配不同电压的设备。
🔄 复用推挽输出 (Alternate Function Push-Pull Output)
对应代码中的GPIO_Mode_AF_PP。
原理:引脚内部连接到某个外设(如USART、SPI、PWM定时器),由该外设直接驱动。其电气特性与推挽输出一样。
应用场景:用于需要输出功能的复用外设,例如:
USART的TX(发送)引脚。
SPI的MOSI、SCK引脚。
PWM(脉宽调制)输出引脚。
🔄 复用开漏输出 (Alternate Function Open-Drain Output)
对应代码中的GPIO_Mode_AF_OD。
原理:引脚同样连接到内部外设,由外设控制。其电气特性与开漏输出一样。
应用场景:主要用于需要“线与”功能的总线协议,最典型的就是I2C的SDA和SCL引脚。
💎 总结
为了方便记忆,你可以这样理解四种模式的选择:
| 模式 | 核心一句话 | 典型应用 |
|---|---|---|
| 推挽输出 | “大力士”,能推能拉,驱动能力强。 | 点LED、驱动蜂鸣器、控制继电器。 |
| 开漏输出 | “受控开关”,只能拉低,高电平靠外部电阻。 | I2C总线、电平匹配。 |
| 复用推挽输出 | 推挽输出由内部外设接管。 | USART_TX、SPI_MOSI、PWM输出。 |
| 复用开漏输出 | 开漏输出由内部外设接管。 | I2C的SDA/SCL引脚。 |
理解这几种模式的区别,是配置STM32外设的基础。
💎参考:
想要对推挽输出和开漏输出有更深刻的理解,可以参考下面的文章:
电路图分析:GPIO推挽输出 + 开漏输出 - 21ic电子网