Saya menggunakan UART IO berbasis interupsi (tanpa DMA).
HAL_UART_Transmit_IT
fungsi mengatur EIE
bit dalam CR3
register. Menurut datasheet STM32F407 (dan perilaku nyata), ini menghasilkan interupsi hanya dalam mode multi buffer (ketika DMAR
bit diatur). EIE
memungkinkan pembangkitan interupsi untuk kesalahan bingkai ( FE
), kesalahan overrun ( ORE
), kesalahan noise ( NE
). Kesalahan ini, seperti yang saya mengerti, hanya untuk menerima.
Bagian dari HAL_UART_IRQHandler
fungsi:
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
memeriksa setiap kesalahan. Jika kesalahan terjadi dan EIE
bit diset, bit ini akan mengatur ulang keadaan UART, tetapi tidak mengatur ulang bit yang memungkinkan interupsi, jadi TXE
interupsi akan selalu dihasilkan, tetapi UART_Transmit_IT
fungsi memperlakukan status HAL_UART_STATE_READY
sebagai tidak valid dan tidak melakukan apa-apa. Loop tak terbatas.
Bagian dari UART_Transmit_IT
fungsi:
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;
}
}
Apakah ini bug di Cube HAL?
sumber
Jawaban:
Itu adalah bug.
Saya mengajukan pertanyaan yang sama di forum ST: https://my.st.com/d5c15f59
Mereka membenarkannya.
sumber
Apakah Anda mencoba mengunduh Cube HAL versi terbaru untuk MCU Anda?
Fungsi HAL_UART_Transmit_IT () saya tampaknya sangat berbeda dari Anda. Mungkin Anda memiliki versi yang lebih lama dengan bug.
Coba akses st.com dan cari versi terbaru dari Cube HAL. Di dalam arsip Anda akan menemukan beberapa contoh dengan USART.
sumber
HAL_UART_Transmit_IT
danUART_Transmit_IT
berbagai fungsi. Pertama hanya mengatur interupsi, sedangkan yang kedua benar-benar mentransmisikan data