持续关注阿杰在线更新保姆式笔记~~坚持日更

STM32的引脚可设置为可设置为:普通IO功能、复用功能、重映射功能。不过普通IO功能、复用功能用得比较多。

端口复用和重映射都是和单片机的I/O口有关系,端口复用是将一个I/O赋予多个功能,通过设置I/O的工作模式来切换不同的功能。重映射是将某些I/O口上面的功能映射到其他I/O口上面去。但是注意一点:重映射的I/O都是厂家设置好的,不能自己更改。

单片机里内部外设(即内置外设)和外设分别是什么:

外部设备简称“外设”,是指连在计算机主机以外的硬件设备。对数据和信息起着传输、转送和存储的作用,是计算机系统中的重要组成部分。比如键盘控制芯片,液晶,A/D转换芯片,等等。外设可通过单片机的I/O,SPI,I2C等总线控制。

内置外设就是集成在单片机内部的外设,存在对应的寄存器。一般包括:串口控制模块,SPI模块,I2C模块,A/D模块,PWM模块,CAN模块,EEPROM,比较器模块,等等,它们都集成在单片机内部,有相对应的内部控制寄存器,可通过单片机指令直接控制。(换种说法:还记得单片机吧(就是那个黑片片),你可以把它当做一个人,人都知道有脑袋,和身体各个器官(废话),那么芯片也是一样的芯片的大脑就是微处理器,它的作用就是接收命令和发出命令(就相当于有了尿意大脑就接收到了命令要尿尿,就对你的膀胱发出命令,我要尿尿,手动滑稽),它没有实现命令的能力,该怎么办呢?芯片里的其他部分就是实现命令的设备(只是这些设备很小而已),它们就相当于咱们身体的五脏啊、肌肉啊、膀胱啊之类的器官(别说啥肌肉不是器官,我喜欢说咬我啊,略略略),比如说ADC、DAC之类的(不懂这些是啥吧,我也不知道,一点一点慢慢搞吧)。这些东西就叫内置外设。)

一、端口复用

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

例如串口1的发送接收引脚是PA9,PA10,当我们把PA9,PA10不用作GPIO,而用做复用功能串口1的发送接收引脚的时候,叫端口复用。
换种说法: 咱们的板子上有很多的引脚,这些引脚本来是你作为普通的输入输出使用的(就是你自己这是这个引脚的功能),但是咱们芯片的内置外设也需要与外界进行信息交流啊啊,但是引脚就这么多(比如咱们mini板子只有51个外接引脚),如果每个内置外设都要占用引脚的话,普通的引脚就不够用了,所以这个时候伟大的人类想到了一个办法,就是一个引脚,平常可以做普通的引脚,但是它还有另一个隐藏的身份,就是某个内置外设的输入输出引脚,当你需要用到这个外设的时候,这个普通的引脚就可以变成相关外设的引脚(就相当于中国的建设兵团,平常是农民,打仗的时候就是军人,但还是同一个人)。这就是端口复用。那么端口复用有什么用处呢?之前就说过了,如果内置外设都要单独占用一个引脚的话,普通的引脚就很少了,所以端口复用使得引脚的利用最大化。

端口复用设置步骤

GPIO时钟使能;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
复用外设时钟使能
比如你要将端口PA9,PA10复用为串口,所以要使能串口时钟。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
端口模式配置。 GPIO_Init()函数。

  1.  在数据手册中可以看到 PA9和PA10可以复用为串口(Default),

从上两张图中可以看出,复用为串口发送需要将 PA9设置为 推挽复用输出,

代码示例:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//GPIO时钟使能
 
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);//外设时钟(串口)使能
 
//初始化IO为对应的模式
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);  

小结

GPIO复用功能就是同样的几个I/O口可以通过设置I/O模式,使能相应时钟, 从而实现不同的功能。具体的设置可以参考 stm32中文参考手册和相应芯片的 dataSheet。

二、重映射

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

 换种说法:重映射就是引脚重映射,本来每个内置外设都有原来设定的引脚,所谓的重映射就是通过某种方式,将外设本来的引脚的功能赋予给另外的引脚(比如一个外设的引脚是PA10,但你的这个引脚正在被使用,你又想用这个外设,你就可以通过重映射,将PA11设定成PA10,也就是说PA11取代了PA10的功能,成为了外设的引脚),但是重映射也是有规定可以映射到哪个引脚的(需要查看手册)而不是你想映射到哪个引脚就映射到哪个引脚。

重映射技术的需求背景:

I/O的复用:GPIO和内置外设共用引出管脚
I/O的重映射:复用功能(AFIO)从不同的GPIO管脚引出
方便了PCB的设计,减少了信号交叉干扰
分时复用某些外设,虚拟地增加了端口数目
为了使不同器件封装的外设IO功能数量达到最优,可以把一些复用功能重新映射到其他一些引脚上。STM32中有很多内置外设的输入输出引脚都具有重映射(remap)的功能。
 还是以串口1为例

 上图中的,Remap对应的I/O就是可以重映射到的I/O,Default就是该I/O默认可复用的功能。
从上图中可以看出 串口1 可以重映射到 PB6和PB7引脚,也就是说如果PA9和PA10引脚不好用的时候,或者已经被占用了;那么可以用PB6和PB7来实现串口1的功能。

AFIO重映射的操作步骤:

  1. 使能被重新映射到的I/O端口时钟
  2. 使能被重新映射的外设时钟
  3. 使能AFIO功能的时钟(勿忘)
  4. 进行重映射

 注意第三步,使能AFIO功能时钟,为什么需要使能这个时钟 & 什么时候需要使能这个时钟, 可以参见下面这个回答

那么,问题来了!
  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 时钟,而不是用到引脚复用功能的时候打开。

部分重映射 & 完全重映射

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

如何配置部分重映射 & 完全重映射

以串口3为例,如果想部分映射:GPIO_PinRemapConfig()的第一个参数取值应该是:上图红框框里面的第一个参数,即 GPIO_PartialRemap_USART3,如果是完全映射就是:GPIO_FullRemap_USART3

引脚重映射配置过程(串口3为例):

1. 使能GPIO时钟(重映射后的IO);
2.  使能功能外设时钟(例如串口3);
3. 使能AFIO时钟。重映射必须使能AFIO时钟:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
4. 开启重映射。

GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);

小结 

 重映射就是将在某个I/O实现的功能映射到另外的I/O口, 主要是为了布线的方便以及信号的干扰。具体配置步骤与部分重映射 & 完全重映射前面都已说明。

三、关于AFIO时钟