STM32F4 Cube HAL UART. Apakah ini bug atau saya melewatkan sesuatu?

9

Saya menggunakan UART IO berbasis interupsi (tanpa DMA).

HAL_UART_Transmit_ITfungsi mengatur EIEbit dalam CR3register. Menurut datasheet STM32F407 (dan perilaku nyata), ini menghasilkan interupsi hanya dalam mode multi buffer (ketika DMARbit diatur). EIEmemungkinkan 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_IRQHandlerfungsi:

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_IRQHandlermemeriksa setiap kesalahan. Jika kesalahan terjadi dan EIEbit diset, bit ini akan mengatur ulang keadaan UART, tetapi tidak mengatur ulang bit yang memungkinkan interupsi, jadi TXEinterupsi akan selalu dihasilkan, tetapi UART_Transmit_ITfungsi memperlakukan status HAL_UART_STATE_READYsebagai tidak valid dan tidak melakukan apa-apa. Loop tak terbatas.

Bagian dari UART_Transmit_ITfungsi:

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?

rublag
sumber
tiga setengah tahun kemudian dan ini masih menjadi masalah
user8908459

Jawaban:

4

Itu adalah bug.

Saya mengajukan pertanyaan yang sama di forum ST: https://my.st.com/d5c15f59

Mereka membenarkannya.

rublag
sumber
Tautan "my.st.com" memerlukan login. Saya menemukan utas ini di forum ST, yang menurut saya merupakan pelaporan masalah ini, dan dapat diakses tanpa login, sehingga pembaca dapat menemukan itu berguna.
SamGibson
0

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.

Gabriel Rezende Germanovix
sumber
HAL_UART_Transmit_ITdan UART_Transmit_ITberbagai fungsi. Pertama hanya mengatur interupsi, sedangkan yang kedua benar-benar mentransmisikan data
rublag
Ya, tapi tahukah Anda bahwa fungsi kedua hanya dapat dipanggil oleh fungsi HAL lain yang tidak diarahkan oleh pengguna? Dan saya hanya membuka file sumber HAL saya dan menemukan UART_Transmit_IT dan berbeda dari bagian yang Anda tempelkan di atas. Pilihan lain jika Anda masih berpikir ada bug adalah menulis pertanyaan yang sama di forum st.
Gabriel Rezende Germanovix