端口复用和重映射

一、端口复用

(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);

相关推荐
yutian06066 小时前
Keil MDK下载程序后MCU自动重启设置
单片机·嵌入式硬件·keil
析木不会编程8 小时前
【小白51单片机专用教程】protues仿真独立按键控制LED
单片机·嵌入式硬件·51单片机
枯无穷肉12 小时前
stm32制作CAN适配器4--WinUsb的使用
stm32·单片机·嵌入式硬件
不过四级不改名67713 小时前
基于HAL库的stm32的can收发实验
stm32·单片机·嵌入式硬件
嵌入式科普13 小时前
十一、从0开始卷出一个新项目之瑞萨RA6M5串口DTC接收不定长
c语言·stm32·cubeide·e2studio·ra6m5·dma接收不定长
嵌入式大圣13 小时前
单片机UDP数据透传
单片机·嵌入式硬件·udp
云山工作室14 小时前
基于单片机的视力保护及身姿矫正器设计(论文+源码)
stm32·单片机·嵌入式硬件·毕业设计·毕设
嵌入式-老费14 小时前
基于海思soc的智能产品开发(mcu读保护的设置)
单片机·嵌入式硬件
qq_3975623115 小时前
MPU6050 , 设置内部低通滤波器,对于输出数据的影响。(简单实验)
单片机
liyinuo201715 小时前
嵌入式(单片机方向)面试题总结
嵌入式硬件·设计模式·面试·设计规范