【STM32】STM32端口复用和重映射(AFIO辅助功能时钟)

STM32F1xx官方资料:

《STM32中文参考手册V10》-第8章通用和复用功能IO(GPIO和AFIO)

 

端口复用功能

端口复用的定义

STM32有许多的内置外设(如串口、ADC、DCA等等),这些外设的外部引脚都是和GPIO复用的。也就是说,一个GPIO如果可以复用为内置外设的功能引脚,那么当这个GPIO作为内置外设使用的时候,就叫复用。详细的可以参考《STM32F103ZET6数据手册》p30的内容,表格的倒数第二栏就表示端口复用功能。

比如说,STM32的串口1的引脚对应的I/O位PA9、PA10。而PA9、PA10默认的功能都是GPIO,所以说当PA9、PA10引脚作为串口1使用的时候就是端口复用。

那么,什么时候端口是默认功能,什么时候端口是复用功能呢?

STM32时钟系统的配置除了初始化的时候在system_stm32f10x.c中的SystemInit函数中外,其他的配置主要在stm32f10x_rcc.c文件中, 所以GPIO等等外设的时钟使能函数都是在此文件中。同时我们通过函数名可以得到规律:GPIOA-GPIOC是挂载在APB2下面,TIM2-TIM4是挂载在APB1下面,DMA是挂载在AHB下面。所以调用函数的名称是需要根据这个来确定的。

端口复用初始化过程

接下来看一下端口复用初始化过程的步骤,拿串口1为例:

1、GPIO端口时钟使能。要使用到端口复用,首先是要使能端口的时钟了;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

2、复用的外设时钟使能。比如要将PA9、PA10引脚复用成串口,必须也要使能串口时钟;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

3、端口模式配置。在I/O复用位内置外设功能引脚的时候,必须设置GPIO端口的模式。至于在复用功能下,GPIO的模式怎么设置,可以查看手册《STM32中文参考手册》p110的内容。这里拿USART1为例,进行配置,要配置全双工的串口1,TX引脚需要推挽复用输出,RX引脚需要浮空输入或者上拉输入;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.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;//PA10 PA.10 浮空输入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);  

总而言之,使用复用功能的时候至少要使能2时钟:GPIO时钟使能、复用的外设时钟使能。同时还要初始化GPIO以及复用外设功能(端口模式配置)。

 

端口重映射

端口重映射的定义

为了使不同的器件封装的外设I/O功能数量达到最优,可以把一些复用功能重新映射到其他的引脚上。STM32中有许多的内置外设的输入、输出引脚都具有重映射(Remap)的功能。

我们知道,每个内置外设都有若干个输入、输出引脚,一般这些引脚的输出端口都是固定不变的,为了更好地安排引脚的走向和功能,在STM32中引入了外设引脚重映射的概念,即一个外设的引脚除了具有默认的端口之外,还可以通过设定重映射寄存器的方式把这个外设的引脚映射到其他的端口。

简单讲,就是把引脚的外设功能映射到其他的引脚上,但不是可以随便映射的,具体的对应关系参考《STM32F103ZET6数据手册》p30的内容,表格的最后一栏就表示端口重映射功能。

这里同样用串口1为例来说明。

可以看出,我们可以将串口1重映射到PB6、PB7引脚上

端口重映射初始化过程

接下来看一下端口重映射初始化过程的步骤,拿串口1为例,除了之前使能复用功能的2个时钟之外,还需要使能AFIO功能时钟,然后调用重映射函数:

1、GPIO端口时钟使能。要使用到端口复用,首先是要使能端口的时钟了;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

2、复用的外设时钟使能。比如要将PB6、PB7引脚复用成串口,必须也要使能串口时钟;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

3、使能AFIO时钟。重映射必须使能AFIO时钟;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

4、开启重映射;

GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);

这样,就将串口1的TX和RX引脚映射到PB6、PB7引脚上面了。至于哪些功能可以重映射,除了查看中文参考手册之外,还可以从GPIO_PinRemapConfig函数入手查看第一个入口参数的取值范围的值。stm32f10x_gpio.h中定义了一些宏定义的标识符:

#define GPIO_Remap_SPI1             ((uint32_t)0x00000001)  /*!< SPI1 Alternate Function mapping */
#define GPIO_Remap_I2C1             ((uint32_t)0x00000002)  /*!< I2C1 Alternate Function mapping */
#define GPIO_Remap_USART1           ((uint32_t)0x00000004)  /*!< USART1 Alternate Function mapping */
#define GPIO_Remap_USART2           ((uint32_t)0x00000008)  /*!< USART2 Alternate Function mapping */
#define GPIO_PartialRemap_USART3    ((uint32_t)0x00140010)  /*!< USART3 Partial Alternate Function mapping */
#define GPIO_FullRemap_USART3       ((uint32_t)0x00140030)  /*!< USART3 Full Alternate Function mapping */
#define GPIO_PartialRemap_TIM1      ((uint32_t)0x00160040)  /*!< TIM1 Partial Alternate Function mapping */
#define GPIO_FullRemap_TIM1         ((uint32_t)0x001600C0)  /*!< TIM1 Full Alternate Function mapping */
#define GPIO_PartialRemap1_TIM2     ((uint32_t)0x00180100)  /*!< TIM2 Partial1 Alternate Function mapping */
#define GPIO_PartialRemap2_TIM2     ((uint32_t)0x00180200)  /*!< TIM2 Partial2 Alternate Function mapping */
#define GPIO_FullRemap_TIM2         ((uint32_t)0x00180300)  /*!< TIM2 Full Alternate Function mapping */
#define GPIO_PartialRemap_TIM3      ((uint32_t)0x001A0800)  /*!< TIM3 Partial Alternate Function mapping */
#define GPIO_FullRemap_TIM3         ((uint32_t)0x001A0C00)  /*!< TIM3 Full Alternate Function mapping */

可以看出,USART1只有一种重映射,而USART3存在部分重映射和完全重映射。所谓部分重映射就是部分引脚和默认的是一样的,完全重映射就是所有引脚都映射到了新的引脚。可以查看《STM32中文参考手册》p119的内容查看部分重映射和完全重映射的内容。而在之前最后开启重映射的函数中,根据第一个参数,来确定是部分重映射还是全部重映射。

 

AFIO辅助功能时钟

之前在端口重映射的时候,讲到要使能AFIO辅助功能时钟。那么什么时候需要开启(使能)呢?

对寄存器AFIO_MAPR、AFIO_EXTICRx和AFIO_EVCR进行读写操作前,应当首先开启AFIO时钟。

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

 

### STM32中的AFIO复用口端管映射 #### AFIO复用口的概念 STM32微控制器提供了多种外设接口,其中一些引脚可以具有多重功能。这些多功能引脚通过可配置的复用机制来实现不同用途的选择。这种机制允许同一物理引脚连接到多个内部信号源之一,从而提高了芯片资源利用率并简化了电路设计[^1]。 对于某些特定的功能模块(如USART、SPI等),其通信线路可能并不固定绑定于某一组GPIO引脚上;而是可以通过设置相应的控制位,在一定范围内灵活指定实际使用的外部引脚位置——这就是所谓的“复用”。为了管理这类复杂的多路选择操作,STM32引入了一个专门负责处理此类事务的专用硬件单元即Alternate Function I/O (AFIO)。 #### 端口映射的理解 端口映射是指将某个逻辑地址空间内的数据重新定位至另一个不同的物理地址的过程。然而在此上下文中,“端口映射”的含义更为具体:它指的是利用AFIO寄存器来改变默认情况下某外围设备所关联的具体GPIO引脚的行为模式。例如,默认状态下串行通讯接口UART1的数据发送线TXD通常会占用PA9这个引脚;但如果开发者希望改用PB6作为新的传输路径,则可通过调整相关参数完成这一转换过程。 #### 配置方法与使用教程 要启用或更改一个外设对应的GPIO引脚分配,一般遵循如下流程: - **初始化库函数准备** 确保已经包含了必要的头文件,并定义好所需的宏定义。 ```c #include "stm32f10x.h" #define USART_TX_PIN GPIO_Pin_9 ``` - **RCC时钟使能** 开启对应外设以及相应GPIO端口的时钟供应。 ```c RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); // 假定我们正在配置的是位于GPIOA上的资源 ``` - **重映射设定** 如果需要修改默认引脚布局,则调用`GPIO_RemapConfig()` 函数来进行适当安排。 ```c GPIO_PinRemapConfig(GPIO_FullRemap_USART1, ENABLE); /* 这里选择了完全重定向USART1的所有信号 */ ``` - **GPIO初始化结构体填充** 创建并填写用于描述目标引脚属性的对象实例。 ```c GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /* 推挽输出方式 */ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; ``` - **应用上述配置** 最后一步就是执行具体的初始化动作,使得之前所做的各项准备工作生效。 ```c GPIO_Init(GPIOA, &GPIO_InitStructure); ``` 以上步骤展示了如何基于ST官方提供的标准外设库(SPL),针对STM32系列单片机实施基本的AFIO复用及端口映射操作。值得注意的是,随着版本迭代更新,部分API名称可能会有所变化,请参照最新文档资料进行核实确认。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值