单片机(5)端口复用及重映射简介

1,713 阅读4分钟

本文已参与「新人创作礼」活动, 一起开启掘金创作之路。

端口复用

端口复用介绍

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

       具体哪些 GPIO 管脚是可以复用为哪些内置外设的参考相关资料。(《STM32 中文参考手册 V10》的 P109, P116~P121 )

外设: 外部设备简称“外设”,是指连在计算机主机以外的硬件设备。对数据和信息起着传输、转送和存储的作用,是计算机系统中的重要组成部分

复用端口初始化步骤

  1. 使能相应GPIO 端口时钟。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA

  1. 复用的外设时钟使能。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); 
//为了端口 PA9,PA10 复用为串口,使能串口时钟 
  1. 配置端口模式:GPIO_Init()函数 不同复用外设参考相应资料(《STM32 中文参考手册 V10》 8.1.11 一节内容)

       例:PA9,PA10复用为串口1:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);IO时钟使能

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);外设时钟使能

//初始化IO为对应模式
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_AF_PP; //模式选择为复用推挽输出
 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
 GPIO_InitStructure.GPIO_Speed=  GPIO_Speed_50MHz;//速率选择为50M
 GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化GPIOA

 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IN_FLOATING; //模式选择为浮空输入
 GPIO_Init(GPIOA,&GPIO_InitStructure);

重映射

重映射简介

       为了使不同器件封装的外设 IO 功能数量达到最优,可以把一些复用功能重新映射到其他一些引脚上。 (更好地安排引脚的走向与功能)

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

重映射步骤

  1. 使能被重映射的IO端口时钟。
  2. 使能被重映射的外设时钟。
  3. 使能AFIO时钟
  4. 开启重映射

第三步,开启AFIO的情况: 对寄存器AFIO_MAPR,AFIO_EXTICRX与AFIO_EVCR进行读写操作,则应打开AFIO时钟 AFIO_MAPR:配置复用功能重映射 AFIO_EXTICRX:配置外部中断线映射(X=1,2,3,4) AFIO_EVCR:配置EVENTOUT事件输出

       例:将原PA9,PA10的复用串口1重映射到PB6,PB7

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能 GPIOB 时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //使能串口 1 时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //使能 AFIO 时钟

GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);//开启重映射,根据第一个参数确定部分重映射还是全部重映射

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

两者区别

       一开始我也被两种功能弄乱了,感觉两个好像是同一回事,后来才慢慢弄清:

       每一个IO口都有两种功能,一种是作为普通的输入输出,此时的IO口对芯片是没有差异的,不存在其余功能的,只是单纯的高低电平输出或者是接收器而已。另一种就是复用,此时的IO口作为特殊的IO口存在,比如作为复用为串口相关的IO口,虽然依旧只是输出或者输入高低电平而已,但此时改引脚已经和芯片内部某种功能联结在一起。

       而重映射可以看为是特殊的复用,将原本是引脚A的复用功能,映射到引脚B上面去。比如,引脚A复用后作为EXTI1功能,但为了引脚功能数量较优,或者画板子较容易等等原因,将EXTI1功能重映射到引脚B上去,这样,引脚B就得到原本没有的功能。

       但是请注意,复用和重映射不是随便的,每一个IO口,可以得到的复用功能和重映射功能都是有限且明确的,具体可以网上找一下资料或查看用户手册。