STM32单片机端口复用和端口重映射
STM32单片机上有很多I/O口,也有很多的内置外设,比如I2C、ADC、DAC、USART等都属于内置外设。这些内置外设基本都是与I/O口共用管脚的,也就是I/O管脚的复用功能。
除了I/O管脚的复用功能外,很多复用内置的外设的I/O引脚可以通过重映射功能,即从不同的管脚引出,即复用功能的引脚和重映射的引脚是可通过软件配置改变的。
下面以STM32F103VCT6芯片上的USART1为例。
首先先看芯片STM32F103VCT6上关于USART1的引脚相关资料
- USART1功能复用引脚分布图
由上图可知:PA9管脚可复用为USART1_TX,PA10管脚可复用为USART1_RX。 - USART1功能重映射引脚分布图
由上图可知:PB6作为USART1_TX的重映射管脚,PB7作为USART1_RX的重映射管脚
- 注:在这里补充一下官方STM32F103VCT6芯片资料建议的对串口模式的配置方式如下图
本文给出的代码都是参照官方资料来设置的,将USART1_TX设置为推挽复用输出,将USART1_RX设置为浮空输入。
一、USART1端口复用步骤如下:
- GPIO端口时钟使能。
- 复用的外设时钟使能
- 端口模式配置
具体配置代码如下:
//第一步:GPIO端口时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//第二步:复用的外设时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
//第三步:端口配置 端口模式配置为复用功能
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = 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端口重映射步骤如下:
- 打开重映射时钟和USART重映射后的I/O口引脚时钟
- I/O口重映射开启
- 配置重映射管脚
具体配置代码如下:
//第一步:打开重映射时钟和USART重映射后的I/O口引脚时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);
//第二步:I/O口重映射开启
GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);
//第三步:配置重映射管脚,这里只需要配置重映射后的I/O,原来的不需要配置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //推挽复用输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_Init(GPIOB,&GPIO_InitStructure);
只需要这三步,重映射后的串口就可以正常使用了。
其他外设功能的复用和重映射也都是类似配置,是不是很简单~