22.IO引脚复用和映射原理与配置

本文介绍了STM32的IO端口复用和映射原理,包括端口复用的基础知识,如复用器的工作方式、AFRL和AFRH寄存器的配置,并详细阐述了端口复用配置过程,包括GPIO时钟使能、外设时钟使能、模式配置等步骤,以串口1的PA9和PA10配置为例进行了演示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

IO引脚复用和映射原理与配置

参考资料:
正点原子STM32开发板:
《STM32开发指南-HAL库版本》-4.4 IO引脚复用和映射
STM32F4xx官方资料:
《STM32F4xx中文参考手册》-第7章通用IO

笔记基于正点原子官方视频
视频连接https://www.bilibili.com/video/BV1Wx411d7wT?p=71&spm_id_from=333.1007.top_right_bar_window_history.content.click
如有侵权,联系删除

一、端口复用基础知识
1.什么是端口复用
  • STM32有很多的内置外设,这些外设的外部引脚都是与GPIO复用的。也就是说,一个GPIO如果可以复用为内置外设的功能引脚,那么当这个GPIO作为内置外设使用的时候,就叫做复用。
  • 例如串口1 的发送接收引脚是PA9,PA10,当我们把PA9,PA10不用作GPIO,而用做复用功能串口1的发送接收引脚的时候,叫端口复用。
  • 在位置H:\3.开发板学习\阿波罗STM32F429开发板\STM32F429开发板资料-(A盘)\7,硬件资料\2,芯片资料 下文件 STM32F429IGT6 中有串口复用表,如下图:
    在这里插入图片描述
2.STM32(M4内核以上)的端口复用映射原理
  • STM32系列微控制器IO引脚通过一个复用器连接到内置外设或模块。该复用器一次只允许一个外设的复用功能(AF)连接到对应的IO口。这样可以确保共用同一个IO引脚的外设之间不会发生冲突。

  • 每个IO引脚都有一个复用器,该复用器采用16路复用功能输入(AF0到AF15),可通过GPIOx_AFRL(针对引脚0-7)和GPIOx_AFRH(针对引脚8-15)寄存器对这些输入进行配置,每四位控制一路复用。

  • 端口复用映射示意图
    在这里插入图片描述

  • AFRL复用功能低位寄存器
    在这里插入图片描述

  • AFRH复用功能高位寄存器
    在这里插入图片描述

可以看到AFRH和AFRL都是32位寄存器,然后16个口需要配置16个功能,即需要四位才能配置全4个功能,
AFRL位低八位,可以配置0-7号IO口的16个功能,AFRH位高八位,可以配置8-15号IO口的16个功能,
例如我们要把PA9配置AF7的功能,则需要找到配置PA9的位置区间,在AFRH的第二个区间,配置AF7功能,则需要向AFRH的第二个区间中4个位填入数据0111

3.复用功能映射配置

1)系统功能
将IO连接到AFO,然后根据所用功能进行配置:

  • JTAG/SWD:在各器件复位后,会将这些引脚指定为专用引脚,可供片上调试模块立即使用(不受GPIO控制器控制)。
  • RTC_REFIN:此引脚应配置为输入浮空模式。
  • MCO1和MCO2:这些引脚必须配置为复用功能模式。
    2)GPIO
    在 GPIOx_MODER寄存器中将所需IO配置为输出或输入。
    3)外设复用功能
    对于ADC和 DAC,在GPIOx_MODER寄存器中将所需IO配置为模拟通道。对于其它外设:
  • 在GPIOx_MODER寄存器中将所需ⅣO配置为复用功能
  • 通过GPIOx_OTYPER、GPIOx_PUPDR和 GPIOx_OSPEEDER寄存器,分别选择类型、上拉/下拉以及输出速度
  • 在GPIOx_AFRL或GPIOx_AFRH寄存器中,将I/O连接到所需AFx
二、端口复用配置过程

在工程模板中,位置SYSTEM-usart.c位置下有串口配置程序
在这里插入图片描述

以PA9,PA10配置为串口1为例
①GPIO端口时钟使能。

__HAL_RCC_GPIOA_CLK_ENABLE(); 		//使能GPIO时钟

②复用外设时钟使能。
比如你要将端口PA9,PA10复用为串口,所以要使能串口时钟。

__HAL_RCC_USART1_CLK_ENABLE();		 //使能串口1时钟

③端口模式配置为复用功能。 HAL_GPIO_Init函数。

GPIO_Initure.Mode=GPIO_MODE_AF_PP;		 //复用推挽输出

④配置GPIOx_AFRL或者GPIOx_AFRH寄存器,将IO连接到所需的AFx。HAL_GPIO_Init函数。

GPIO_Initure.Alternate=GPIO_AF7_USART1;		//复用为USART1 

PA9,PA10复用为串口1的配置过程

