STM32:GPIO及AFIO函数简介

 

GPIO:

1. GPIO_Init 函数

  • 作用:用于初始化一个或多个 GPIO 引脚的各种参数,包括引脚模式(输入、输出、复用功能等)、输出类型(推挽、开漏)、输出速度、上拉 / 下拉电阻等设置。通过该函数可以将 GPIO 引脚配置成符合特定应用需求的状态。

2. GPIO_SetBits 函数

  • 作用:将指定的 GPIO 引脚设置为高电平。例如,如果已经将某个 GPIO 引脚配置为输出模式用于控制 LED 的亮灭,调用该函数就可以使该 LED 点亮(假设高电平点亮 LED)。

3. GPIO_ResetBits 函数

  • 作用:将指定的 GPIO 引脚设置为低电平。同样以 LED 控制为例,调用该函数可使已经配置为输出模式的 GPIO 引脚输出低电平,从而熄灭 LED(假设低电平熄灭 LED)。

4. GPIO_Write 函数

  • 作用:可以一次性写入多个 GPIO 引脚的电平状态。它接受一个整数值作为参数,该整数值的每一位对应一个 GPIO 引脚的电平状态,通过这种方式可以同时控制多个引脚的输出电平,适用于需要同时对多个相关 GPIO 引脚进行操作的场景。

5. GPIO_ReadInputData 函数

  • 作用:读取指定 GPIO 端口所有引脚的输入数据状态。它返回一个整数值,该整数值的每一位对应一个 GPIO 引脚的输入电平情况,通过分析这个整数值可以了解到整个端口所有引脚接收到的电平信息。

6. GPIO_ReadInputDataBit 函数

  • 作用:前面已经详细介绍过,主要用于读取指定 GPIO 引脚当前的输入数据位状态,即确定某个配置为输入模式的 GPIO 引脚接收到的是高电平还是低电平。

7. GPIO_ReadOutputData 函数

  • 作用:读取指定 GPIO 端口所有引脚的输出数据状态。返回一个整数值,其每一位对应一个 GPIO 引脚的输出电平情况,可用于了解整个端口所有已配置为输出模式的引脚的输出电平状况。

8. GPIO_ReadOutputDataBit 函数

  • 作用:同样前面已详细介绍,用于读取指定 GPIO 引脚的输出数据位状态,明确某个已配置为输出模式的 GPIO 引脚当前正在输出的是高电平还是低电平。

9. GPIO_PinLockConfig 函数

  • 作用:用于锁定 GPIO 引脚的配置,防止意外修改。一旦锁定,通过常规的 GPIO 配置函数将无法再对锁定的引脚进行重新配置,增加了系统的稳定性和安全性,适用于那些配置完成后不希望被轻易改动的关键引脚。

10. GPIO_EMI_Configure 函数

  • 作用:在一些涉及电磁干扰(EMI)防护的应用场景中,该函数用于配置 GPIO 引脚的电磁兼容性相关参数,比如调整引脚的输出驱动能力等,以降低电磁干扰对系统的影响,提高系统的电磁兼容性

AFIO:

1. AFIO_Init 函数

  • 作用:用于初始化 AFIO 模块。这通常涉及到对 AFIO 相关寄存器进行一些默认设置,比如复位某些复用功能相关的配置状态,为后续更具体的复用功能配置做好准备。在开始进行详细的 AFIO 复用功能设置之前,一般需要先调用此函数来确保 AFIO 模块处于一个合适的初始状态。

2. AFIO_EventControl 函数

  • 作用:用于控制与 AFIO 相关的事件触发机制。它可以设置是否允许某些特定事件(如外部中断事件等)通过 AFIO 模块来触发相关的响应动作。例如,在一些应用场景中,当需要精确控制外部中断等事件的触发条件及响应方式时,就可以通过该函数来进行设置,决定哪些事件能够触发后续动作以及如何触发。

3. AFIO_GetRemapping 函数

  • 作用:用于获取当前 AFIO 模块下各个 GPIO 引脚复用功能的重映射状态。通过该函数可以了解到哪些 GPIO 引脚的复用功能已经被重映射到了其他引脚或者不同的寄存器位置,这对于在复杂系统中准确把握 GPIO 引脚的实际功能分布以及排查可能出现的功能异常情况非常有用。

4. AFIO_SetRemapping 函数

  • 作用:与 AFIO_GetRemapping 函数相对应,此函数用于设置 AFIO 模块下各个 GPIO 引脚复用功能的重映射情况。可以根据具体的应用需求,将某些 GPIO 引脚的复用功能重映射到其他引脚或者不同的寄存器位置,以实现更灵活的硬件资源利用和系统设计。例如,在一些布局紧凑的电路板设计中,通过合理的重映射可以避免布线拥挤等问题,同时也能更好地满足特定应用场景下对硬件功能的要求。

