Loading

嵌入式笔记4.1 GPIO 功能复用

一、了解 MCU(GPIO)具有的所有复用功能

通过查看 MCU 的数据手册可以知道 MCU 的所有引脚的功能:

例 STM32L431:

目录位置:

具体信息:

  1. 引脚与引脚说明目录下的 表14. 引脚表中使用的图例/缩写:

从这个表中我们可以知道引脚的类型有3种,分别为电源引脚(S)仅输入引脚(I)输入/输出引脚(I/O);I/O结构有三种,5V 容忍 I/O(FT)3.6V 容忍 I/O(TT)带嵌入式弱上拉电阻器的双向复位引脚(RST),以及两种TT或FT的可选项;引脚的功能有两种,复用功能(通过 GPIOx AFR 寄存器选择)附加功能(通过外围寄存器直接选择/启用)。以上这些应该都是比较常见的。

  1. 表15. 引脚定义:

这个表格中我们可以查到某型号 MCU 所有引脚编号对应的引脚名称、引脚类型、I/O 结构、引脚功能。即 MCU 所有功能及其对应使用的引脚信息。

  1. 表16. AF0 到 AF7 复用功能表(通过 GPIOx AFR 寄存器选择):

这个表中我们可以的到复用功能标号 AF0 到 AF7 对应 GPIOx 引脚的复用功能。需要使用某个复用功能时只需查看这个表,然后通过通过GPIOx AFR寄存器设置使用。

  1. 表17. AF8 到 AF15 复用功能表:

为表16的续表,复用功能标号 AF8 到 AF15 对应 GPIOx 引脚的复用功能。其实我们可以看到 stm32L431 是将所有 GPIO 引脚功能用功能按 AF0~AF15 编号

例 stm32f103:

目录位置:

具体信息:

与 stm32l431 不同,因为 stm32f103 还在使用重映射概念,所以数据手册只有一个展示所有引脚功能的引脚定义表:

这个表格中我们可以查到某型号 MCU 所有引脚编号对应的引脚名称、引脚类型、I/O 结构、引脚功能。即 MCU 所有功能及其对应使用的引脚信息。


复用、重映射、多路复用(多功能引脚)

通过查阅 stm32L4 和 stm32F1 的参考手册可以知道这两款 mcu 的 GPIO 引脚复用的方式是有所不同的,其中 stm32F1 仍在使用重映射的概念,而 stm32L4 则使用的是多路复用概念。

复用(Multiplexing)

复用(Multiplexing)指的是GPIO引脚可以配置为多个不同的功能,即一个引脚可以连接到多个不同的外设。这通常通过配置GPIO引脚的Alternate Function(AF)寄存器来实现。复用使得一个引脚能够在不同的时间执行不同的功能,增加了引脚的利用效率。

  • 配置方式:通过设置GPIOx_AFRL和GPIOx_AFRH寄存器。
  • 用途:允许单个引脚承担多种功能(如UART、SPI、I2C等)。
  • 示例:一个GPIO引脚既可以用作UART的TX引脚,也可以用作I2C的SDA引脚,具体取决于配置的AF值。

重映射(Remapping)

重映射(Remapping)指的是改变外设的引脚分配,即将某个外设的功能从默认引脚重新映射到其他引脚上。这在某些情况下非常有用,例如,当默认引脚被其他功能占用时,可以通过重映射来避免冲突。

  • 配置方式:通过配置SYSCFG寄存器或特定的重映射控制寄存器(如AFIO_MAPR)。
  • 用途:改变外设与引脚的默认连接关系,以避免引脚冲突或优化PCB布局。
  • 示例:将USART1的TX引脚从默认的PA9重映射到PB6。

多路复用(Multiplexing)

多路复用(Multiplexing)在更广泛的电子学概念中是指多个信号通过一个通道传输,但在STM32中,多路复用通常与复用的概念相似,指的是引脚可以承担多种功能。这是通过配置不同的Alternate Function(AF)来实现的。

  • 配置方式:同样通过GPIO的AF寄存器配置。
  • 用途:允许多个外设功能共享同一个引脚。
  • 示例:一个引脚可以根据AF设置在不同的时间点用作不同的外设功能。

