【STM32】AFIO 以及重映射

在配置外部中断的时候,打开GPIO时钟的时候,也同时打开了AFIO的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO,ENABLE);

AFIO

简单来说

MCU有对外管脚,包括CPU的管脚和内置外设(PWM,TIM,ADC……)的管脚;
他们都需要对外接口IO,但是管脚总数是有限的,有的管脚既作为普通IO,也作为外设IO,有时候甚至好几个内置外设共用一个IO,这就是管脚复用现象。

比如随便一个管脚的原理图上:
PA2/USART2_TX/ADC123_IN2/TIM5_CH3/TIM2_CH3
表明这个管脚除了作为普通PA2之外,还作为复用IO,有USART2,ADC,TIM5,TIM2等……

总结:

  1. 普通管脚就是GPIO,复用管脚(非普通管脚)就是AFIO;
  2. 只要用到内置外设的管脚,都需要打开复用IO(AFIO),比如对外输出PWM波形,使用AD转换等。

不是说使用了IO的复用功能就一定要启动RCC_APB2Periph_AFIO的Clock的,只有使用了AFIO的事件控制寄存器AFIO的重映射功能以及外部中断(EXTI)控制寄存器才需要开启AFIO的时钟。

单纯的IO口复用功能不需要开启AFIO时钟,remap需要。

例子

1.外部中断

GPIO_InitTypeDef GPIO_InitStructure;//
EXTI_InitTypeDef EXTI_
<think>我们正在讨论STM32重映射功能。用户之前询问了扇区、页和字节的概念,但当前的查询是关于STM32重映射实现方法。根据提供的引用,特别是引用[1]、[2]、[3]和[4],我们需要整理出STM32实现重映射的具体步骤和方法。 关键点: 1. 重映射的概念:将外设的引脚从默认的端口映射到其他端口,以优化电路板设计。 2. 重映射的类型:部分重映射和完全重映射(如引用[3]中提到的USART3)。 3. 实现步骤:通过配置相关的重映射寄存器和复用功能寄存器来实现。 步骤: 1. 确定需要重映射的外设和引脚:查阅芯片参考手册(如《STM32中文参考手册V10》)中的复用功能和重映射表(引用[1]和[2])。 2. 使能重映射时钟:重映射需要用到AFIO时钟,首先需要使能AFIO时钟。 3. 配置重映射寄存器:通过设置AFIO_MAPR寄存器(或其他重映射寄存器)的相应位来选择部分重映射或完全重映射(引用[3]和[4])。 4. 配置GPIO:将重映射后的引脚配置为复用功能模式。 示例代码(以USART3重映射为例): 根据引用[3],USART3有部分重映射和完全重映射两种。部分重映射将TXD和RXD重映射到PB10和PB11,完全重映射重映射到PC10和PC11。 代码步骤: 1. 使能AFIO时钟:RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); 2. 使能USART3和对应GPIO端口的时钟。 3. 选择重映射类型:使用函数GPIO_PinRemapConfig(),参数可以是GPIO_PartialRemap_USART3或GPIO_FullRemap_USART3。 4. 配置重映射后的GPIO为复用推挽输出(对于TXD)和浮空输入或复用开漏(对于RXD)。 注意:在配置重映射之前,可能需要禁用该外设(如USART3)以避免配置过程中的不稳定。 根据引用[4],我们还可以看到通过直接操作寄存器的方式来实现重映射,但通常推荐使用标准外设库或HAL库提供的函数。 因此,回答应包括: 1. 重映射的基本概念。 2. 实现重映射的步骤。 3. 以USART3为例的具体代码示例(使用库函数)。 4. 注意事项。 同时,生成相关问题。 注意:用户提供的引用中,引用[1]和[2]介绍了重映射的概念,引用[3]给出了USART3重映射的具体宏定义和函数,引用[4]展示了直接寄存器操作。 由于用户要求使用中文回答,所以整个回答用中文。 </think>### STM32引脚重映射实现方法 #### 一、重映射基本概念 STM32重映射功能允许将外设的默认引脚功能重新分配到其他引脚上,从而优化PCB布局设计。这种功能主要通过**复用功能重映射寄存器**(AFIO_MAPR)实现[^1][^2]。重映射分为两种类型: 1. **部分重映射**:仅改变部分外设引脚的位置 2. **完全重映射**:将所有外设引脚迁移到新位置[^3] #### 二、实现步骤 ```mermaid graph TD A[使能AFIO时钟] --> B[配置重映射寄存器] B --> C[设置新引脚为复用功能] C --> D[初始化外设] ``` ##### 1. 使能AFIO时钟 重映射操作需要先激活AFIO(复用功能I/O)时钟: ```c RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); ``` *关键点:未启用AFIO时钟时重映射配置无效[^1]* ##### 2. 配置重映射寄存器 使用标准库函数配置重映射类型: ```c // USART3部分重映射示例 GPIO_PinRemapConfig(GPIO_PartialRemap_USART3, ENABLE); // USART3完全重映射示例 GPIO_PinRemapConfig(GPIO_FullRemap_USART3, ENABLE); ``` 寄存器级操作示例(直接操作AFIO_MAPR): ```c AFIO->MAPR |= AFIO_MAPR_USART3_REMAP_PARTIAL; // 部分重映射 AFIO->MAPR |= AFIO_MAPR_USART3_REMAP_FULL; // 完全重映射[^4] ``` ##### 3. 配置新引脚功能 将目标引脚设置为复用模式: ```c GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11; // 例如PB10/PB11 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出 GPIO_Init(GPIOB, &GPIO_InitStructure); ``` ##### 4. 外设初始化 最后配置外设本身(以USART为例): ```c USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = 9600; // ...其他参数初始化 USART_Init(USART3, &USART_InitStructure); USART_Cmd(USART3, ENABLE); ``` #### 三、关键注意事项 1. **查阅参考手册**:重映射可行性需确认《STM32中文参考手册》P116的"复用功能映射表"[^1] 2. **时钟优先级**:重映射配置必须在GPIO和外设初始化前完成 3. **冲突避免**:确保新引脚未被其他功能占用 4. **调试影响**:完全重映射可能导致JTAG/SWD调试端口失效,需启用备用调试模式[^3] #### 四、完整示例流程(USART2重映射) ```c // 1. 时钟使能 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 2. 配置重映射 GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE); // 3. 配置新引脚(PA2-TX, PA3-RX) GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); // 4. 初始化USART USART_InitStructure.USART_BaudRate = 115200; // ...其他参数 USART_Init(USART2, &USART_InitStructure); USART_Cmd(USART2, ENABLE); ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值