【问题标题】:Timeout in UART communication (STM's HAL_UART_Transmit(...))UART 通信超时(STM 的 HAL_UART_Transmit(...))
【发布时间】:2022-11-23 02:16:01
【问题描述】:

我正在使用STM32Cube_FW_G0_V1.5.0 固件。而且我观察到我总是在函数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);

transmit函数中调用的timeout的HAL函数代码:

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 的数据表):

【问题讨论】:

  • 对方是否也配置了硬件流控?尝试在您的 UART 上禁用流量控制,看看它是否有所作为。
  • 那解决了问题。谢谢你。
  • 作为旁注:与此同时,我在 stm32CubeIDE 中遇到了很多关于工作区和项目名称的问题。我总是遇到 HardFault_Error()。在使用 CubeMX 从 .ioc 文件完全重新初始化项目后,给项目一个新名称,删除旧工作区并创建一个新工作区,问题就解决了。
  • 很高兴它正在工作。我会添加我的评论作为答案,你可以接受它。

标签: stm32 uart stm32cubeide


【解决方案1】:

另一端很可能没有配置硬件流控制,因此 STM32 永远不会看到设置的清除发送信号。

您可以禁用 STM32 UART 上的硬件流控制,或将另一端配置为使用硬件流控制。 (并确保所有 RTS/CTS 信号都已连接。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-09
    • 2013-03-28
    • 2021-03-12
    • 1970-01-01
    • 2020-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多