参考资料:《STM32F1开发指南-库函数版本》 4.4小节,端口复用和重映射
或者《STM32中文参考手册》 第8章 通用和复用功能IO
13.1、端口复用
13.2、重映射(对STM32理解比较透彻的需要)
13.1、端口复用
什么是端口复用?
STM32有很多内置外设,这些外设的外部引脚都是与GPIO复用的,也就是说,一个GPIO如果可以既做普通的输入输出通信引脚,又做这些内部外设的通信引脚,那么这个GPIO就是在复用。
例如,PA9和PA10两个引脚,既是两个通用的IO口,又是串口1 的默认发送接收引脚(内置外设引脚)这两个引脚也就是端口复用。
补充:(1)什么是内置外设?
如果把单片机比做人,那么微处理器就相当于人脑,用于接收并发出信息(命令)那么一些最基本的功能,我们人体是可以自己实现的,实现这些功能的器官就相当于内置外设。换句话说,内置外设就是STM32用以实现最基本功能的设备。这些内置外设有:串口、ADC、DAC等。
至于某个引脚的具体复用功能是什么,可以查找《STM32中文数据手册》p17页开始的表格。
13.1.2、端口复用的配置过程
以PA9和PA10配置为串口一为例,具体步骤为
(1)使能GPIO口时钟
(2)使能复用外设的时钟
(3)端口模式配置,初始化IO口
第(3)步,至于需要初始化为什么模式,或者配置为什么模式,需要参考中文数据手册第8.1.11、外设的GPIO配置;例如下表:
据表可知,要把USART串口配置为全双工模式,,则GPIO需要配置为推挽复用输出
下面以代码的方式总结PA9,PA10复用为串口1的过程
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能IO口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //使能需要复用的外设时钟
//初始化IO口为对应的模式(查表可知)
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9; //配置PA9
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
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //为浮空输入
GPIO_Init(GPIOA,&GPIO_InitStructure);
13.2、端口重映射,重映射(remap)
(1)什么是重映射?
STM32中每个外设都有若干输入输出引脚,一般这些引脚的输入输出口都是固定的,但为了能在设计工作中更好的安排引脚走向以及功能,引入了重映射的概念(remap)即一个外设的引脚除了具有默认的端口外,还可以通过配置重映射寄存器的方式,把这个外设的引脚映射到其他端口。
重映射就是引脚重映射,本来每个内置外设都有原来设定的引脚,所谓的重映射就是通过某种方式,将外设本来的引脚的功能赋予给另外的引脚(比如一个外设的引脚是PA10,但你的这个引脚正在被使用,你又想用这个外设,你就可以通过重映射,将PA11设定成PA10,也就是说PA11取代了PA10的功能,成为了外设的引脚),但是重映射也是有规定可以映射到哪个引脚的(需要查看手册)而不是你想映射到哪个引脚就映射到哪个引脚。
至于查看具体是怎么规定引脚重映射关系的,《STM32中文参考手册》p116,8.3复用功能和调试配置
(2)部分重映射和完全重映射
部分重映射:功能外设的部分引脚重新映射,还有一部分是原来的默认引脚
完全重映射:功能外设的所有引脚都重新映射。
以串口三为例:
(3)端口重映射过程
PS:
#define GPIO_Remap_SPI1 ((uint32_t)0x00000001)
#define GPIO_Remap_I2C1 ((uint32_t)0x00000002)
#define GPIO_Remap_USART1 ((uint32_t)0x00000004)
#define GPIO_Remap_USART2 ((uint32_t)0x00000008)
#define GPIO_PartialRemap_USART3 ((uint32_t)0x00140010) //串口三部分重映射
#define GPIO_FullRemap_USART3 ((uint32_t)0x00140030) //串口三完全重映射