记录一下学习过程
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);决定,根据第一个参数值来确定部分重映射还是完全重映射文章来源:https://www.toymoban.com/news/detail-426650.html
整体配置文章来源地址https://www.toymoban.com/news/detail-426650.html
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);
到了这里,关于STM32学习笔记(三)端口复用与重映射(stm32c8t6)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!