STM32F4 куб HAL UART. Це помилка чи я щось пропускаю?


9

Я використовую 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?


через три з половиною роки, і це все ще проблема
користувач8908459

Відповіді:


4

Це клоп.

Я задавав таке ж питання на форумі ST: https://my.st.com/d5c15f59

Вони це підтвердили.


Посилання "my.st.com" вимагає входу. Я знайшов цю тему на форумі ST, яка, на мою думку, є повідомленням про цю проблему, і вона доступна без логіну, тому читачі можуть вважати це корисним.
SamGibson

0

Ви намагалися завантажити найновішу версію Cube HAL для свого MCU?

Моя функція HAL_UART_Transmit_IT () здається зовсім іншою, ніж ваша. Можливо, у вас є старша версія з помилками.

Спробуйте отримати доступ до st.com та шукайте найсвіжішу версію Cube HAL. Всередині архіву ви знайдете приклад із USART.


HAL_UART_Transmit_ITі UART_Transmit_ITє різними функціями. Перший встановлює лише переривання, а другий фактично передає дані
rublag

Так, але ви знаєте, що другу функцію може викликати лише інша функція HAL, а не безпосередньо користувачем? І я просто відкриваю свої вихідні файли HAL і знаходжу UART_Transmit_IT і його інше, ніж частину, яку ви вставили вище. Інший варіант, якщо ви все ще вважаєте, що є помилка, - написати те саме питання на st форумі.
Габріель Резенде Германовікс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.