STM32F4 立方体 HAL UART。这是一个错误还是我错过了什么?

电器工程 UART stm32 中断 stm32f4
2022-02-05 14:38:59

我正在使用基于中断的 UART IO(无 DMA)。

HAL_UART_Transmit_IT函数设置寄存器EIE中的位CR3根据 STM32F407 数据表(和实际行为),这仅在多缓冲区模式下(DMAR设置位时)产生中断。为帧错误 ( )、溢出错误 ( )、噪声错误 ( )EIE启用中断生成据我了解,此错误仅用于接收。FEORENE

部分HAL_UART_IRQHandler功能:

tmp1 = __HAL_UART_GET_FLAG(huart, UART_FLAG_ORE);
tmp2 = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_ERR);
/* UART Over-Run interrupt occurred ----------------------------------------*/
if((tmp1 != RESET) && (tmp2 != RESET))
{ 
  __HAL_UART_CLEAR_OREFLAG(huart);

  huart->ErrorCode |= HAL_UART_ERROR_ORE;
}

if(huart->ErrorCode != HAL_UART_ERROR_NONE)
{
  /* Set the UART state ready to be able to start again the process */
  huart->State = HAL_UART_STATE_READY;

  HAL_UART_ErrorCallback(huart);
}  

HAL_UART_IRQHandler检查每个错误。如果发生错误并EIE设置位,它会重置 UART 状态,但不会重置中断使能位,因此TXE将始终产生中断,但UART_Transmit_IT函数将状态HAL_UART_STATE_READY视为无效并且不执行任何操作。无限循环。

部分UART_Transmit_IT功能:

static HAL_StatusTypeDef UART_Transmit_IT(UART_HandleTypeDef *huart)
  {
  uint16_t* tmp;
  uint32_t tmp1 = 0;

  tmp1 = huart->State;
  if((tmp1 == HAL_UART_STATE_BUSY_TX) || (tmp1 == HAL_UART_STATE_BUSY_TX_RX))
  {
  }
  else
  {
    return HAL_BUSY;
  }
}

它是 Cube HAL 中的错误吗?

2个回答

这是一个错误。

我在 ST 论坛上问过同样的问题:https ://my.st.com/d5c15f59

他们证实了这一点。

您是否尝试为您的 MCU 下载最新版本的 Cube HAL?

我的 HAL_UART_Transmit_IT() 函数似乎与您的非常不同。也许你有一个带有错误的旧版本。

尝试访问 st.com 并搜索 Cube HAL 的最新版本。在存档中,您会找到一些 USART 示例。