STM32 端口复用与重映射 - 实践
2025-12-17 12:06 tlnshuju 阅读(0) 评论(0) 收藏 举报一、端口复用功能
1. 基本概念
端口复用是指将GPIO引脚用作内置外设功能引脚的技术。STM32的许多内置外设外部引脚都与GPIO复用,当GPIO作为内置外设使用时称为复用。
示例:串口1的TX、RX引脚默认为PA9、PA10,当这两个引脚不用作普通GPIO而用作串口1功能时,即为端口复用。
2. 配置步骤
// 1. GPIO时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 2. 复用外设时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
// 3. 端口模式配置
GPIO_InitTypeDef GPIO_InitStructure;
// TX引脚配置:复用推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// RX引脚配置:浮空输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
3. 关键要点
使用复用功能时必须使能两个时钟:GPIO时钟和复用外设时钟
需要根据外设要求正确配置GPIO模式
二、端口重映射
1. 基本概念
端口重映射是为了优化不同器件封装的外设I/O功能布局,将复用功能重新映射到其他引脚的技术。
重映射类型:
部分重映射:部分引脚进行重映射
完全重映射:所有引脚都映射到新位置
示例:串口1默认在PA9、PA10,重映射后可改为PB6、PB7。
2. 配置步骤
// 1. 重映射后的GPIO时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
// 2. 复用外设时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
// 3. AFIO时钟使能(重映射必须)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
// 4. 开启重映射
GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);
// 5. 初始化重映射后的GPIO
// (配置方法与普通复用相同,但使用新的GPIO引脚)
3. AFIO时钟说明
对以下寄存器进行读写前必须打开AFIO时钟:
AFIO_MAPR:配置复用功能重映射
AFIO_EXTICRX:配置外部中断线映射
AFIO_EVCR:配置EVENTOUT事件输出
三、I/O引脚复用器架构
1. 复用功能分配
复位后:所有I/O连接到AF0
外设功能:映射到AF1至AF13
EVENTOUT:映射到AF15
2. 配置流程
系统功能:连接到AF0,根据功能配置
GPIO功能:在GPIOx_MODER中配置为输出/输入
外设复用功能:
ADC/DAC:配置为模拟通道
其他外设:配置为复用功能,设置类型、上下拉、速度,连接到对应AFx
EVENTOUT:连接到AF15
四、重映射特殊处理
1. 调试端口冲突处理
当重映射引脚与调试端口冲突时,需要解除调试端口复用:
// 解除JTAG调试端口复用,保留SWD
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
调试端口重映射选项:
GPIO_Remap_SWJ_NoJTRST:禁用JTRST(PB4变为GPIO)
GPIO_Remap_SWJ_JTAGDisable:禁用JTAG(PA15、PB3、PB4变为GPIO)
GPIO_Remap_SWJ_Disable:完全禁用SWD和JTAG(谨慎使用)
2. 重映射配置原则
首先开启AFIO时钟
根据需求选择重映射方式
如涉及调试端口,解除相应复用
最后配置重映射后的GPIO