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


9

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

HAL_UART_Transmit_IT功能设置寄存器中的EIECR3。根据STM32F407数据表(以及实际行为),这仅在多缓冲区模式下(当DMAR位置1 时)产生中断。EIE使能针对帧错误(FE),溢出错误(ORE),噪声错误(NE)的中断生成。据我了解,此错误仅用于接收。

部分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中的错误吗?


三年半之后,这仍然是一个问题
user8908459 '19

Answers:


4

这是一个错误。

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

他们确认了。


“ my.st.com”链接需要登录。我在ST论坛上找到了该线程,我认为这是该问题的报告,无需登录即可访问,因此读者可能会发现它很有用。
SamGibson

0

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

我的HAL_UART_Transmit_IT()函数似乎与您的函数完全不同。也许您有较旧版本的错误。

尝试访问st.com并搜索Cube HAL的最新版本。在档案库内,您将找到有关USART的示例。


HAL_UART_Transmit_ITUART_Transmit_IT是不同的功能。第一个只设置中断,而第二个实际发送数据
rublag

是的,但是您知道第二个函数只能由其他HAL函数调用,而不能由用户直接调用吗?我只是打开我的HAL源文件,找到UART_Transmit_IT及其与您上面粘贴的部分不同的内容。如果您仍然认为存在错误,那么另一个选择是在st论坛上写同样的问题。
加布里埃尔·雷森德·日尔曼诺维奇
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.