STM32F4 큐브 HAL UART. 버그입니까, 아니면 뭔가 빠졌습니까?


9

인터럽트 기반 UART IO (DMA 없음)를 사용하고 있습니다.

HAL_UART_Transmit_IT기능은 레지스터 EIE에서 비트를 설정합니다 CR3. STM32F407 데이터 시트 (및 실제 동작)에 따르면, 이는 다중 버퍼 모드 ( DMAR비트가 설정된 경우) 에서만 인터럽트를 생성 합니다. 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의 버그입니까?


3 년 반 후에도 여전히 문제입니다.
— user8908459

답변:


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_IT및 UART_Transmit_IT다른 기능입니다. 첫 번째는 인터럽트 만 설정하고 두 번째는 실제로 데이터를 전송합니다
— rublag

예, 그러나 두 번째 기능은 사용자가 직접 지시하지 않는 다른 HAL 기능 만 호출 할 수 있다는 것을 알고 있습니까? 그리고 HAL 소스 파일을 열고 UART_Transmit_IT와 위에 붙여 넣은 부분과 다른 것을 찾으십시오. 여전히 버그가 있다고 생각되면 다른 옵션은 st 포럼에 동일한 질문을 쓰는 것입니다.
— Gabriel Rezende Germanovix
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.