
一、STM32高级外设总线在STM32中APB1和APB2是两条用于连接不同外设的高级外设总线Advanced Peripheral Bus。它们之间最核心的区别在于速度等级我们可以把它们理解为芯片内部连接不同外设的“高速路”和“普通路”。 APB1 vs APB2核心差异速览特性APB1 (低速总线)APB2 (高速总线)速度等级低速外设总线高速外设总线最大频率 (F1系列)36 MHz72 MHz最大频率 (F4系列)42 MHz84 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电子网