__HAL_RCC_GPIOA_CLK_ENABLE();			 //使能GPIOA时钟
__HAL_RCC_USART1_CLK_ENABLE(); 		 //使能USART1时钟
GPIO_Initure.Pin=GPIO_PIN_9; 					 //PA9
GPIO_Initure.Mode=GPIO_MODE_AF_PP;	 //复用推挽输出
GPIO_Initure.Pull=GPIO_PULLUP; 				 //上拉
GPIO_Initure.Speed=GPIO_SPEED_FAST; 	 //高速
GPIO_Initure.Alternate=GPIO_AF7_USART1; //复用为USART1
HAL_GPIO_Init(GPIOA,&GPIO_Initure);		  //初始化PA9
GPIO_Initure.Pin=GPIO_PIN_10; 					  //PA10
HAL_GPIO_Init(GPIOA,&GPIO_Initure);		  //初始化PA10
<think>好的,我需要帮助用户了解如何将GPIO配置为UART串口的复用功能。首先,我应该回忆一下之前学过的关于GPIO复用串口配置的知识。根据用户提供的引用内容,特别是引用[1]引用[2],里面提到了复用模式设置以及HAL中的初始化函数。 首先,GPIO复用功能需要将模式设置为复用推挽输出(GPIO_Mode_AF_PP)或者复用开漏输出(GPIO_Mode_AF_OD)。但UART通常使用推挽模式,而I2C才需要开漏,所以这里应该是复用推挽。然后,需要配置具体的复用功能映射,可能需要查找具体的引脚对应的复用功能编号,比如USART1_TX可能对应某个AF编号。 接下来,用户提到的引用[2]中的HAL_UART_MspInit函数,这是HAL中用来初始化底层硬件的,需要在这里配置GPIO、时钟NVIC等。所以步骤大概包括:使能GPIOUART的时钟,配置GPIO的模式复用功能,最后配置UART的参数,比如波特率、数据位等。 另外,引用[4]提到NXP芯片的GPIO配置,可能涉及中断相关的寄存器,但这里用户的问题是关于UART复用,可能暂时不需要中断配置。不过需要注意不同厂商的MCU配置方式可能不同,比如STM32NXP的i.MX6可能有不同的寄存器操作步骤。但用户提供的例子中既有STM32HAL函数,也有NXP的内容,可能需要明确具体平台。但根据引用[2]中的HAL函数,可能用户更关注STM32系列,所以应该以STM32为例说明。 总结步骤应该是: 1. 确定UART对应的GPIO引脚,查阅数据手册或CubeMX配置工具。 2. 使能GPIOUART的时钟。 3. 配置GPIO复用推挽模式,并设置正确的复用功能。 4.HAL_UART_MspInit中完成这些配置。 5. 最后初始化UART参数,如波特率、数据位、停止位等。 可能还需要注意引脚的上下拉配置,是否需要启用。同时,用户可能需要知道如何查找具体的复用功能编号,例如AF7对于STM32的某些USART引脚。此外,用户可能遇到的常见问题包括时钟未使能导致无法工作,或者复用功能配置错误导致信号无法正确传输。 需要确保步骤清晰,分点说明,并引用相关的资料,比如引用[1]提到复用输出模式,引用[2]中的HAL_UART_MspInit函数的使用。可能还需要提醒用户根据具体MCU型号调整复用功能设置,因为不同型号的引脚复用映射可能不同。</think>### 如何配置GPIO为UART串口复用功能? #### 步骤说明 1. **确定引脚复用映射** 根据芯片数据手册或开发板原理图,找到UART对应的GPIO引脚。例如,STM32的USART1_TX通常对应PA9(复用推挽输出),USART1_RX对应PA10(浮空输入或复用模式)[^1][^4]。 2. **使能时钟** 启用GPIOUART外设的时钟。例如,在STM32中,使用以下代码使能USART1GPIOA的时钟: ```c __HAL_RCC_GPIOA_CLK_ENABLE(); // 使能GPIOA时钟 __HAL_RCC_USART1_CLK_ENABLE(); // 使能USART1时钟 ``` 3. **配置GPIO复用模式** - **TX引脚(发送端)**:设为复用推挽输出(`GPIO_MODE_AF_PP`),例如: ```c GPIO_InitStruct.Pin = GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // 复用推挽输出 GPIO_InitStruct.Pull = GPIO_NOPULL; // 无上下拉 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; // 高速模式 GPIO_InitStruct.Alternate = GPIO_AF7_USART1; // 复用功能AF7(具体值需查手册) HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); ``` - **RX引脚(接收端)**:设为复用输入(`GPIO_MODE_AF_INPUT`)或浮空输入,例如: ```c GPIO_InitStruct.Pin = GPIO_PIN_10; GPIO_InitStruct.Mode = GPIO_MODE_AF_INPUT; // 复用输入 GPIO_InitStruct.Pull = GPIO_NOPULL; // 无上下拉 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); ``` 4. **在HAL中实现底层初始化** 在`HAL_UART_MspInit()`函数中完成上述配置(此函数由HAL自动调用): ```c void HAL_UART_MspInit(UART_HandleTypeDef *huart) { if (huart->Instance == USART1) { // 1. 使能时钟 __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_USART1_CLK_ENABLE(); // 2. 配置GPIO GPIO_InitTypeDef GPIO_InitStruct = {0}; // TX配置 GPIO_InitStruct.Pin = GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Alternate = GPIO_AF7_USART1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // RX配置 GPIO_InitStruct.Pin = GPIO_PIN_10; GPIO_InitStruct.Mode = GPIO_MODE_AF_INPUT; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } } ``` 5. **配置UART参数** 初始化UART的波特率、数据位、校验位等: ```c UART_HandleTypeDef huart1; huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; HAL_UART_Init(&huart1); ``` #### 关键注意事项 - **复用功能编号**:不同芯片的复用功能编号(如`GPIO_AF7_USART1`)需参考具体数据手册[^1]。 - **开漏模式**:I2C需配置为开漏输出,但UART通常使用推挽输出以提高驱动能力[^1]。 - **引脚映射**:若使用备用引脚(如PB6/PB7作为USART1_TX/RX),需开启重映射功能并调整复用配置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值