STM32学习笔记之端口复用与重映射(以STM32C8T6为例)

记录一下学习过程

1.端口复用

STM32有很多内置外设,这些外设的外部引脚是与GPIO复用的。默认情况下,这些GPIO口只能作为普通的IO口输入输出,把一个GPIO口的引脚复用为内置外设的功能引脚,通过这些GPIO口就可以使用内置外设了,这个过程叫做复用。但不是每一个引脚都用对应的复用功能的。

下图是stm32c8t6引脚的定义,其中默认复用功能一列就是对应GPIO口可配置为的复用功能。

图片来自https://blog.csdn.net/xinzhi1992/article/details/125412795

 端口复用的流程:

1.开启对应的GPIO时钟 2.开启对应的外设的时钟 3.将GPIO口配置为对应外设所需要的GPIO模式

 不同外设对应的GPIO模式可参考数据手册8.1.11节,下图为部分截图

这里以配置串口1为例,查询引脚定义表可知PA9和PA10可复用为串口1的TX和RX引脚

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//开启GPIO的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);	//开启外设时钟

  //根据数据手册的要求,将对应GPIO口配置为相应的模式
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_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;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  GPIO_Init(GPIOA, &GPIO_InitStructure);

 2.端口重映射

除了外设默认定义的复用引脚外,用户的还可以根据自己需求重映射为别的引脚。参考引脚定义表第三重定义功能。还是以串口1为例,查看引脚定义表可知它的TX和RX还可映射为PB6与PB7。

端口复用重映射流程:1.开启对应的GPIO时钟 2.开启对应的外设的时钟 3.将GPIO口配置为对应外设所需要的GPIO模式 4.开启AFIO(复用功能辅助时钟)

对于什么什么时候需要开启AFIO时钟,手册中这样描述:对寄存器AFIO_EVCR, AFIO_MAPR和AFIO_EXTICRX进行读写操作前,应当首先打开AFIO的时钟。

其中三个寄存器的功能如下:

AFIO_MAPR:配置复用功能重映射
AFIO_EXTICRX:配置外部中断线映射
AFIO_EVCR:配置EVENTOUT事件输出

这里需要配置AFIO_MAPR所以要开启AFIO时钟

部分重映射&完全重映射

查看引脚定义表发现与串口1相关的引脚有5个PA8-12分别对应CK、TX、RX、CTS、RTS。部分重映射&完全重映射的区别就是要不要把这些全部重映射(前提是可以重映射)。参考手册8.3.8小节

由该表可知部分重映射&完全重映射只对USART3(串口3)来说有区别,我们配置串口1其实无所谓

部分重映射还是完全重映射可以通过开启重映射的库函数GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);决定,根据第一个参数值来确定部分重映射还是完全重映射

整体配置

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//开启GPIO的时钟,重映射后为PB口
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);	//开启外设时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//开启AFIO时钟


  //根据数据手册的要求,将对应GPIO口配置为相应的模式
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; 
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
  GPIO_Init(GPIOA, &GPIO_InitStructure);
   
 GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);//开启重映射
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  GPIO_Init(GPIOA, &GPIO_InitStructure);

物联沃分享整理
物联沃-IOTWORD物联网 » STM32学习笔记之端口复用与重映射(以STM32C8T6为例)

发表评论