当前位置:网站首页>端口复用和重映像

端口复用和重映像

2022-07-07 06:26:00 一只大喵咪1201

作者:一只大喵咪1201
专栏:《STM32学习》
格言:你只管努力,剩下的交给时间!

请添加图片描述

描述

先来看一张STM32的简易结构图
图
在图中可以看到,除了内核(也就是CPU),还有一部分是内置外设。内置外设有很多种,不同类型的芯片内置外设的数量也不同,如本喵使用的STM32F103ZET6芯片的串口就有5个。而这些内置外设是通过GPIO的端口复用重映像来输入输出信号的

端口复用

概念:
一个GPIO如果可以复用为内置外设的功能引脚,那么当这个GPIO作为内置外设使用的时候,就叫做复用。

以USART1(串口1)为例说明端口复用。

图
这是STM32F103ZET6《数据手册》中的引脚信息描述表的部分截图。
可以看到

  • PA9和PA10的主要功能是PA9和PA10。也就是通用输入输出功能。
  • 可选择的功能中默认复用功能就是USART1_TX(串口1发送引脚)和USART1_RX(串口1接收引脚)。

此时我们可以说,USART1_TX和USART1_RX是复用在GPIO的PA9和PA10口的。

端口复用的配置过程

我们在知道类端口复用是什么以后就要进行配置,要不芯片怎么能知道GPIO口是作通用输入输出口还是是端口复用口呢?

  1. GPIO时钟使能

端口复用说到底还是使用的GPIO,所以需要对对应的GPIO进行使能。以USART1为例,我们知道它复用的GPIO是PA组的IO口,所以需要对GPIOA进行使能。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

在本喵的文章STM32的时钟系统中曾讲到过GPIO是挂靠在APB2总线下的,所以使用的是这个函数。

  1. 复用外设时钟使能

无论使用什么外设,不仅使用的是GPIO,而且外设本身也要使用,所以在使用内置外设的时候也要进行使能。以USART1为例

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

USART1(串口1)同样是挂靠在APB2总线上的。

  1. 端口模式配置

在将GPIO和USAR1使能以后,接下来就需要告诉CPU该IO口使用的是端口复用功能。
图
在STM32F103ZET6芯片的《中文参考手册》中的复用功能配置表中,详细列出了在进行端口复用时,GPIO该如何配置。也就是GPIO的初始化。
以USART1_TX和USART1_RX为例:

USART1_TX(发送端)

  • 全双工模式时,GPIO需要配置成推挽复用输出模式。

USART1_RX(接收端)

  • 全双工模式时,GPIO需要配置成浮空输入或者上拉输入。

体现在代码上

GPIO_TypeDef GPIO_InitStructyre;
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);
  
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10 PA.10 浮空输入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);  

以上便是以USART1为例,端口复用配置的全过程。经过上述的配置,PA9和PA10便成了USART1_TX和USART1_RX的引脚,不再是通用输入输出口。

端口重映像

端口重映像其实和端口复用差不多,端口复用是内置外设的复用口是固定不变的,需要通过数据手册中的引脚描述才能找到不同外设对应的复用GPIO口。
而端口重映射的映射端口也是固定不变的,也是需要通过查表来找到的,只是映射端口和复用端口不是同一个。

概念:

  • 一个外设的引脚除了具有默认的端口外,还可以通过设置重映射寄存器的方式,把这个外设的引脚映射到其它的端口。

目的:

  • 为了让设计工程师可以更好地安排引脚的走向和功能,潜在的减少了信号的交叉干扰。

图
这是STM32F103ZET6芯片《中文参考手册》中的重映像配置表。以USART1为例,表中说明了,USART1_TX和USART1_RX经过重映射后的GPIO口是PB6和PB7。
图
也可以通过《数据手册》中的引脚描述表中看到,PB6和PB7在可选择功能中,重映射后对应的是USART1_TX和USART1_RX。

端口重映射还分为不完全重映射和完全重映射

部分重映像和完全重映像

图
以USART3为例,在《中文参考手册》的重映像配置表中,USART3共需要5个引脚,分别是USART3_TX,USART3_RX,USART3_CK,USART3_CTS,USART3_RTS。

没有重映像时

  • 这个5个端口默认使用的是端口复用功能,它们对应着PB10到PB14。

部分重映像时

  • 其中USART3_TX,USART3_RX,USART3_CK这三个端口对应不再是端口复用的PB10到PB12,而是重映像成了PC10到PC12,而USART3_CTS和USART3_RTS仍然对应的是端口复用时的PB13和PB14。

完全重映像

  • USART3的5个端口全部重映像到了新的端口,对应着PD8到PD12五个端口。

总的来说,部分重映像就是内置外设的部分部分引脚进行了重映像,还有一部分引脚是默认的端口复用对应的引脚。完全重映像就是内置外设的全部引脚都进行了重映像。

重映像的配置过程

知道了什么是重映像后,我们就要去使用它。

  1. 使能被重映射后的GPIO。

重新映射后就会使用新的GPIO,所以就要进行使能,只有使能后该IO口才会被开启。以USART3为例:
部分重映像时:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

部分重映像后使用的是俩组IO口,所以需要对GPIOC和GPIOB都进行使能
完全重映像

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);

完全重映像后,USART3的5个引脚全部重映射到了GPIOD组的IO口上,所以只需要使能GPIOD即可。

  1. 使能内置外设
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);

在时钟系统文章中本喵提到过,USART3是挂载在APB1总线上的,所以使用的函数是这个。

  1. 使能AFIO时钟

对寄存器AFIO_MAPR,AFIO_EXTICRX和AFIO_EVCR进行读写操作前,应当首先打开AFIO时钟。

  • AFIO_MAPR:配置复用功能重映射
    AFIO_EXTICRX:配置外部中断线映射
    AFIO_EVCR: 配置EVENTOUT事件输出
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

AFIO功能辅助寄存器通用是挂载在APB2总线上的,所以使用这个函数。

  1. 开启重映像

在将需要用到的寄存器使能后就进入了最后一步,配置重映像。
我们首先在GPIO有关的函数中找到开启重映像的函数GPIO_PinRemapConfig()。
图
该函数的第一个参数有很多,如上图中那样,将代表对应重映像的外设以及重印象方式的参数传给开启重映像函数。

GPIO_PinRemapConfig(GPIO_PartialRemap_USART3,ENABLE);//部分重映像
GPIO_PinRemapConfig(GPIO_FullRemap_USART3,ENABLE);//完全重映像

而第二个参数只ENABLE和DISABLE,也就是决定是否开启重映像。

经过以上4步就成功的将USART3的部分端口重映射到了PC10到PC12,或者全部端口重映射到了PD8到PD12上。

总结

无论是端口复用还是的端口重映像,都是为了使用芯片的内置外设,只有通过端口复用或者重映像后对应的GPIO才能够与内置外设像联通,为外设传递信息。一般情况下端口复用就够我们使用。

原网站

版权声明
本文为[一只大喵咪1201]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_63726869/article/details/125246494