割り込みベースの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