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

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)用于使能串口的引脚重映射。
    如前所述,由于每个片上外设重映射后的引脚是在硬件层面就固定死了的,所以并不需要指定重映射后的引脚号。

当然,实际实现引脚重映射时,需要同时配置GPIO口,详细过程如下:

  • 初始化GPIO、AFIO和外设时钟;
  • 调用GPIO_PinRemapConfig()函数使能进行引脚重映射的外设。
  • 调用GPIO_InitTypeDef()函数初始化配置GPIO。注意,配置的是经过重映射之后的新的引脚,而不是原来的引脚。例如,USART1经过重映射之后配置的引脚就是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教程,并非原创。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值