区别

  • 复用和多路复用:在STM32的上下文中,复用和多路复用几乎是同义词,都指的是引脚可以配置为多种功能。区别在于多路复用在更广泛的电子学概念中还包含信号通过单个通道传输的意义。
  • 重映射:重映射是指改变外设功能的引脚分配,而不是单纯地在一个引脚上切换不同的功能。重映射改变了外设与引脚的默认连接关系。

举例说明

假设有一个STM32微控制器,其PA9引脚默认用于USART1的TX功能:

  1. 复用(Multiplexing):PA9引脚可以配置为USART1_TX、TIM1_CH2、或I2C1_SCL等功能,这取决于设置的AF值。
  2. 重映射(Remapping):通过SYSCFG寄存器,可以将USART1_TX功能从PA9重映射到PB6,从而释放PA9用于其他用途。
  3. 多路复用(Multiplexing):与复用概念类似,指PA9引脚可以在不同的时间配置为不同的外设功能,通过设置AF值实现。

统一的多路复用机制

最新的STM32微控制器(如STM32F4、STM32F7、STM32H7等系列)在引脚功能配置方面采用了统一的多路复用机制。这种机制整合了引脚复用和重映射的功能,提供了一种通过配置GPIO引脚的Alternate Function(AF)寄存器来选择引脚功能的统一方法。

  • 复用(Multiplexing):通过配置AF寄存器,将一个引脚配置为不同的外设功能。
  • 重映射(Remapping):通过同样的AF寄存器配置,可以将外设功能映射到不同的引脚上,从而实现引脚功能的灵活重配置。

配置方式

在这些最新的STM32微控制器中,每个GPIO引脚都有多个AF配置选项,这些选项定义在GPIOx_AFRL(低寄存器)和GPIOx_AFRH(高寄存器)中。通过设置这些寄存器的值,可以选择特定的引脚功能。

  • GPIOx_AFRL:配置GPIO引脚0-7的复用功能。
  • GPIOx_AFRH:配置GPIO引脚8-15的复用功能。

每个引脚的AF寄存器可以配置为0到15共16种不同的功能,具体功能取决于具体的微控制器型号和引脚。

实例

假设使用一个STM32F4微控制器,配置PA9引脚的功能:

  • 默认配置:PA9可能默认用于USART1_TX。
  • 复用配置:通过设置AF寄存器,PA9可以配置为USART1_TX(AF7),TIM1_CH2(AF1),I2C1_SCL(AF4)等。
  • 重映射:如果需要将USART1_TX从PA9重映射到另一个引脚(如PB6),也通过设置相应引脚的AF寄存器来实现,例如将PB6的AF寄存器设置为AF7。

结论

在最新的STM32微控制器中,多路复用机制通过AF寄存器的配置,提供了统一的引脚功能选择和映射方法。复用和重映射的概念被简化和统一为多路复用机制的一部分,使得引脚功能配置更加灵活和简便。这种机制不仅提高了引脚利用率,还简化了开发过程中引脚配置的复杂性。


Alternate Functions 和 Additional Functions

在STM32微控制器中,Alternate Functions(AF)和 Additional Functions具有不同的含义和用途,尽管它们在某些方面可能有所重叠。

Alternate Functions(AF)

Alternate Functions(AF)指的是GPIO引脚可以配置为多种不同的功能,而不仅仅是简单的输入或输出。这些功能通常与微控制器的外设相关联,如UART、SPI、I2C、TIM等。例如,一个GPIO引脚可以配置为UART的TX引脚、I2C的SCL引脚或SPI的MOSI引脚等。

  • 配置方式:通过配置GPIO的AF寄存器(例如,GPIOx_AFRL和GPIOx_AFRH)来选择引脚的具体功能。
  • 用途:用于连接微控制器内部外设与引脚之间的连接,以实现外设功能。
  • 示例:将GPIOA的引脚PA2配置为USART2的TX引脚,通过设置PA2的AF寄存器为AF7来实现。

Additional Functions

Additional Functions(附加功能)指的是GPIO引脚除了基本的输入/输出功能外,还可能具备的其它特殊功能。这些附加功能通常与引脚的具体特性或硬件实现相关,可能包括以下几类:

  1. 内部上拉/下拉电阻:某些引脚可以配置为内部上拉或下拉,以稳定未使用引脚的电平。
  2. 开漏输出:某些引脚可以配置为开漏输出模式,用于I2C通信或其他需要多路复用的总线。
  3. 高速/慢速模式:可以配置引脚的速度,以满足不同的电气特性要求。
  4. 模拟功能:某些引脚可以配置为模拟输入,用于ADC或者DAC。
  • 配置方式:通过GPIO的其他配置寄存器(如GPIOx_MODER、GPIOx_PUPDR、GPIOx_OTYPER等)来实现。
  • 用途:提供对引脚更细粒度的控制,以满足具体应用需求。
  • 示例:将某引脚配置为开漏输出模式以用于I2C通信。

