AFIO是Alternate Function I/O的缩写,即“复用功能I/O”——STM32的GPIO引脚除了普通输入/输出,还能切换为外设的专用功能(如UART的TX/RX、SPI的SCLK/MOSI等),AFIO就是管理这种“引脚复用”的外设。

 

核心作用

 

1. 引脚功能切换:比如PA9引脚默认是普通GPIO,通过AFIO配置可切换为UART1的TX引脚,实现串口通信。

2. 中断引脚映射:外部中断(EXTI)的引脚需要通过AFIO配置映射(比如将PA0映射到EXTI0中断线)。

3. 重映射功能:部分外设的引脚可通过AFIO重映射到其他GPIO(如将TIM1的PWM引脚从PA8重映射到PB13),灵活分配引脚资源。

 

关键使用场景

 

- 用GPIO实现串口、SPI、I2C、定时器等外设功能时,需先配置AFIO。

- 配置外部中断时,必须通过AFIO的EXTICR寄存器指定中断引脚。

 AFIO配置PA9为UART1_TX引脚的示例代码

 

#include "stm32f10x.h"

 

// 函数功能:配置PA9为UART1_TX(复用推挽输出),PA10为UART1_RX(浮空输入)

void UART1_GPIO_Init(void) {

    // 1. 开启GPIOA和AFIO的时钟(复用功能必须开启AFIO时钟!)

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);

    

    // 2. 定义GPIO初始化结构体

    GPIO_InitTypeDef GPIO_InitStruct;

    

    // 3. 配置PA9(UART1_TX,复用推挽输出)

    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;

    // 复用推挽输出:引脚作为外设功能输出,而非普通GPIO输出

    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;  

    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOA, &GPIO_InitStruct);

    

    // 4. 配置PA10(UART1_RX,浮空输入)

    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;

    // 浮空输入:适合接收外设信号(无需上拉/下拉电阻)

    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;  

    GPIO_Init(GPIOA, &GPIO_InitStruct);

}

 

// (可选)UART1串口初始化(含波特率配置)

void UART1_Init(uint32_t baudrate) {

    UART1_GPIO_Init(); // 先初始化GPIO复用功能

    

    // 开启UART1时钟(UART1挂在APB2总线)

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

    

    // 配置UART结构体

    USART_InitTypeDef USART_InitStruct;

    USART_InitStruct.USART_BaudRate = baudrate; // 波特率(如9600、115200)

    USART_InitStruct.USART_WordLength = USART_WordLength_8b; // 8位数据位

    USART_InitStruct.USART_StopBits = USART_StopBits_1; // 1位停止位

    USART_InitStruct.USART_Parity = USART_Parity_No; // 无校验位

    USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 无硬件流控

    USART_InitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; // 收发模式

    USART_Init(USART1, &USART_InitStruct);

    

    USART_Cmd(USART1, ENABLE); // 使能UART1

}

 

// 主函数调用示例

int main(void) {

    UART1_Init(115200); // 初始化UART1,波特率115200

    

    while(1) {

        // 可添加串口发送代码(如USART_SendData(USART1, 'A');)

    }

}

 

核心要点解析

 

1. AFIO时钟必须开启:第8行同时开启 GPIOA 和 AFIO 时钟,这是复用功能生效的前提——若只开GPIOA时钟,PA9仍为普通GPIO,无法作为UART1_TX使用。

2. 复用模式配置:PA9用 GPIO_Mode_AF_PP (复用推挽输出),表示引脚控制权交给UART1外设,而非CPU直接控制;PA10用 GPIO_Mode_IN_FLOATING (浮空输入),适配串口接收场景。

3. 外设与引脚对应:STM32的复用功能有固定引脚映射(如UART1_TX默认对应PA9),可在参考手册的「Alternate function mapping」章节查询。

 

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