端口复用和重映射

一、端口复用

(1)端口复用概念

端口复用是将一个I/O赋予多个功能,通过设置I/O的工作模式来切换不同的功能。

STM32有很多的内置外设,这些外设的外部引脚都是与GPIO复用的。也就是说,一个GPIO如果可以复用为内置外设的功能引脚,那么当这个GPIO作为内置外设使用的时候,就叫做复用。

例如串口1的发送接收引脚是PA9,PA10,当我们把PA9,PA10不用作GPIO,而用做复用功能串口1的发送接收引脚的时候,叫端口复用。

(2)端口复用设置步骤

串口 1 的引脚对应的 IO 为 PA9,PA10.PA9,PA10 默认功能是 GPIO,所以当PA9,PA10 引脚作为串口 1 的 TX,RX 引脚使用的时候,那就是端口复用。

复用端口初始化有几个步骤:

cpp 复制代码
1) GPIO 端口时钟使能。要使用到端口复用,当然要使能端口的时钟了。
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

2) 复用的外设时钟使能。比如你要将端口 PA9,PA10 复用为串口,所以要使能串口时钟。
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

3) 端口模式配置。 在 IO 复用位内置外设功能引脚的时候,必须设置 GPIO 端口的模式
    //USART1_TX PA.9 复用推挽输出
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    //USART1_RX  PA.10 浮空输入
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
    GPIO_Init(GPIOA, &GPIO_InitStructure);

二、重映射

(1)重映射概念

每个内置外设都有若干个输入输出引脚,一般这些引脚的输出端口都是固定不变的,为了让设计工程师可以更好地安排引脚的走向和功能,在STM32中引入了外设引脚重映射的概念,即一个外设的引脚除了具有默认的端口外,还可以通过设置重映射寄存器的方式,把这个外设的引脚映射到其它的端口。

**(2)**AFIO重映射的操作步骤:

cpp 复制代码
默认情况下,串口 1 复用的时候的引脚位 PA9,PA10,同时我们可以将 TX 和 RX 重新映射到管脚 PB6 和 PB7 上面去。所以重映射我们同样要使能复用功能的时候讲解的 2 个时钟外,还要使能 AFIO 功能时钟,然后
要调用重映射函数。详细步骤为:

1)使能 GPIOB 时钟:
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
2)使能串口 1 时钟:
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
3)使能 AFIO 时钟:
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
4)开启重映射:
    GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);

这样就将串口的 TX 和 RX 重映射到管脚 PB6 和 PB7 上面了。

(3)AFIO 是什么?AFIO 时钟什么时候需要开启?

我们从《STM32中文参考手册_V10》中找到:对寄存器 AFIO_EVCR、AFIO_MAPR 和 AFIO_EXTICRX 进行读写操作前,应当首先打开 AFIO 的时钟(设置 APB2 外设时钟使能寄存器 RCC_APB2ENR)。也就是说:当你需要配置 AFIO 这些寄存器的时候,需要把RCC_APB2ENR 寄存器的 AFIO 位置'1'打开 AFIO 时钟。

跟 AFIO 相关的寄存器有:

1、 事件控制寄存器(AFIO_EVCR)

2、 复用重映射 和调试I/O 配置寄存器(AFIO_MAPR)

3、 外部中断配置寄存器1(AFIO_EXTICR1)

4、 外部中断配置寄存器2(AFIO_EXTICR2)

5、 外部中断配置寄存器3(AFIO_EXTICR3)

6、 外部中断配置寄存器4(AFIO_EXTICR4)

看看这些寄存器的定义,我们就明白,这些寄存器是用于"事件控制"、"重映射"、"调试IO配置"、"外部中断"的。例如 AFIO_EXTICRX 用于选择 EXTIx 外部中断的输入源。

总结:当我们需要配置这些 AFIO 寄存器的时候,就需要打开 RCC_APB2ENR 寄存器的 AFIO 时钟,而不是用到引脚复用功能的时候打开。

(4)部分重映射 & 完全重映射

a)部分重映射:功能外设的部分引脚重新映射,还有一部分引脚是原来的默认引脚。

b)完全重映射:功能外设的所有引脚都重新映射。

例如:部分重映射就是 PB10,PB11,PB12 重映射到 PC10,PC11,PC12 上。而 PB13 和 PB14 和没有重映射情况是一样的,都是 USART3_CTS 和 USART3_RTS 对应管脚。完全重映射就是将这两个脚重新映射到 PD11 和 PD12 上去。我们要使用 USART3 的部分重映射,我们调用函数方法为:GPIO_PinRemapConfig(GPIO_PartialRemap_USART3, ENABLE);

相关推荐
南泽兆36 分钟前
超低功耗MCU软件开发设计中的要点与选型推荐
单片机·mcu·iot·小华半导体·如何做好超低功耗mcu开发·超低功耗mcu设计要点·超低功耗mcu国产如何选型
龙大大L1 小时前
第五章:5.1 ESP32物联网应用 - MQTT协议深度教程
java·单片机·struts·apache
傍晚冰川2 小时前
【STM32】解读启动文件startup_stm32f10x_md.s
linux·笔记·stm32·单片机·学习
飞凌嵌入式3 小时前
飞凌嵌入式T527核心板正式发布OpenHarmony4.1系统,实现从芯片架构到操作系统的全链路国产化
人工智能·嵌入式硬件·嵌入式·飞凌嵌入式
myzr1234 小时前
明远智睿SSD2351核心板在物联网领域的应用实践
人工智能·嵌入式硬件·物联网·智能家居·边缘计算
不不不丶4 小时前
STM32——DAC转换
stm32·单片机·嵌入式硬件
Ven%7 小时前
电脑的usb端口电压会大于开发板需要的电压吗
人工智能·单片机·嵌入式硬件
strongwyy9 小时前
9、nRF52xx蓝牙学习(pca10056.h学习)
单片机·嵌入式硬件·学习
夜月yeyue13 小时前
ARM内核与寄存器
arm开发·stm32·单片机·嵌入式硬件·mcu·链表
云山工作室17 小时前
基于单片机的防火防盗报警系统设计(论文+源码)
单片机·嵌入式硬件