5. AFIO_Remap 函数

  • 作用:这是一个更为具体的重映射函数,它可以对特定的复用功能进行重映射操作。不同的 STM32 型号可能支持不同的复用功能重映射选项,通过该函数可以按照具体的应用需求对这些特定的复用功能进行重映射,使得相应的硬件功能能够在不同的 GPIO 引脚或者寄存器位置上得以实现,进一步提高了硬件资源的利用效率和系统设计的灵活性。

6. AFIO_RemapSPI1 函数

  • 作用:专门用于对 SPI1 复用功能进行重映射的函数。在一些应用场景中,可能需要将 SPI1 的复用功能从原来的 GPIO 引脚重映射到其他引脚,以便更好地适应电路板布局、避免布线干扰等问题,或者满足其他特定的应用需求。通过调用此函数,可以方便地实现 SPI1 复用功能的重映射操作。

7. AFIO_RemapSPI2 函数

  • 作用:类似于 AFIO_RemapSPI1 函数,专门用于对 SPI2 复用功能进行重映射的操作。通过该函数可以将 SPI2 的复用功能从原来的 GPIO 引脚重映射到其他引脚,以满足不同的应用需求,如优化电路板布局、提高电磁兼容性等。

8. AFIO_RemapUSART1 函数

  • 作用:用于对 USART1 复用功能进行重映射的函数。当需要将 USART1 的复用功能重新安排到其他 GPIO 引脚时,通过调用此函数可以实现这一目的,以便更好地满足系统设计的要求,比如适应电路板布局、减少布线难度等。

9. AFIO_RemapUSART2 函数

  • 作用:与 AFIO_RemapUSART1 函数类似,是用于对 USART2 复用功能进行重映射的函数。通过该函数可以将 USART2 的复用功能从原来的 GPIO 引脚重映射到其他引脚,以实现更灵活的系统设计和更好的硬件资源利用

10. AFIO_RemapUSART3 函数

  • 作用:用于对 USART3 复用功能进行重映射的函数。通过调用此函数,可以将 USART3 的复用功能从原来的 GPIO 引脚重映射到其他引脚,以满足不同的应用需求,如优化电路板布局、提高电磁兼容性等。

11. AF20_RemapTFTLCD 函数

  • 作用:用于对 TFTLCD 相关复用功能进行重映射的函数。在涉及到 TFTLCD 显示设备的应用场景中,通过调用此函数可以将 TFTLCD 的相关复用功能从原来的 GPIO 引脚重映射到其他引脚,以适应不同的电路板布局、提高电磁兼容性等,从而更好地实现 TFTLCD 的显示功能。

12. AFIO_RemapCamera 函数

  • 作用:用于对相机相关复用功能进行重映射的函数。在包含相机模块的应用场景中,通过调用此函数可以将相机相关复用的功能从原来的 GPIO 引脚重映射到其他引脚,以适应不同的电路板布局、提高电磁兼容性等,从而更好地实现相机的相关功能。

 

