STM32的GPIO的复用功能和重映射功能

1、复用功能:内置外设是与I/O口共用引出管脚(不同的功能对应同一管脚)
STM32 所有内置外设的外部引脚都是与标准GPIO引脚复用的,如果有多个复用功能模块对应同一个引脚,只能使能其中之一,其它模块保持非使能状态。

2、重映射功能:复用功能的引出脚可以通过重映射,从不同的I/O管脚引出,即复用功能的引出脚位是可通过程序改变到其他的引脚上!

直接好处:PCB电路板的设计人员可以在需要的情况下,不必把某些信号在板上绕一大圈完成联接,方便了PCB的设计同时潜在地减少了信号的交叉干扰。
如:USART1: 0: 没有重映像(TX/PA9,RX/PA10); 1: 重映像(TX/PB6,RX/PB7)。

(参考AFIO_MAPR寄存器介绍)[0,1为一寄存器的bit值]
【注】 下述复用功能的引出脚具有重映射功能:
  - 晶体振荡器的引脚在不接晶体时,可以作为普通I/O口
  - CAN模块; - JTAG调试接口;- 大部分定时器的引出接口; - 大部分USART引出接口
  - I2C1的引出接口;  - SPI1的引出接口;


举例:
对于STM32F103VBT6,47引脚为PB10,它的复用功能是I2C2_SCL和 USART3_TX,表示在上电之后它的默认功能为PB10,而I2C2的SCL和USART3的TX为它的复用功能;另外在TIM2的引脚重映射后,TIM2_CH3也成为这个引脚的复用功能。
(1)要使用STM32F103VBT6的47、48脚的 USART3功能,则需要配置47脚为  复用推挽输出 或  复用开漏输出 ,配置48脚为某种输入模式,同时 使能USART3并保持I2C2的非使能状态
(2)使用STM32F103VBT6的47脚作为TIM2_CH3,则需要对TIM2进行重映射,然后再按复用功能的方式配置对应引脚. 

要使用某个引脚的复用功能时,在开启了对应引脚的GPIO时钟功能模块时钟的前提下,需要作如下配置:
1)在配置该引脚的GPIO时,选择推挽复用输出(AF_PP)或开漏复用输出(AF_OD)
2)使能对应功能的模块
3)不要使能不用的功能的模块

以下为参考手册中内容:
8.1.4  复用功能(AF)
使用默认复用功能前必须对端口位配置寄存器编程。
● 对于复用的输入功能,端口必须配置成输入模式(浮空、上拉或下拉)且输入引脚必须由外部 驱动。
● 对于复用输出功能,端口必须配置成复用功能输出模式(推挽或开漏)。
● 对于双向复用功能,端口位必须配置复用功能输出模式(推挽或开漏)。这时,输入驱动器被 配置成浮空输入模式。

如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的输出信号连接。
如果软件把一个GPIO脚配置成复用输出功能,但是外设没有被激活,它的输出将不确定。




### GPIO复用功能与配置方法 #### 功能概述 GPIO复用的主要目的是通过共享硬件资源来实现多种功能的选择。在一个嵌入式系统中,引脚数量有限,而设备可能需要支持多种外设接口(如UART、I2C、SPI等)。因此,GPIO复用允许单个物理引脚在不同模式下工作,从而满足多任务需求[^2]。 #### 配置流程 以下是基于常见微控制器架构的GPIO复用配置的一般过程: 1. **设置GPIO模式** 在初始化阶段,需定义GPIO的工作模式。例如,在某些STM32系列芯片中,可以通过结构体变量`GPIO_InitStructure`中的成员`GPIO_Mode`指定输入浮空模式: ```c GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); ``` 这里设置了PA口为浮空输入状态[^1]。 2. **启用复用功能** 如果目标是将GPIO切换至特定外设功能,则需要重新映射其默认行为。这通常涉及修改寄存器位以激活所需的外设信号路径。例如,对于ARM Cortex-M系列处理器,可以调用库函数完成此操作: ```c GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1); ``` 3. **查阅具体平台手册** 对于专用SoC(如RK3568),必须参考官方技术参考手册(TRM)获取精确的寄存器地址及其用途说明。例如,《Rockchip RK3568 TRM Part1 V1.1-20210301.pdf》提供了关于如何定位操控GPIO复用控制寄存器的信息[^3]。 4. **编写驱动程序** 基于上述资料开发相应的软件逻辑,确保能够动态调整引脚属性并适配实际应用场景的需求。下面是一个简单的伪代码示例展示如何访问寄存器以改变GPIO功能分配: ```c volatile uint32_t *pGpioFuncSelReg = (uint32_t *)0xXXXXYYYY; // 替换为目标寄存器的实际基址 // 修改某一位或几位字段值触发功能转换 *pGpioFuncSelReg |= (1 << PIN_NUMBER); ``` #### 注意事项 - 不同厂商的产品间存在差异,请始终优先依赖对应数据表技术文档。 - 测试过程中务必验证更改后的效果是否符合预期,防止误操作引发异常状况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值