嵌入式笔记4.1 GPIO 功能复用

news/发布时间2024/5/18 16:10:25

目录
  • 一、了解 MCU(GPIO)具有的所有复用功能
    • 通过查看 MCU 的数据手册可以知道 MCU 的所有引脚的功能:
      • 例 STM32L431:
      • 例 stm32f103:
      • 复用、重映射、多路复用(多功能引脚)
        • GPIO复用(AF - Alternate Function)
        • 重映射(Remapping)
        • 多路复用(Multi-function)
      • 常见引脚功能一览表(stm32l431):
  • 二、设置 GPIO 使用复用功能的步骤
    • 通过查看 MCU 的参考手册可以知道 MCU 的所有引脚的功能的配置方法:
      • 例 STM32L431(多路复用):
      • 例 STM32F103:

一、了解 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 则使用的是多路复用概念。(以下为 glm-4 提供)

GPIO复用(AF - Alternate Function)

GPIO复用是指STM32的某些引脚可以除了提供标准的输入输出功能外,还可以被内置的外设(如定时器、串口、SPI、I2C等)用作特定的功能引脚。这些引脚通常被标记为AF(Alternate Function),表示它们有备选功能。

特点

  • 每个GPIO引脚可以有一个或多个复用功能。
  • 在任何时刻,一个引脚只能启用一个复用功能。
  • 复用功能的选择通常通过软件配置。

配置步骤

  1. 使能GPIO时钟:通过RCC(Reset and Clock Control)来使能GPIO端口的时钟。
  2. 使能外设时钟:如果复用的外设不是默认使能的,需要通过RCC使能外设时钟。
  3. 配置GPIO模式:将GPIO配置为复用功能模式(通常是GPIO_Mode_AF_PPGPIO_Mode_AF_OD)。
重映射(Remapping)

重映射功能允许设计者将某些内置外设的引脚功能重新分配到不同的GPIO引脚上。这是非常有用的,因为在某些封装或板上空间受限的情况下,可能需要重新安排引脚的布局。

特点

  • 重映射是通过配置特定的寄存器来实现的。
  • 并非所有外设的引脚都可以重映射。
  • 重映射可以减少PCB走线复杂度,减少信号干扰。

配置步骤

  1. 确定重映射选项:在数据手册或参考手册中查找可用的重映射选项。
  2. 配置重映射寄存器:使用AFIO(Alternative Function Input/Output)的映射寄存器来设置重映射。
多路复用(Multi-function)

多路复用通常指的是一个引脚可以支持多个不同的复用功能。这意味着同一个引脚可以根据需要被不同的外设使用。

特点

  • 多路复用增加了设计的灵活性。
  • 需要在软件中进行选择,以决定哪个功能被激活。
  • 通常,一个引脚的复用功能选择是通过配置GPIO端口复用寄存器来实现的。

配置步骤

  1. 选择复用功能:根据设计需求,选择需要启用的复用功能。
  2. 配置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(多路复用):

  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 还有其他寄存器,这里就不细讲了,详情可参见《STM32F10xxx参考手册》8.4节。 ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ulsteruni.cn/article/84822277.html

如若内容造成侵权/违法违规/事实不符,请联系编程大学网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

图文结合手把手教你创建SpringCloud项目

前言 什么是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的开发便利性简化了分布式系统的开发,比如服务注册、服务发现、网关、路由、链路追踪等。Spring Cloud 并不是重复造轮子,而是将市面上开发得比较好的模块集成进去,进行封装,从而减少了…

关于双向循环列表的插入、删除、遍历

目录 双向循环链表公式初始化双向循环链表 构建双向循环链表结构体 // 双向循环链表节点定义 typedef struct double_loop_node { char data[DATA_LEN]; // 数据域,存储数据长度 struct double_loop_node *next; …

博客园主题美化

博客园主题美化 参考链接 https://www.cnblogs.com/zlzgzlz/p/17656741.html

Redis 面试知识点

1、Redis缓存数据库一致性采用最终一致性,而不是采用强一致性,强一致性会导致系统吞吐量变差;采用双删除的策略,第二次删除,采用延迟删除;推荐采用,先操作数据库,直接删除缓存的方式;删除失败的情况,采用异步方式,重试操作;读取binlog异步删除,使用开源框架canal,…

日志服务 HarmonyOS NEXT 日志采集最佳实践

背景信息 随着数字化新时代的全面展开以及 5G 与物联网(IoT)技术的迅速普及,操作系统正面临前所未有的变革需求。在这个背景下,华为公司自主研发的鸿蒙操作系统(HarmonyOS)应运而生,旨在满足万物互联时代的多元化设备接入、高效协同和安全可靠运行的需求。 HarmonyOS 不…

LFI to RCE [NewStarCtf]Include

记录一个没见过的RCE类型题目。先看源码:点击查看代码 <?phperror_reporting(0);if(isset($_GET[file])) {$file = $_GET[file];if(preg_match(/flag|log|session|filter|input|data/i, $file)) {die(hacker!);}include($file.".php");# Something in phpinfo.p…