STM32 HAL_UART_Transmit函数UART通信超时问题求助
STM32 HAL_UART_Transmit超时问题排查与解决
问题概述
使用STM32Cube_FW_G0_V1.5.0固件时,调用HAL_UART_Transmit函数总会在HAL_WaitOnFlagUntilTimeout函数中触发超时错误。
相关代码与配置
部分main.c代码
/* USER CODE BEGIN PV */ uint8_t txdata[30] = "Hallo Peter \n\r"; /* USER CODE END PV */ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* Configure the system clock */ SystemClock_Config(); /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_DMA_Init(); MX_I2C1_Init(); MX_RTC_Init(); MX_SPI1_Init(); MX_USART1_UART_Init(); MX_USART2_UART_Init(); MX_DAC1_Init(); /* USER CODE BEGIN 2 */ HAL_UART_Transmit(&huart1, txdata, sizeof(txdata), 100);
超时处理函数代码
HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout) { /* Wait until flag is set */ while ((__HAL_UART_GET_FLAG(huart, Flag)? SET : RESET) == Status) { /* Check for the Timeout */ if (Timeout != HAL_MAX_DELAY) { if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) { /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */ ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE | USART_CR1_TXEIE_TXFNFIE)); ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE); huart->gState = HAL_UART_STATE_READY; huart->RxState = HAL_UART_STATE_READY; __HAL_UNLOCK(huart); return HAL_TIMEOUT; }
UART配置(来自Acconeer datasheet)

可能原因及解决办法
硬件引脚配置错误
- 确认USART1的TX引脚已配置为复用推挽输出模式,RX引脚为浮空输入模式,且引脚未被其他外设占用。
- 检查CubeMX中GPIO的复用映射是否正确,避免引脚功能冲突。
波特率不匹配
- 对比MCU配置的波特率与Acconeer外设要求(115200 8N1),确保完全一致。
- 验证系统时钟配置是否正确:USART的波特率由APB时钟计算,若系统时钟配置错误,会导致实际波特率与理论值偏差过大,触发超时。可通过查看
SystemClock_Config函数确认APB总线时钟参数。
UART外设未正确初始化
- 检查
MX_USART1_UART_Init函数,确认已开启USART使能位(USART_CR1_UE),且数据位、停止位、奇偶校验配置与外设一致。 - 初始化后可通过寄存器查看工具确认USART1的CR1、CR2、CR3寄存器配置是否正确。
- 检查
超时时间设置不合理
- 按115200波特率计算,单字节传输(含帧起始/停止位)约需86.8μs,30字节总传输时间约3ms,当前设置100ms理论足够,但如果存在时钟偏差,可尝试将
Timeout参数改为HAL_MAX_DELAY测试,排除超时时间过短的问题。
- 按115200波特率计算,单字节传输(含帧起始/停止位)约需86.8μs,30字节总传输时间约3ms,当前设置100ms理论足够,但如果存在时钟偏差,可尝试将
DMA配置冲突(若启用DMA)
- 若USART1配置了DMA传输,检查
MX_DMA_Init中是否为USART1_TX分配了正确的DMA通道,且DMA优先级设置合理。 - 确认
HAL_UART_Transmit使用的是轮询模式(默认),若误开启DMA模式,需检查DMA状态是否正常。
- 若USART1配置了DMA传输,检查
硬件故障
- 用示波器测量USART1 TX引脚的输出信号,确认是否有正常的串口波形输出。
- 检查外设侧是否正常供电、引脚连接是否牢固,可尝试更换外设或MCU板排查硬件问题。
内容的提问来源于stack exchange,提问作者SGKlee
相关产品推荐
相关产品推荐