<think>我们正在讨论STM32F103的GPIO_EXTILineConfig函数。根据引用内容,该函数用于配置GPIO与外部中断/事件线(EXTI)的映射关系。具体来说: 1. 函数原型:`void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)` - 第一个参数指定GPIO端口(如GPIO_PortSourceGPIOA, GPIO_PortSourceGPIOE等) - 第二个参数指定GPIO引脚(如GPIO_PinSource0, GPIO_PinSource15等) 2. 作用机制: - STM32F103的外部中断/事件控制器(EXTI)有16条中断线(对应0~15号引脚),但每个引脚只能连接到一条中断线,而每条中断线可以映射到多个GPIO端口(比如PA0, PB0, PC0等都可以连接到EXTI0线上,但同一时间只能有一个端口连接到EXTI0)。此函数就是配置某个端口的某个引脚连接到对应的EXTI线。 3. 使用步骤: a) 先使能AFIO时钟(因为EXTI的映射配置属于AFIO功能): ```c __HAL_RCC_AFIO_CLK_ENABLE(); // 在HAL库中使能AFIO时钟 ``` b) 使用`GPIO_EXTILineConfig`配置映射关系(例如将PE3映射到EXTI3): ```c GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource3); // 映射GPIOE的Pin3到EXTI3线[^1][^2][^3] ``` c) 配置EXTI线的工作模式(中断/事件、触发边沿等): ```c EXTI_InitTypeDef exti_init; exti_init.Line = EXTI_LINE_3; // 选择EXTI3线 exti_init.Mode = EXTI_MODE_INTERRUPT; // 中断模式 exti_init.Trigger = EXTI_TRIGGER_RISING; // 上升沿触发 exti_init.Pull = EXTI_PULL_NONE; // 无上拉/下拉(注意:实际GPIO的上拉/下拉需单独配置) HAL_EXTI_Init(&exti_init); // 使用HAL库初始化 ``` d) 配置NVIC(使能中断并设置优先级): ```c HAL_NVIC_SetPriority(EXTI3_IRQn, 1, 0); // 设置优先级 HAL_NVIC_EnableIRQ(EXTI3_IRQn); // 使能中断 ``` e) 编写中断服务函数: ```c void EXTI3_IRQHandler(void) { HAL_EXTI_IRQHandler(&hexti3); // 处理中断标志位 // 用户代码 } ``` 4. 注意事项: - 同一时刻,一条EXTI线只能连接到一个GPIO端口。如果多次调用该函数映射同一EXTI线到不同端口,最后一次调用的配置生效。 - 配置前必须开启AFIO时钟(在HAL库中通常通过`__HAL_RCC_AFIO_CLK_ENABLE()`使能)[^3]。 - 引脚号与EXTI线号一一对应(例如PinSource3对应EXTI线3)[^1][^3]。 5. 底层原理: - 该函数内部操作AFIO_EXTICR寄存器(External interrupt configuration register)[^3]。例如,将GPIOE的引脚3映射到EXTI3时,会设置AFIO_EXTICR[0]寄存器的对应位(因为EXTI3属于EXTICR[0]的字段范围)。 §§相关问题§§ 1. STM32F103中如何实现同一外部中断线(如EXTI0)在不同GPIO引脚间的动态切换? 2. 配置GPIO_EXTILineConfig后为什么需要单独配置GPIO的输入模式? 3. 使用HAL库配置外部中断时,如何优化中断响应时间? </think>### STM32F103 GPIO_EXTILineConfig 函数详解 #### 一、函数作用与原理 `GPIO_EXTILineConfig()` 用于配置 **GPIO引脚与外部中断线(EXTI)的映射关系**,通过操作 **AFIO(复用功能I/O)模块** 实现[^3]。其主要功能包括: 1. **连接GPIO引脚到EXTI中断线** 每条EXTI线(0-15)只能连接一个GPIO端口的同号引脚(如PA0/PB0/PC0共享EXTI0) 2. **配置中断源选择** 通过修改 `AFIO_EXTICRx` 寄存器(x=1-4)实现映射: $$ \text{AFIO\_EXTICR}[\text{EXTI线编号}/4] = \text{GPIO端口编号} $$ 3. **硬件架构关联** ```mermaid graph LR A[GPIO引脚] -->|GPIO_EXTILineConfig| B(EXTI中断线) B -->|触发信号| C[NVIC中断控制器] C --> D[CPU中断响应] ``` #### 二、函数原型与参数 ```c void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource) ``` | 参数 | 取值范围 | 说明 | |-------------------|-----------------------------|-------------------------------| | `GPIO_PortSource` | `GPIO_PortSourceGPIOx` | GPIO端口(A-G) | | `GPIO_PinSource` | `GPIO_PinSource0`~`15` | 引脚号(必须与EXTI线号对应) | #### 三、使用步骤与范例 **场景:配置 PE3 引脚上升沿触发中断** ```c // 步骤1:使能AFIO时钟(必需!) __HAL_RCC_AFIO_CLK_ENABLE(); // 步骤2:映射PE3到EXTI3线 GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource3); // [^1][^3] // 步骤3:配置EXTI触发模式 EXTI_InitTypeDef exti_init = { .EXTI_Line = EXTI_Line3, // 选择EXTI3线 .EXTI_Mode = EXTI_Mode_Interrupt, // 中断模式 .EXTI_Trigger = EXTI_Trigger_Rising, // 上升沿触发 .EXTI_LineCmd = ENABLE // 使能线路 }; EXTI_Init(&exti_init); // [^2] // 步骤4:配置NVIC优先级 HAL_NVIC_SetPriority(EXTI3_IRQn, 1, 0); HAL_NVIC_EnableIRQ(EXTI3_IRQn); ``` #### 四、关键注意事项 1. **时钟使能顺序** 必须先使能 **AFIO时钟** 和 **GPIO端口时钟**: ```c __HAL_RCC_GPIOE_CLK_ENABLE(); // 使能GPIOE时钟 __HAL_RCC_AFIO_CLK_ENABLE(); // 使能AFIO时钟[^3] ``` 2. **引脚与EXTI线强制对应** - `GPIO_PinSource3` 只能绑定到 `EXTI_Line3` - 不能将PE3映射到EXTI4等其他线路 3. **端口冲突规则** 若配置 `PA3` 后再配置 `PE3` 到EXTI3,后者会覆盖前者配置 4. **GPIO模式要求** 引脚必须配置为 **输入模式**: ```c GPIO_InitTypeDef gpio_init = { .Pin = GPIO_PIN_3, .Mode = GPIO_MODE_INPUT, // 输入模式[^4] .Pull = GPIO_NOPULL // 浮空输入 }; HAL_GPIO_Init(GPIOE, &gpio_init); ``` 5. **速度设置建议** 对于中断检测,GPIO速度选 **2MHz** 可降低功耗和噪声[^4]: ```c .Speed = GPIO_SPEED_FREQ_LOW // 2MHz低噪声模式[^4] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值