인터럽트 기반 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의 버그입니까?