总结

  • Alternate Functions(AF):主要用于配置GPIO引脚与微控制器内部外设的连接。
  • Additional Functions:用于配置GPIO引脚的各种附加特性和模式,以适应不同的应用场景。

这两种功能互相补充,使得STM32的GPIO引脚能够灵活地适应各种复杂的应用需求。


常见引脚功能一览表(stm32l431 复用功能):

功能类型 功能名称 中文信息
MCO MCO 是 "Main Clock Output" 的缩写,
意为主时钟输出。
JTAG[1] JTMS:JTAG 模式选择(控制信号)引脚
JTCK:JTAG 时钟引脚
JTDI:JTAG 串行输入引脚
JTDO:JTAG 串行输出引脚
NJTRST[2]:非 JTAG 的 TRST(复位引脚)引脚
JTAG 调试接口
SWD[3] SWDIO:串行数据输入输出引脚
SWCLK:串行线时钟引脚
串行线调试接口
RTC[4] RTC_OUT:实时时钟的输出引脚
RTC_REFIN:参考时钟输入引脚
实时时钟
Trace TRACECK[5]:跟踪时钟引脚
TRACED:跟踪数据输出引脚
跟踪
LPUART[6] LPUART_RX:低功耗串口接收引脚
LPUART_TX:低功耗串口发送引脚
LPUART_CTS:低功耗串口清除发送引脚
LPUART_RTS _DE:低功耗串口请求发送/数据使能引脚
低功耗串行通信接口
TIM1/TIM8 TIM1_CH1:定时器通道1引脚
TIM1_CH1N:定时器通道1互补输出[7]引脚
TIM1_ETR:定时器外部触发输入引脚
TIM1_BKIN:定时器断点输入
TIM1_BKIN_ COMP
高级控制定时器
TIMx TIMx_CH1:定时器通道1引脚
TIMx_ETR:定时器外部触发输入引脚
通用定时器
TIM6/TIM7 - 基本定时器
LPTIM LPTIM_OUT:低功耗定时器输出引脚
LPTIM_IN:低功耗定时器输入引脚
LPTIM_ETR:低功耗定时器外部触发输入引脚
低功耗定时器
IR_OUT IR_OUT 红外输出
CAN[8] CAN_RX:CAN 总线接收引脚
CAN_TX:CAN 总线发送引脚
控制器局域网总线
TSC[9] TSC_Gx_IO:TSC 通用输入输出引脚
TSC_SYNC:TSC 同步输入引脚
触摸感应控制器外设
SPI[10] SPI_SCK:SPI 时钟信号引脚
SPI_NSS:SPI 片选信号引脚
SPI_MISO:SPI 主输入从输出引脚
SPI_MOSI:SPI 主输出从输入引脚
串行外设接口
QUADSPI[11] QUADSPI_ BK1_NCS:QSPI Bank1 芯片选择信号引脚
QUADSPI_CLK:QSPI 时钟信号引脚
QUADSPI_BK1_IO:QSPI Bank1 芯片(外设)输入输出引脚
四线串行外设接口
USART[12] USART_RX:USART 接收引脚
USART_TX:USART 发送引脚
USART_CK:USART 时钟引脚
USART_CTS:USART 清除发送(控制流)引脚
USART2_RTS_DE:USART 请求发送/数据使能引脚
通用同步/异步串行通信接口
I2C[13] I2C_SMBA:I2C 系统管理总线(SMBus)警报引脚
I2C_SCL:I2C 时钟引脚
I2C_SDA:I2C 串行数据引脚
集成电路间串行通信总线
SWPMI[14] SWPMI_RX:SWPMI 接收引脚
SWPMI_TX:SWPMI 发送引脚
SWPMI_SUSPEND:SWPMI 挂起引脚
SWPMI_IO :SWPMI 输入输出引脚
单线协议主控接口
SDMMC[15] SDMMC_D:SDMMC 数据引脚
SDMMC_CK:SDMMC 时钟引脚
SDMMC_CMD:SDMMC 命令引脚
存储卡接口
SAI[16] SAI_EXTCLK:SAI 外部时钟输入引脚
SAI_MCLK_A:SAI 端口 A 主时钟输入引脚
SAI_SCK_A:SAI 端口 A 时钟引脚
SAI_FS_A:SAI 端口 A 帧同步输入引脚
SAI_SD_A:SAI 端口 A 串行数据输出引脚
串行音频接口
COMP COMP_OUT:COMP 输出引脚 模拟比较器
EVENTOUT EVENTOUT 可编程的事件触发输出引脚

