首页 > 其他分享 >AFIO专题1:GPIO引脚复用和重映射

AFIO专题1:GPIO引脚复用和重映射

时间:2024-08-11 16:52:13浏览次数:8  
标签:映射 引脚 复用 GPIO AFIO 外设

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

相关文章

  • STM32F407 GPIO
    //单片机:   是典型的嵌入式微控制器,英文MCU;是一种集成电路芯片,采用超大规模集成电路技术把FPU,RAM,ROM,I/O口中断系统,定时器计数器等功能集成到一块硅片上,构成的小而完善的计算机系统。//中央处理器(FPU)(168MHz)//随机存储器(RAM)//只读存储器(ROM)//定时器:   重要  ......
  • 基于两颗CH582芯片实现GPIO模拟SPI全双工通讯__从机通过GPIO中断读写数据
    简介:此程序是根据标准SPI协议规范使用模式0编写的一份模拟SPI全双工数据收发例程,经过测试,一个字节收发时长可压缩至最低115us左右,约9091字节每秒=73Kbps的通讯速率,注释中尽可能解释了每一步的含义,后续有想法应该会对其进行优化。注:笔者开发经验较少,在编程上或许复杂了一些。......
  • (CubeIDE/CubeMX STM32引脚布局)将配置的引脚转移到其它引脚
            新建了项目,配置好引脚,但是想将原先的配置换到别的引脚上,我教大家一个方法。    这里以STM32F103芯片为例,其它芯片也同样适用,先打开工程,如下图所示。     假设我现在想使用PA7点灯,但是现在PA7被SPI1占用了,那我们需要知道还有没有其它引脚可......
  • STM32学习记录(二):GPIO
    何为高低电平?高电平电压(highlevelvoltage),输出的电压值相对较高低电平电压(lowlevelvoltage),输出的电压值相对较低高低电平的电压具体值是多少需要参考数据手册,举个例子,如下表所示,VDD的典型值是3.3V,根据数据手册可以知道低电平下GPIO输出的最大电压是0.4V;高电平下GPIO输......
  • 记一次STM32使用I2C PinRemap引脚重映射出现卡死现象
    在移植WouoUI到STMF103C8BluePillboard时,发现会出现上电卡死在I2C检查函数(如下图)本人遇到的现象:在习惯使用的(SWI2C/HWI2C)@(PB8->SCLPB9->SDA)连接OLED的情况下,大多数情况使用江科大的SWI2C,一切正常。今天跑某开源基于u8g2库的UI框架WouoUI(HWI2C)@(PB6->SCLPB7->SDA)遇......
  • [米联客-安路飞龙DR1-FPSOC] SDK入门篇连载-03 GPIO PS/PL实验
    软件版本:Anlogic-TD5.9.1-DR1_ES1.1操作系统:WIN1064bit硬件平台:适用安路(Anlogic)FPGA实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板板卡获取平台:https://milianke.tmall.com/登录"米联客"FPGA社区http://www.uisrc.com视频课程、答疑解惑! 1概述本课对FPSoC芯片GPIO进......
  • STM32之GPIO(General Purpose Input/Output,通用型输入输出)
    文章目录前言一、GPIO简介二、GPIO结构2.1GPIO基本结构2.2GPIO位结构2.2.1输入部分2.2.1输出部分四、GPIO模式4.1浮空/上拉/下拉输入4.2模拟输入4.3开漏/推挽输出4.4复用开漏/推挽输出前言提示:本文主要用作在学习江协科大STM32入门教程后做的归纳总结笔......
  • 嵌入式Linux中的LED驱动控制(使用Pinctrl和GPIO子系统)
    在前面驱动LED的所有案例中,都是在驱动程序中去设置每个引脚的复用功能,这会导致所编写的驱动程序移植困难,可重用性差,缺乏对引脚的统一管理,容易出现引脚的重复定义等等弊病。为此,Linux内核引入了pinctrl子系统和GPIO子系统的概念。pinctrl子系统主要用于芯片引脚功能的管理,它基本上......
  • STM32学习三GPIO操作
    点灯:二极管利用的是两边的电压差点亮,如图外接有3.3v电压,所以只需要引脚给低电平即可驱动。当外接地时,需要芯片给出高电平驱动,在推挽输出的模式下输入输出都有很强的驱动能里。但一般都是led外接高电压,因为很多芯片都采用高电平弱驱动,低电平强驱动的规则。1.芯片数据手册......
  • 【STM32】GPIO口以及EXTI外部中断
    个人主页~有关结构体的知识在这~有关枚举的知识在这~GPIO口以及EXTI外部中断GPIO一、简介二、基本结构三、输入输出模式1、输入模式(1)上拉输入(2)下拉输入(3)浮空输入(4)模拟输入2、输出模式(1)推挽输出(2)开漏输出(3)复用推挽输出(4)复用开漏输出EXIT外部中断一、中断系统二、......