Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/56: Рейтинг темы: голосов - 56, средняя оценка - 4.73
1 / 1 / 0
Регистрация: 28.07.2011
Сообщений: 46

HAL_UART_Transmit_DMA возвращает HAL_BUSY

01.07.2019, 17:55. Показов 10840. Ответов 5

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Разбираюсь с передачей UART+DMA и наткнулся на следующую проблему:
После запуска отладчика первый вызов HAL_UART_Transmit_DMA проходит нормально и в терминал выводится строка, которую я задал, а последующие вызовы HAL_UART_Transmit_DMA возвращают статус HAL_BUSY и текст не выводится в терминал.
Проект создавался в CubeMX.
Вот часть кода, которую я добавил в проект, больше в проекте ничего не менял.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
uint8_t TxBuffer[] = "Testing\n\r";
 
  while (1)
  {
 
      if(HAL_UART_Transmit_DMA(&huart2, (uint8_t*)TxBuffer, sizeof(TxBuffer))!= HAL_OK)
      {
        Error_Handler();
      }
 
      HAL_Delay(3000);
 
    /* USER CODE END WHILE */
 
    /* USER CODE BEGIN 3 */
  }
Подскажите чего я не учёл?
PS. Подобных проблем через поиск не нашёл.
PSS. Прошу не писать что-то вроде "откажись от HAL" и т.д. а помочь в решении проблемы.

Добавлено через 39 минут
Добавил в программу следующее:
C
1
2
3
4
5
6
7
8
9
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *UartHandle)
{
    UartReady = SET;
}
 
void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart)
{
    UartReady = SET;
}
При исполнении осуществляется вход в HAL_UART_TxHalfCpltCallback, а в HAL_UART_TxCpltCallback входа нет.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.07.2019, 17:55
Ответы с готовыми решениями:

stm32f4 spi dma возврат HAL_BUSY
Привет. Столкнулся с проблемой передачи и приема данных по spi. Инициализация spi: void MX_SPI4_Init(void) { hspi4.Instance =...

Не получается с HAL_UART_Transmit_DMA на stm32f103
Здравствуйте, возникла проблема с передачей данных с помощью UART с контроллера stm32f103c8t6. char str; uint16_t i=0; while...

HAL_ADC_Start_DMA(); и HAL_UART_Transmit_DMA(); не работают вместе
Доброго времени суток, HAL_ADC_Start_DMA(); и HAL_UART_Transmit_DMA(); вместе не работают. С такой проблемой уже сталкивался, решение было...

5
Эксперт .NET
 Аватар для Rius
13121 / 7681 / 1675
Регистрация: 25.05.2015
Сообщений: 23,430
Записей в блоге: 14
01.07.2019, 18:01
После 3 секунд ожидания попробуйте выполнить
C++
1
2
3
      HAL_UART_DMAStop(&huart2);
      //HAL_DMA_Abort(huart2->hdmarx);
      HAL_DMA_Abort(huart2->hdmatx);
0
1 / 1 / 0
Регистрация: 28.07.2011
Сообщений: 46
02.07.2019, 12:45  [ТС]
Ругается на строчку HAL_DMA_Abort(huart2->hdmatx);
invalid type argument of '->' (have 'UART_HandleTypeDef {aka struct <anonymous>}')
0
Эксперт .NET
 Аватар для Rius
13121 / 7681 / 1675
Регистрация: 25.05.2015
Сообщений: 23,430
Записей в блоге: 14
02.07.2019, 13:16
huart2.hdmatx
0
1 / 1 / 0
Регистрация: 28.07.2011
Сообщений: 46
02.07.2019, 13:44  [ТС]
Программа скомпилировалась, но не помогло.
При пошаговом выполнении программы в функции HAL_UART_Transmit_DMA не выполняется условие
C
1
2
3
4
5
6
7
8
9
10
if(huart->gState == HAL_UART_STATE_READY)
  {
    /* здесь выполняются основные проверки и операции */
 
    return HAL_OK;
  }
  else
  {
    return HAL_BUSY;
  }
При первом запуске в huart->gState значение HAL_UART_STATE_READY, а при последующих в huart->gState значение HAL_UART_STATE_BUSY_TX из-за этого функция HAL_UART_Transmit_DMA завершает работу и возвращает HAL_BUSY.

Вроде проследил пошагово, но не могу разобраться в какой функции значение в huart->gState должно меняться на HAL_UART_STATE_READY.

Добавлено через 14 минут
Попробовал так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
uint8_t TxBuffer[] = "Testing12345667890098765432112345678909876543211234567890987654321\n\r";
 
while (1)
{
   if(HAL_UART_Transmit_DMA(&huart2, (uint8_t*)TxBuffer, sizeof(TxBuffer))!= HAL_OK)
   {
      Error_Handler();
   }
 
   HAL_Delay(5);
 
   HAL_UART_AbortTransmit(&huart2);
}
Сообщение приходит в терминал полностью, но если убрать HAL_Delay(5) то приходит только первый символ "Т".
Мне кажется это неверное решение, DMA наверное должно вообще без HAL_Delay() работать. Надо только проверять готовность для отправки.

Пытаюсь дальше найти где должен устанавливаться HAL_UART_STATE_READY.
0
1 / 1 / 0
Регистрация: 28.07.2011
Сообщений: 46
02.07.2019, 16:35  [ТС]
Оказывается, при использовании USART+DMA необходимо обязательно включать прерывания USART (самая нижняя галочка на скриншоте).
Или вручную включить прерывание USART следующими строчками:
HAL_NVIC_SetPriority(USART2_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(USART2_IRQn);

Проблема решена.
Миниатюры
HAL_UART_Transmit_DMA возвращает HAL_BUSY  
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.07.2019, 16:35
Помогаю со студенческими работами здесь

Создать функцию, которая возвращает массив в обратном порядке. Именно возвращает
Не могу никак создать функцию.

Написать функцию которая возвращает возвращает список файлов в рабочей директории
Мне нужно написать функцию которая возвращает возвращает список файлов в рабочей директории def workdir_view(request): #...

Напишите функцию evenOrOdd, которая принимает аргумент number и возвращает ‘ Even’ , и возвращает ‘Odd’
Напишите функцию evenOrOdd, которая принимает аргумент number и возвращает &quot;Even&quot;, и возвращает &quot;Odd&quot;, если число нечётное ...

Метод без проблем возвращает строку, но не возвращает класс
Здравствуйте! Уже сутки бьюсь с проблемой и не пойму вообще почему она возникла. Есть WCF-сервер и -клиент. На сервере есть 2 метода,...

OpenEventLog возвращает 0, GetLastError возвращает 1314 (Недостаточно прав)
Добрый день! В программе используется OpenEventLog, она возвращает нулевой дескриптор, вызванная поле нее функция GetLastError возвращает...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru