STM32F4 Küp HAL UART. Bu bir hata mı yoksa bir şey mi kaçırıyorum?


9

Kesme tabanlı UART IO kullanıyorum (DMA yok).

HAL_UART_Transmit_ITişlevi kayıttaki EIEbiti ayarlar CR3. STM32F407 veri sayfasına (ve gerçek davranışa) göre, bu sadece çoklu arabellek modunda ( DMARbit ayarlandığında) kesme oluşturur . EIEkare hatası ( FE), taşma hatası ( ORE), gürültü hatası ( NE) için kesme üretimini etkinleştirir . Bu hata, anladığım kadarıyla, sadece almak için.

HAL_UART_IRQHandlerFonksiyonun bir parçası :

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_IRQHandlerher hatayı kontrol eder. Hata oluşmuşsa ve EIEbit ayarlanmışsa, UART durumunu sıfırlar, ancak kesme etkinleştirme bitlerini sıfırlamaz, bu nedenle TXEkesme her zaman oluşturulur, ancak UART_Transmit_ITişlev durumu HAL_UART_STATE_READYgeçersiz olarak kabul eder ve hiçbir şey yapmaz. Sonsuz döngü.

UART_Transmit_ITFonksiyonun bir parçası :

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'de bir hata mı?


üç buçuk yıl sonra ve bu hala bir sorun
user8908459

Yanıtlar:


4

Bu bir hatadır.

Aynı soruyu ST forumunda sordum: https://my.st.com/d5c15f59

Bunu doğruladılar.


"My.st.com" bağlantısı bir giriş gerektirir. Bu konuyu ST forumunda buldum , bu sorunun bildirildiğini düşünüyorum ve giriş yapmadan erişilebilir, bu yüzden okuyucular bunu yararlı bulabilir.
SamGibson

0

MCU'nuz için en son Cube HAL sürümünü indirmeye çalıştınız mı?

HAL_UART_Transmit_IT () işlevim sizinkinden çok farklı görünüyor. Belki de hatalar içeren eski bir sürümünüz var.

St.com sitesine erişmeyi deneyin ve Cube HAL'in en son sürümünü arayın. Arşivin içinde USART ile ilgili bir örnek bulacaksınız.


HAL_UART_Transmit_ITve UART_Transmit_ITfarklı işlevlerdir. Birincisi sadece kesintileri ayarlar, ikincisi gerçekten veri iletir
rublag

Evet, ancak ikinci işlevin yalnızca kullanıcı tarafından doğrudan değil diğer HAL işlevi tarafından çağrılabileceğini biliyor musunuz? Ve ben HAL kaynak dosyalarımı açın ve UART_Transmit_IT ve onun yukarıda yapıştırdığınız bölümden farklı buluyorum. Hala bir hata olduğunu düşünüyorsanız Diğer seçenek st forumda aynı soru yazmaktır.
Gabriel Rezende Germanovix
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.