- 一、了解 MCU(GPIO)具有的所有复用功能
- 通过查看 MCU 的数据手册可以知道 MCU 的所有引脚的功能:
- 例 STM32L431:
- 例 stm32f103:
- 复用、重映射、多路复用(多功能引脚)
- GPIO复用(AF - Alternate Function)
- 重映射(Remapping)
- 多路复用(Multi-function)
- 常见引脚功能一览表(stm32l431):
- 通过查看 MCU 的数据手册可以知道 MCU 的所有引脚的功能:
- 二、设置 GPIO 使用复用功能的步骤
- 通过查看 MCU 的参考手册可以知道 MCU 的所有引脚的功能的配置方法:
- 例 STM32L431(多路复用):
- 例 STM32F103:
- 通过查看 MCU 的参考手册可以知道 MCU 的所有引脚的功能的配置方法:
一、了解 MCU(GPIO)具有的所有复用功能
通过查看 MCU 的数据手册可以知道 MCU 的所有引脚的功能:
例 STM32L431:
目录位置:
具体信息:
- 引脚与引脚说明目录下的 表14. 引脚表中使用的图例/缩写:
从这个表中我们可以知道引脚的类型有3种,分别为电源引脚(S)、仅输入引脚(I)、输入/输出引脚(I/O);I/O结构有三种,5V 容忍 I/O(FT)、3.6V 容忍 I/O(TT)、带嵌入式弱上拉电阻器的双向复位引脚(RST),以及两种TT或FT的可选项;引脚的功能有两种,复用功能(通过 GPIOx AFR 寄存器选择)、附加功能(通过外围寄存器直接选择/启用)。以上这些应该都是比较常见的。
- 表15. 引脚定义:
这个表格中我们可以查到某型号 MCU 所有引脚编号对应的引脚名称、引脚类型、I/O 结构、引脚功能。即 MCU 所有功能及其对应使用的引脚信息。
- 表16. AF0 到 AF7 复用功能表(通过 GPIOx AFR 寄存器选择):
这个表中我们可以的到复用功能标号 AF0 到 AF7 对应 GPIOx 引脚的复用功能。需要使用某个复用功能时只需查看这个表,然后通过通过GPIOx AFR寄存器设置使用。
- 表17. AF8 到 AF15 复用功能表:
为表16的续表,复用功能标号 AF8 到 AF15 对应 GPIOx 引脚的复用功能。其实我们可以看到 stm32L431 是将所有 GPIO 引脚功能用功能按 AF0~AF15 编号
例 stm32f103:
目录位置:
具体信息:
与 stm32l431 不同,因为 stm32f103 还在使用重映射概念,所以数据手册只有一个展示所有引脚功能的引脚定义表:
这个表格中我们可以查到某型号 MCU 所有引脚编号对应的引脚名称、引脚类型、I/O 结构、引脚功能。即 MCU 所有功能及其对应使用的引脚信息。
复用、重映射、多路复用(多功能引脚)
通过查阅 stm32L4 和 stm32F1 的参考手册可以知道这两款 mcu 的 GPIO 引脚复用的方式是有所不同的,其中 stm32F1 仍在使用重映射的概念,而 stm32L4 则使用的是多路复用概念。(以下为 glm-4 提供)
GPIO复用(AF - Alternate Function)
GPIO复用是指STM32的某些引脚可以除了提供标准的输入输出功能外,还可以被内置的外设(如定时器、串口、SPI、I2C等)用作特定的功能引脚。这些引脚通常被标记为AF(Alternate Function),表示它们有备选功能。
特点:
- 每个GPIO引脚可以有一个或多个复用功能。
- 在任何时刻,一个引脚只能启用一个复用功能。
- 复用功能的选择通常通过软件配置。
配置步骤:
- 使能GPIO时钟:通过RCC(Reset and Clock Control)来使能GPIO端口的时钟。
- 使能外设时钟:如果复用的外设不是默认使能的,需要通过RCC使能外设时钟。
- 配置GPIO模式:将GPIO配置为复用功能模式(通常是
GPIO_Mode_AF_PP
或GPIO_Mode_AF_OD
)。
重映射(Remapping)
重映射功能允许设计者将某些内置外设的引脚功能重新分配到不同的GPIO引脚上。这是非常有用的,因为在某些封装或板上空间受限的情况下,可能需要重新安排引脚的布局。
特点:
- 重映射是通过配置特定的寄存器来实现的。
- 并非所有外设的引脚都可以重映射。
- 重映射可以减少PCB走线复杂度,减少信号干扰。
配置步骤:
- 确定重映射选项:在数据手册或参考手册中查找可用的重映射选项。
- 配置重映射寄存器:使用AFIO(Alternative Function Input/Output)的映射寄存器来设置重映射。
多路复用(Multi-function)
多路复用通常指的是一个引脚可以支持多个不同的复用功能。这意味着同一个引脚可以根据需要被不同的外设使用。
特点:
- 多路复用增加了设计的灵活性。
- 需要在软件中进行选择,以决定哪个功能被激活。
- 通常,一个引脚的复用功能选择是通过配置GPIO端口复用寄存器来实现的。
配置步骤:
- 选择复用功能:根据设计需求,选择需要启用的复用功能。
- 配置GPIO端口:通过设置GPIO复用寄存器来选择特定的复用功能。
在实际应用中,例如,STM32的一个GPIO引脚可能同时支持I2C和USART的功能。根据配置的不同,这个引脚可以作为I2C的数据线(SDA)或者作为USART的发送(TX)或接收(RX)线。
在我看来多路复用概念是复用+重映射的整合,我认为其解决了复用+重映射功能复用不清晰、重映射使用复杂等问题,是利好程序员的优化,是GPIO复用更易用了。对于使用多路复用概念的 mcu,进行 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—读写串行FLASH、21. QSPI—读写串行FLASH、简单介绍SPI/Dual SPI/Quad SPI几种通讯模式的差异
二、设置 GPIO 使用复用功能的步骤
通过查看 MCU 的参考手册可以知道 MCU 的所有引脚的功能的配置方法:
例 STM32L431(多路复用):
- 打开需配置复用的 GPIO 端口时钟
- 打开需复用的功能(外设)的时钟
- 配置使用复用功能的 GPIO 端口引脚的 GPIO 寄存器
- GPIO 端口模式寄存器对应引脚置为 10--复用功能模式
- GPIO 端口输出型寄存器、输出速度寄存器、上拉/下拉寄存器对应引脚位置按外设 GPIO 配置表[17]进行配置
- GPIO 复用功能寄存器配置对应引脚位置为复用功能编号(AFx)
- 配置对应复用功能寄存器组
目录位置:
部分信息:
例 STM32F103:
- 打开需配置复用的 GPIO 端口时钟
- 打开需复用的功能(外设)的时钟
- 按外设 GPIO 配置表[17:1]配置使用复用功能的 GPIO 端口配置寄存器的对应引脚位
- 配置对应复用功能寄存器组
若使用重映射功能:
- 打开需配置复用的 GPIO 端口时钟
- 打开需复用的功能(外设)的时钟
- 按外设 GPIO 配置表[17:2]配置使用复用功能的 GPIO 端口配置寄存器的对应引脚位
- 打开 AFIO 时钟
- 配置复用重映射和调试 I/O 配置寄存器(AFIO_MAPR)[18]
- 配置对应复用功能寄存器组
JTAG 是联合测试工作组(Joint Test Action Group)的简称,是在名为标准测试访问端口和边界扫描结构的 IEEE 的标准 1149.1 的常用名称。此标准用于验证设计与测试生产出的印刷电路板功能。 ↩︎
NJTRST 是非 JTAG TRST(Non-JTAG TRST)的缩写。在 JTAG 调试接口中,TRST(Test Reset)信号用于复位 JTAG 链上的所有设备。NJTRST 通常被用于与 JTAG 接口兼容的设备中,但是这些设备可能不支持标准的 JTAG 复位。通过使用 NJTRST,可以实现对这些设备的复位功能,而不依赖于标准的 JTAG TRST 信号 。 ↩︎
SWD 是串行线调试(Serial Wire Debug)的简称,是 ARM 专门设计的协议,仅支持 ARM(所以在 ARM 系列单片机中性能表现较佳)。 ↩︎
RTC 是实时时钟(Real-Time Clock)的缩写。实时时钟是一个独立的定时器。 RTC模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。 ↩︎
TRACECK 是跟踪时钟(Trace Clock)的缩写。TRACECK 通常用于连接到调试接口(如 SWD 或 JTAG)上,以支持实时跟踪程序执行流程、调试代码、性能分析和软件优化等功能。 ↩︎
LPUART 是低功耗通用异步收发器(Low Power Universal Asynchronous Receiver Transmitter)的缩写。LPUART1 是 STM32 系列微控制器中的一个串行通信接口,具有低功耗特性,适用于对功耗要求较高的应用场景。 ↩︎
互补输出:TIM1_CH1N 提供与 TIM1_CH1 相位相反的信号。当 TIM1_CH1 输出高电平时,TIM1_CH1N 输出低电平,反之亦然。这非常适合驱动电机的上下桥臂,以实现电流方向的切换。 ↩︎
CAN 是控制器局域网总线(Controller Area Network)的缩写,是一种广泛应用于汽车和工业领域的串行通信协议,用于在节点之间进行数据通信。 ↩︎
TSC 是触摸感应控制器外设(Touch Sensing Controller)的缩写,是一种集成在 STM32 微控制器中的功能模块,用于实现触摸感应功能。该模块允许您通过触摸屏、触摸按钮、滑动控件等方式与设备进行交互。 ↩︎
SPI 协议是由摩托罗拉公司提出的通讯协议——串行外设接口(Serial Peripheral Interface)的缩写,是一种高速全双工的通信总线。它被广泛地使用在 ADC、LCD 等设备与 MCU 间,要求通讯速率较高的场合。 ↩︎
QSPI 是四线串行外设接口(Queued SPI)的缩写,是 Motorola 公司推出的 SPI 接口的扩展,比 SPI 应用更加广泛。在 SPI 协议的基础上,Motorola 公司对其功能进行了增强,增加了队列传输机制,推出了队列串行外围接口协议(即 QSPI 协议)。QSPI 是一种专用的通信接口,连接单、双或四(条数据线) SPI Flash 存储介质。 ↩︎
USART 代表通用同步/异步串行接口(Universal Synchronous/Asynchronous Receiver/Transmitter)。USART 是一种通用的串行通信接口,常见于微控制器和外部设备之间的通信。它可以支持同步传输(使用外部时钟)和异步传输(使用特定的波特率)两种模式。 ↩︎
I2C 通讯协议(Inter-Integrated Circuit)是由 Phiilps 公司开发的,由于它引脚少,硬件实现简单,可扩展性强, 不需要USART、CAN 等通讯协议的外部收发设备,现在被广泛地使用在系统内多个集成电路(IC)间的通讯。I2C 模块有多种用途,包括 CRC 码的生成和校验、 SMBus(系统管理总线—System Management Bus)和 PMBus(电源管理总线—Power Management Bus)。 ↩︎
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 层(物理层)。 ↩︎
SDMMC 是 Secure Digital Memory Card(SD卡)MultiMediaCard(多媒体卡)接口的缩写,是一种用于连接 SD 卡和 MMC 卡的接口标准。SD 卡是一种常见的用于存储数据的闪存存储卡,而 MMC 卡也是一种类似的闪存存储卡。SDMMC 接口标准定义了一种用于在计算机系统和这些存储卡之间进行数据传输的通信协议。 ↩︎
SAI 是串行音频接口(Serial Audio Interface)的缩写,是一种用于在数字音频设备之间传输音频数据的串行通信接口。SAI 通常用于连接音频编解码器、数字信号处理器、音频接口等设备,用于实现音频数据的传输和处理,具有灵活性高、配置多样等特点,可支持多种音频协议。 ↩︎
在 stm32f1 参考手册中有一张 外设的 GPIO 配置表,其给出了 GPIO 配置各种复用功能时需要设置的 GPIO 配置,在 stm32l4 参考手册中我并没有找到这张表。以下为表的位置和部分信息: ↩︎ ↩︎ ↩︎
AFIO 还有其他寄存器,这里就不细讲了,详情可参见《STM32F10xxx参考手册》8.4节。 ↩︎