想要了解 JTAG 和 SWD 的区别可以看这两篇文章:SWD 与 JTAG 的区别与联系下载调试接口 SWD 和 JTAG的区别

想要详细了解 SPI 和 QSPI 可以浏览:25. SPI—读写串行FLASH21. QSPI—读写串行FLASH简单介绍SPI/Dual SPI/Quad SPI几种通讯模式的差异

二、设置 GPIO 使用复用功能的步骤

通过查看 MCU 的参考手册可以知道 MCU 的所有引脚的功能的配置方法:

例 STM32L431(多路复用):

  1. 打开需配置复用的 GPIO 端口时钟
  2. 打开需复用的功能(外设)的时钟
  3. 配置使用复用功能的 GPIO 端口引脚的 GPIO 寄存器
    • GPIO 端口模式寄存器对应引脚置为 10--复用功能模式
    • GPIO 端口输出型寄存器、输出速度寄存器、上拉/下拉寄存器对应引脚位置按外设 GPIO 配置表[17]进行配置
    • GPIO 复用功能寄存器配置对应引脚位置为复用功能编号(AFx)
  4. 配置对应复用功能寄存器组

目录位置:

部分信息:

例 STM32F103:

  1. 打开需配置复用的 GPIO 端口时钟
  2. 打开需复用的功能(外设)的时钟
  3. 按外设 GPIO 配置表[17:1]配置使用复用功能的 GPIO 端口配置寄存器的对应引脚位
  4. 配置对应复用功能寄存器组

