You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

UART配置

可能原因及解决办法

  • 硬件引脚配置错误

    • 确认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测试,排除超时时间过短的问题。
  • DMA配置冲突(若启用DMA)

    • 若USART1配置了DMA传输,检查MX_DMA_Init中是否为USART1_TX分配了正确的DMA通道,且DMA优先级设置合理。
    • 确认HAL_UART_Transmit使用的是轮询模式(默认),若误开启DMA模式,需检查DMA状态是否正常。
  • 硬件故障

    • 用示波器测量USART1 TX引脚的输出信号,确认是否有正常的串口波形输出。
    • 检查外设侧是否正常供电、引脚连接是否牢固,可尝试更换外设或MCU板排查硬件问题。

内容的提问来源于stack exchange,提问作者SGKlee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 17:55:30