1、GPIO的复用功能
STM32上有很多片上外设,这些外设的外部引脚都是与GPIO口复用的。也就是说,一个GPIO口如果可以复用为片上外设的功能引脚,那么当这个GPIO作为片上外设使用的时候,就叫做复用。
因此,使用外设功能配置GPIO输出时都要设置成复用输出模式:GPIO_Mode_AF_PP或GPIO_Mode_AF_OD。例如,UART、SPI、I2C和PWM等。值得注意的是,其中I2C的数据线和时钟线的GPIO口要配置成GPIO_Mode_AF_OD模式,这是为了利用开漏输出+上拉电阻输出模式的线与特性。
2、GPIO引脚重映射
设计引脚重映射(remapping)功能的初衷,是为了允许开发者在设计电路(画PCB板)时灵活地分配芯片的引脚功能,以优化电路板布局和功能实现。引脚重映射的含义,可以从其与引脚复用的对比中看出来:引脚重映射和引脚复用不是一个概念,引脚重映射是把引脚的复用功能,也就是把片上外设的功能映射到其他引脚上。
使用引脚重映射可以带来以下几个好处:
- 灵活性:在设计电路板时,可以根据实际需要选择最合适的引脚来实现特定功能,从而简化PCB布局。
- 资源优化:可以避免引脚资源的浪费。例如,如果某个引脚的默认功能在当前设计中不需要,可以将其重映射为其他有用的功能。
- 减少冲突:在复杂的电路设计中,不同的外设可能需要使用相同的引脚。通过引脚重映射,可以避免这种冲突。
3、完全重映射和部分重映射
重映射还分有部分重映射和完全重映射。所谓部分重映射,是指某个片上外设的部分引脚重新映射,还有一部分引脚仍为原来的默认引脚;完全重映射,是指某个片上外设的所有引脚都重新映射到一组新的引脚上去。
部分重映射和完全重映射的功能引脚并不重叠,并且不能随意指定,需要严格按照stm32参考手册。以stm32f10x的串口为例,根据stm32f10xxxx参考手册8.3节,USART1和USART2都是完全重映射,不存在部分重映射。USART3的部分重映射和完全重映射如下表所示:
这张表的意思是,USART3原本的默认引脚PB10~PB14。如果使用的是部分重映射,那么PB10、PB11和PB12引脚会被重映射到PC10、PC11和PC12,而PB13和PB14不进行重映射,还是原来的默认引脚。如果使用的完全重映射,那么PB10~PB14整组引脚被完全映射到PD8~PD12。
由此可见,无论是部分重映射还是完全重映射,重映射后是哪些引脚都是早就规定好了的,并且部分重映射和完全重映射后的引脚不是同一组引脚,部分重映射时也无法自定义具体哪个引脚被重定义。归根结底,是因为引脚重映射是在硬件层面被规定死的,无法在软件上自定义。
4、使用AFIO寄存器配置引脚重映射
根据stm32f10xxxx参考手册,AFIO对寄存器 AFIO_EVCR,AFIO_MAPR和 AFIO_EXTICRX进行读写操作前,应当首先打开 AFIO的时钟。这三个寄存器分别是指事件控制寄存器、复用重映射和调试I/O配置寄存器和外部中断配置寄存器。这就是AFIO寄存器的三个功能。
配置引脚重映射,是AFIO的功能之一。具体需要配置的内容有两个:
- 初始化AFIO时钟;
- 调用GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState)函数使能进行引脚重映射的外设。例如,GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE)用于使能串口的引脚重映射。
由于每个片上外设重映射后的引脚是唯一固定的,所以并不需要指定重映射后的引脚号。例如,虽然有多组引脚都具备串口的复用功能,但是无论哪组引脚的串口,重映射之后的引脚都是PB6和PB7(以stm32f103c8t6为例,见本文附图)。
当然,实际实现引脚重映射时,需要同时配置GPIO口,详细过程如下:
- 初始化GPIO、AFIO和外设时钟;
- 调用GPIO_PinRemapConfig()函数使能进行引脚重映射的外设。
- 调用GPIO_InitTypeDef()函数初始化配置GPIO。注意,配置的是经过重映射之后的新的引脚,而不是原来的引脚。例如,串口经过重映射之后配置的引脚就是PB6和PB7,而不是之前的PA9和PA10等(以stm32f103c8t6为例)。
- 外设和中断等的配置。
以stm32f103c8t6为例,实现串口重映射的示例代码如下:
/*开启时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
/*GPIO重映射*/
GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);
/*GPIO初始化*/
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure); //将PB6引脚初始化为复用推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure); //将PB7引脚初始化为上拉输入
/*串口和NVIC等的配置*/
//后边的帖子再写吧
5、最小系统引脚的引脚复用和重映射特点
详见下图,可发现以下特点:
- 图中非绿色部分都是最小系统相关引脚。按照逆时钟方向,最初几个引脚大部分是和最小系统相关的引脚。
- 除了调试端口可以被重映射之外,其他最小系统相关引脚都不具备引脚复用和重映射功能。
注:此图来自江科大stm32教程,并非原创。
标签:映射,引脚,复用,GPIO,AFIO,外设 From: https://blog.csdn.net/hccgso1212/article/details/141104117