1、说明
单片机引脚有限又想满足诸多外设功能就需要在一个引脚上集成多个功能,也就是复用和重映射。
2、端口复用
2.1、端口复用的定义
以STM32系列为例,GPIO可以重复使用外设的引脚,这个GPIO作为单片机内置的外设使用时,就叫做复用。
例如:
PB10引脚,一般情况下是普通IO口,可复用为I2C2的SCL引脚,也可以复用为串口3的发送引脚。
PB11引脚,一般情况下是普通IO口,可复用为I2C2的SDA引脚,也可以复用为串口3的接收引脚。
2.2、复用端口的配置
(1)配置GPIO的时钟
(2)配置复用的外设时钟
(3)配置GPIO结构体
(4)初始化
3、重映射
3.1、重定义的定义
在单片机说明手册中,有关于引脚配置的表格,除了复用功能以外,还有重映射(重定义)的功能。一个外设的引脚除了具有默认的端口外,也可以重新映射来把这个外设的功能映射到别的引脚上。在某个引脚被占用,而我们又需要它的外设功能时,就需要重映射功能了。此外,PCB布线时,通过重映射可以有效的方便布线,降低干扰。
例如:
PB6可以通过重映射,配置成串口1的发送引脚。
PB7可以通过重映射,配置成串口1的接收引脚。
而PB6和PB7默认的复用功能只有I2C和定时器的功能,串口1默认是由PA9和PA10所提供的。
3.2、重映射的类型
大体分为部分重映射和全部重映射。某个外设功能全部由重映射的引脚支持的,称为全部重映射;
而由部分默认复用功能加上部分映射功能提供的称为部分重映射。
3.3、重映射的配置
(1)使能GPIO引脚(重映射后的GPIO引脚)
(2)将GPIO的原来的功能引脚失能或将所映射的功能原来的引脚失能(若之前没有配置则忽略,简而言之,一个引脚只能配置一种外设功能,一个外设只能被一个引脚配置,不要引起干扰)
(3)使能功能外设
(4)使能AFIO时钟,重映射必须开启AFIO时钟
(5)开启重映射,调用函数,将某引脚重映射为某功能
4、代码示例
4.1 GPIO重映射
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //打开GPIOB的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //打开复用时钟
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //重定义功能,将JTAG失能
GPIO_InitTypeDef GPIO_InitStructure; //配置结构体
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化
4.2 GPIO复用
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //开启复用的功能时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIO时钟
GPIO_InitTypeDef GPIO_InitStructure; //配置结构体
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化
注:上述代码只是一般流程示例,用具体外设时以具体功能配置