若使用重映射功能:

  1. 打开需配置复用的 GPIO 端口时钟
  2. 打开需复用的功能(外设)的时钟
  3. 按外设 GPIO 配置表[17:2]配置使用复用功能的 GPIO 端口配置寄存器的对应引脚位
  4. 打开 AFIO 时钟
  5. 配置复用重映射和调试 I/O 配置寄存器(AFIO_MAPR)[18]
  6. 配置对应复用功能寄存器组

  1. JTAG联合测试工作组(Joint Test Action Group)的简称,是在名为标准测试访问端口和边界扫描结构的 IEEE 的标准 1149.1 的常用名称。此标准用于验证设计与测试生产出的印刷电路板功能。 ↩︎

  2. NJTRST非 JTAG TRST(Non-JTAG TRST)的缩写。在 JTAG 调试接口中,TRST(Test Reset)信号用于复位 JTAG 链上的所有设备。NJTRST 通常被用于与 JTAG 接口兼容的设备中,但是这些设备可能不支持标准的 JTAG 复位。通过使用 NJTRST,可以实现对这些设备的复位功能,而不依赖于标准的 JTAG TRST 信号 。 ↩︎

  3. SWD串行线调试(Serial Wire Debug)的简称,是 ARM 专门设计的协议,仅支持 ARM(所以在 ARM 系列单片机中性能表现较佳)。 ↩︎

  4. RTC实时时钟(Real-Time Clock)的缩写。实时时钟是一个独立的定时器。 RTC模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。 ↩︎

  5. TRACECK跟踪时钟(Trace Clock)的缩写。TRACECK 通常用于连接到调试接口(如 SWD 或 JTAG)上,以支持实时跟踪程序执行流程、调试代码、性能分析和软件优化等功能。 ↩︎

  6. LPUART低功耗通用异步收发器(Low Power Universal Asynchronous Receiver Transmitter)的缩写。LPUART1 是 STM32 系列微控制器中的一个串行通信接口,具有低功耗特性,适用于对功耗要求较高的应用场景。 ↩︎

  7. 互补输出:TIM1_CH1N 提供与 TIM1_CH1 相位相反的信号。当 TIM1_CH1 输出高电平时,TIM1_CH1N 输出低电平,反之亦然。这非常适合驱动电机的上下桥臂,以实现电流方向的切换。 ↩︎

  8. CAN控制器局域网总线(Controller Area Network)的缩写,是一种广泛应用于汽车和工业领域的串行通信协议,用于在节点之间进行数据通信。 ↩︎

  9. TSC触摸感应控制器外设(Touch Sensing Controller)的缩写,是一种集成在 STM32 微控制器中的功能模块,用于实现触摸感应功能。该模块允许您通过触摸屏、触摸按钮、滑动控件等方式与设备进行交互。 ↩︎

  10. SPI 协议是由摩托罗拉公司提出的通讯协议——串行外设接口(Serial Peripheral Interface)的缩写,是一种高速全双工的通信总线。它被广泛地使用在 ADC、LCD 等设备与 MCU 间,要求通讯速率较高的场合。 ↩︎

  11. QSPI四线串行外设接口(Queued SPI)的缩写,是 Motorola 公司推出的 SPI 接口的扩展,比 SPI 应用更加广泛。在 SPI 协议的基础上,Motorola 公司对其功能进行了增强,增加了队列传输机制,推出了队列串行外围接口协议(即 QSPI 协议)。QSPI 是一种专用的通信接口,连接单、双或四(条数据线) SPI Flash 存储介质。 ↩︎

  12. USART 代表通用同步/异步串行接口(Universal Synchronous/Asynchronous Receiver/Transmitter)。USART 是一种通用的串行通信接口,常见于微控制器和外部设备之间的通信。它可以支持同步传输(使用外部时钟)和异步传输(使用特定的波特率)两种模式。 ↩︎

  13. I2C 通讯协议(Inter-Integrated Circuit)是由 Phiilps 公司开发的,由于它引脚少,硬件实现简单,可扩展性强, 不需要USART、CAN 等通讯协议的外部收发设备,现在被广泛地使用在系统内多个集成电路(IC)间的通讯。I2C 模块有多种用途,包括 CRC 码的生成和校验、 SMBus(系统管理总线—System Management Bus)和 PMBus(电源管理总线—Power Management Bus)。 ↩︎

  14. SWP 协议即单线协议(Single Wire Protocol),是目前 在ETSI 已有成熟技术要求和测试方法的一种用于在非接触通信模块(ContactLess Frontend: CLF)与 USIM 卡间传输信息的接口协议,确切来说 SWP 协议定义了 CLF 模块和 USIM 卡内的 SE 芯片传输信息的物理连接形式和底层信号传输要求等(包括物理层、数据链路层);SWPMI单线协议主接口(Single Wire Protocol Master Interface)的缩写,SWPMI 旨在根据ETSI TS 102 613 标准中定义的单线协议实现全双工单线通信;某些 STM32 还嵌入了 SWP 收发 SWPMI 对应于第 2 层(数据链路层),SWP 收发器对应于第 1 层(物理层)。 ↩︎

  15. SDMMCSecure Digital Memory Card(SD卡)MultiMediaCard(多媒体卡)接口的缩写,是一种用于连接 SD 卡和 MMC 卡的接口标准。SD 卡是一种常见的用于存储数据的闪存存储卡,而 MMC 卡也是一种类似的闪存存储卡。SDMMC 接口标准定义了一种用于在计算机系统和这些存储卡之间进行数据传输的通信协议。 ↩︎

  16. SAI串行音频接口(Serial Audio Interface)的缩写,是一种用于在数字音频设备之间传输音频数据的串行通信接口。SAI 通常用于连接音频编解码器、数字信号处理器、音频接口等设备,用于实现音频数据的传输和处理,具有灵活性高、配置多样等特点,可支持多种音频协议。 ↩︎

  17. 在 stm32f1 参考手册中有一张 外设的 GPIO 配置表,其给出了 GPIO 配置各种复用功能时需要设置的 GPIO 配置,在 stm32l4 参考手册中我并没有找到这张表。以下为表的位置和部分信息: ↩︎ ↩︎ ↩︎

  18. AFIO 还有其他寄存器,这里就不细讲了,详情可参见8.4节。 ↩︎

posted @ 2024-04-26 00:49  一只心耳  阅读(468)  评论(0编辑  收藏  举报