stm32hal串口重映射
时间: 2025-05-15 22:56:27 浏览: 17
### STM32 HAL 库中串口重映射的实现方法
在 STM32 的 HAL (Hardware Abstraction Layer) 库中,UART 或 USART 外设可以通过重新映射其引脚来改变默认的功能管脚分配。这种功能通常通过修改 AFIO(Alternate Function I/O)寄存器中的相应位来完成。
以下是关于如何配置 UART/USART 重映射的具体说明:
#### 配置步骤概述
为了实现 UART/USART 的端口重映射,在初始化外设之前需要设置 `RCC` 和 `AFIO` 寄存器的相关部分。具体来说,这涉及以下几个方面:
1. **使能相关时钟**:确保 RCC 控制器已经启用了对应外设及其 GPIO 的时钟。
2. **选择重映射模式**:通过调用特定 API 函数或者手动操作寄存器,指定所需的引脚映射方案。
3. **初始化 GPIO 及 UART**:按照标准流程初始化对应的 GPIO 引脚以及 UART 外设。
#### 实现代码示例
下面是一个基于 HAL 库的典型例子,展示如何为 USART1 进行端口重映射到其他 GPIO 引脚上:
```c
#include "stm32f1xx_hal.h"
void MX_USART1_UART_Init(void)
{
__HAL_RCC_AFIO_CLK_ENABLE(); // 启用 AFIO 时钟
// 设置 USART1_REMAP 到新的位置
HAL_SYSCFGRemapPinConfig(SYSCFG_REMAP_USART1, SYSCFG_REMAP_USART1_FULLREMAP);
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 启用 GPIOA 和 GPIOB 的时钟
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
// 配置 PB6 作为 TX 引脚
GPIO_InitStruct.Pin = GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
// 配置 PB7 作为 RX 引脚
GPIO_InitStruct.Pin = GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
// 初始化 USART1
huart1.Instance = USART1;
huart1.Init.BaudRate = 9600;
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;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if(HAL_UART_Init(&huart1) != HAL_OK){
Error_Handler(); // 错误处理函数
}
}
```
上述代码片段展示了如何将 USART1 的 TX/RX 功能从默认 PA9/PA10 移动至 PB6/PB7 上[^2]。
#### 关键点解释
- 使用 `HAL_SYSCFGRemapPinConfig()` 函数可以选择不同的重映射选项。对于某些型号可能有多种可用的选择,例如半重映射或全重映射。
- 在实际应用过程中需要注意目标 MCU 型号支持哪些具体的重映射组合;不同系列之间可能存在差异。
- 正确启用所有必要的外围设备及时钟源是非常重要的前提条件之一。
---
阅读全文
相关推荐


















