STM单片机GPIO模式切换:从输出模式转USART复用功能模式
STM单片机GPIO工作模式切换实现方法
针对你提出的「先将GPIOA_Pin0配置为数字输出,后续切换为USART2复用功能」的需求,下面分标准库和HAL库两种常见开发方式给出具体实现:
一、标准库实现(以STM32F1系列为例)
1. 初始配置为数字输出模式
#include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" #include "stm32f10x_usart.h" // 配置GPIOA_Pin0为推挽输出 void GPIOA_Pin0_Config_Output(void) { GPIO_InitTypeDef GPIO_InitStructure; // 使能GPIOA时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); }
2. 切换为USART2复用功能模式
假设GPIOA_Pin0作为USART2的TX引脚,需配置为复用推挽输出;若作为RX则配置为浮空/上下拉输入:
// 切换GPIOA_Pin0为USART2复用模式并初始化串口 void GPIOA_Pin0_Switch_To_USART2(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; // 使能USART2时钟(USART2挂载在APB1总线) RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); // 重新配置GPIOA_Pin0为复用推挽输出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出(适配TX) // 若为RX引脚,改为GPIO_Mode_IN_FLOATING / GPIO_Mode_IPU / GPIO_Mode_IPD GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化USART2参数 USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Tx; // 仅开启发送,需接收则加USART_Mode_Rx USART_Init(USART2, &USART_InitStructure); // 使能USART2 USART_Cmd(USART2, ENABLE); }
二、HAL库实现(以STM32F4系列为例)
1. 初始配置为数字输出模式
#include "stm32f4xx_hal.h" // 配置GPIOA_Pin0为推挽输出 void GPIOA_Pin0_Config_Output(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; // 使能GPIOA时钟 __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); }
2. 切换为USART2复用功能模式
HAL库需指定复用功能的映射编号(不同系列AF编号不同,F4系列USART2对应AF7):
// 切换GPIOA_Pin0为USART2复用模式并初始化串口 void GPIOA_Pin0_Switch_To_USART2(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; UART_HandleTypeDef huart2 = {0}; // 使能USART2时钟 __HAL_RCC_USART2_CLK_ENABLE(); // 重新配置GPIOA_Pin0为复用推挽输出 GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Alternate = GPIO_AF7_USART2; // F4系列USART2的复用映射编号 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化USART2参数 huart2.Instance = USART2; huart2.Init.BaudRate = 9600; huart2.Init.WordLength = UART_WORDLENGTH_8B; huart2.Init.StopBits = UART_STOPBITS_1; huart2.Init.Parity = UART_PARITY_NONE; huart2.Init.Mode = UART_MODE_TX; huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart2.Init.OverSampling = UART_OVERSAMPLING_16; HAL_UART_Init(&huart2); }
关键注意事项
- 切换模式前,建议先将GPIO引脚设置为安全电平(如
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET)),避免切换过程中出现异常电平; - 复用功能配置前必须使能对应外设的时钟(如USART2),否则复用功能无法生效;
- 不同STM32系列的复用映射编号、总线时钟挂载情况可能不同,需参考对应型号的《参考手册》确认细节。
内容的提问来源于stack exchange,提问作者Helmi Lakhder
相关产品推荐
相关产品推荐

