STM32 端口复用&重映射(USART Remap)

本文详细介绍了STM32F103VCT6单片机USART1端口重映射的过程。由于硬件设计失误,USART1连接至错误的引脚,通过重映射成功解决了这一问题。文章分享了具体的实现步骤及调试经验。

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

STM32 端口复用&重映射(USART Remap)

下面跟大家说一下STM32单片机的端口重映射,因为是以自己为实例.这里是以USART1的重映射为例..
因为我要一个TFT_LCD屏的主控板,考虑到FSMC 我选用了STM32F103VCT6 型号的CPU,一不小心串口接到USART1上了.因为在调程序时才发现错了,没得办法,只能通过端口重映射来解决.但是以前没用过端口重映射,只闻其名,未用其身,所以..呵呵 …只能从头去看了.
STM32上有很多I/O口,也有很多的内置外设想I2C,ADC,ISP,USART等,为了节省引出管脚,这些内置外设基本上是与I/O口共用管脚的,也就是I/O管脚的复用功能。但是STM32还有一特别之处就是:很多复用内置的外设的I/O引脚可以通过重映射功能,从不同的I/O管脚引出,即复用功能的引脚是可通过程序改变的.读到这里相信大家都应该了解了端口重映射的一些概念了.原理上的东西不细说了,大家可以看手册或者网上查,这方面的资料还是很多的.下面说说我的调试经历.
不知道是什么原因 PCB制图时把串口接到USART1上了,当时也没在意,等我把USART测试程序写好烧进去硬件仿真时,串口给的是乱码,我当时就觉得奇怪.把程序检查了好几遍就是查不出问题来,以为是硬件有问题,但突然想到了STM有复用功能,心想会不会是这里有鬼?于是找来datasheet 一看 ,真相大白

三个红框交汇处.STM32F103VCT6 这个CPU的USART1接的是PB6/PB7 但是上电初始化后默认功能并非是USART1.所以想要用串口功能 .必须用端口重映射..
大家知道,STM32的单片机每个功能模块有自己的时钟系统,所以要想要调用STM32单片机的功能模块时 必须先配置对应时钟,然后才能去操作相应的功能模块.端口重映射也一样.如图示:

重映射步骤为:
1.打开重映射时钟和USART重映射后的I/O口引脚时钟,
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);
2.I/O口重映射开启.
GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);
3.配制重映射引脚, 这里只需配置重映射后的I/O,原来的不需要去配置.
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);

                          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
                          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
                           GPIO_Init(GPIOB,&GPIO_InitStructure);
  只需要这三步,串口就可以正常使用了,简单吧?  但是我纠结了大半个小时才搞定的,好多事情都是说起来容易做起来难的,希望我以后多多进步.不要眼高手低,嗯我正朝这个方向前进.

最后总结一下:

简单的说 STM32的 io 有3个功能一个是默认的 一个是复用 一个是重映射功能(这个其实也属于复用)

如果配置成复用 则将使用第2个功能 如果配置成复用 同时 相应的重映射配置了 则将使用第3个功能

通常一个口的 复用+重映射有好多 不止两个 这时候就看你使能哪个设备了(哪个被使能就用哪个)

开复用 + 使能设备+ 是否重映射就可以决定这个io口到底使用哪个功能

### STM32 微控制器中的复用引脚和重映射功能 STM32 微控制器提供了灵活的外设信号路由机制,允许通过配置来改变某些外设信号默认连接的引脚位置。这种灵活性主要体现在两个方面:复用引脚(Alternate Function Pin)和重映射Remapping)。对于 STM32F103 和其他系列而言,这些特性使得硬件设计更加灵活。 #### 复用引脚的概念 在 STM32 中,许多 GPIO 引脚具有多种可能的功能选项,除了作为普通的输入/输出之外还可以被设置成特定外设模块的数据线或控制线。当某个引脚用于非基本 I/O 功能时,则称为该引脚处于“复用模式”。为了启用某一外设并将其分配给指定的 GPIO 引脚,在初始化阶段需正确设定相应的寄存器[^1]。 #### 重映射的作用 重映射是指重新定义标准外设接口所使用的物理引脚位置的能力。例如,默认情况下 UART 接口可能会占用一组固定的引脚;然而借助于 AFIO (Alternative Function Input Output) 寄存器组内的 REMAP 字段,可以将同一UART实例切换至另一组备用引脚上工作。这对于 PCB 布局优化以及解决资源冲突非常有用[^2]。 #### 配置过程概述 要实现上述两种功能,通常涉及以下几个方面的操作: - **使能相关时钟**:确保 APB2 或者 AHB 总线上对应的外设已经开启供电。 - **选择合适的端口与引脚编号**:查阅数据手册确认目标外设有无提供多路选择,并决定具体要用哪一对GPIO组合。 - **调整AFIO设置**:如果需要更改默认映射关系,则应访问 `SYSCFG->EXTICR` 或者专门针对某外设的REMAP位域进行编程。 - **编写启动代码片段** 下面给出一段简单的 C 语言代码示例,展示如何为 STM32F103 设置 USART1 的全重映射到 PA9(TX)/PA10(RX),而不是其默认的位置 PB6/TX & PB7/RX: ```c #include "stm32f1xx_hal.h" void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_USART1_UART_Init(void); int main(void){ HAL_Init(); SystemClock_Config(); /* Initialize all configured peripherals */ MX_GPIO_Init(); // 初始化 GPIO MX_USART1_UART_Init();// 初始化 USART1 while (1){} } // 定义函数体... static void MX_GPIO_Init(void){ __HAL_RCC_AFIO_CLK_ENABLE(); // 启用 AFIO 时钟 __HAL_AFIO_REMAP_USART1_ENABLE(); // 开启 USART1 全部重映射 GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); // 使能 GPIOA 时钟 /**USART1 GPIO Configuration PA9 ------> USART1_TX PA10 ------> USART1_RX */ GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_10; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // 设定为推挽输出方式下的复用功能 GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值