STM32 笔记:串口相关

记录 STM32 UART 的 GPIO 初始化、基本配置,以及轮询、中断、DMA 三种收发方式。

周六 1月 10 2026
352 字 · 3 分钟

PP:两个MOS管,主动输出高电平和低电平

GPIO_Mode_Out_OD(开漏输出)下拉MOS管,NMOS关闭 → 悬空

一、GPIO初始化

static void uart1_gpio_init(void)
{
__HAL_RCC_USART1_CLK_ENABLE();//开串口时钟
__HAL_RCC_GPIOA_CLK_ENABLE(); //开GPIO时钟
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = UART1_TX_PIN | UART1_RX_PIN;
//AF_PP模式
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
//AF到串口1
GPIO_InitStruct.Alternate = UART1_GPIO_AF;
HAL_GPIO_Init(UART1_GPIO_PORT, &GPIO_InitStruct);
// NVIC开启串口中断(轮询不用)
HAL_NVIC_SetPriority(USART1_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(USART1_IRQn);
}

二、串口初始化

static void uart1_open(uint32_t baud)
{
uart1_gpio_init();//配置GPIO
huart1.Instance = USART1;
huart1.Init.BaudRate = baud;//设置波特率
//8位宽
huart1.Init.WordLength = UART_WORDLENGTH_8B;
//停止位
huart1.Init.StopBits = UART_STOPBITS_1;
//无校验
huart1.Init.Parity = UART_PARITY_NONE;
//收发
huart1.Init.Mode = UART_MODE_TX_RX;
//无流控
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
HAL_UART_Init(&huart1);
}

三、3种模式的选择

//1.轮询模式,数据在OUT,用一次调一次这个函数
uint8_t out;
HAL_UART_Receive(&huart1, out, 1, time_ms);
//2.中断模式(这里面不处理数据)
HAL_UART_Receive_IT(&huart1, &rx1, 1);
//中断入口函数
//这是硬件的中断入口
void USART1_IRQHandler(void)
{
//这是HAL库的
HAL_UART_IRQHandler(&huart1);//接收回调函数,之后调用下面的函数
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if (huart->Instance == USART1)
{
// 收到的字节在 rx1 里
//一个自己写的函数,用于在其他文件里面传rx1
BSP_UART_RxByteCallback(1, rx1);
// 关键:重新开启下一次1字节接收,否则只收一次
HAL_UART_Receive_IT(&huart1, &rx1, 1);
}
}
//3.DMA模式
/*
rx_dma_buf → DMA接收缓冲区
RX_DMA_LEN → 接收长度
*/
HAL_UART_Receive_DMA(&huart1, rx_dma_buf, RX_DMA_LEN);
//中断函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if (huart->Instance == USART1)
{
// DMA接收完成
}
}

Thanks for reading!

STM32 笔记:串口相关

周六 1月 10 2026
352 字 · 3 分钟