Перейти к содержанию
    

STM32CubeMX + HAL и прием побайтно по прерыванию из UARTа

Привет всем

В общем цель описана в заголовке.

Не могу понять каким образом подразумевалось это делать. HAL UARTа, в отличии допустим от TIM, не экспортирует функции обратного вызова(Callbacks) непосредственно прерывания (по приходу символа), смотрю файл STM32F070xB_User_Manual.chm в поставке куба).

И как предполагалось написание обмена датаграммами _разной_ длины в фоне? Посмотрел пример:

STM32Cube_FW_F0_V1.9.0\Projects\STM32F030R8-Nucleo\Examples\UART\UART_TwoBoards_ComIT\

это вообще не серьезно. Я не могу принимать решение сколько будет в первой датаграмме байт аж в main-е.

Это должно быть при приеме конкретной датаграммы, в зависимости от значения в специальном ее поле.

Как функцией

HAL_UART_Receive_IT  ( UART_HandleTypeDef *  huart,  
  uint8_t *  pData,  
  uint16_t  Size  
 ) 

и вызовом

HAL_UART_RxCpltCallback  ( UART_HandleTypeDef *  huart ) 

такое написать?

Я не против даже изменить концепцию(извините, очень уж слово нравится) работы с уартом, если мне расскажут как же с помощью таких ресурсов решить конкретную задачу.

А как писать программу уровня "Здравствуй мир" я уже понял.

Изменено пользователем alik_tv

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. HAL_UART_Receive_IT  (&huart, pData, 1)

и

2. HAL_UART_RxCpltCallback  ( UART_HandleTypeDef *  huart )

принимать его и опять п.1

и добавить п.1 в HAL_UART_ErrorCallback

Хотя если потратить 10 минут на просмотр исходников, то можно точно понять как всё устроено и найти более изящный путь реализации.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 hours ago, x893 said:

1. HAL_UART_Receive_IT  (&huart, pData, 1)

и


2. HAL_UART_RxCpltCallback  ( UART_HandleTypeDef *  huart )

принимать его и опять п.1

и добавить п.1 в HAL_UART_ErrorCallback

Хотя если потратить 10 минут на просмотр исходников, то можно точно понять как всё устроено и найти более изящный путь реализации.

"Заказывать" один байт это тривиальное решение. Зачем мне лишний код и лишние вызовы.

А какой более изящный путь не подскажите? Смотрел я исходники, ничего изящного не придумал.

Я могу "нейтрализовать"  HAL_UART_IRQHandler своим условным переходом, сохраняя возможность перегенерации исходников кубом, но это изврат. Вряд ли разработчики на это рассчитывали.

Пока я вижу два варианта

  1. Переопределить USART3_6_IRQHandler. Но хотелось бы этого не делать. Некрасивое решение.

  2. Может быть предполагалось, что HAL_UART_Receive_IT на первом этапе "ловит" только заголовок кодограммы.

Понятно он имеет одинаковую длину(и формат) у всех кодограмм, в одном канале. Т.е. я постоянно(в фоне) жду заголовок, скажем 4 байта, в этих байтах длина данных кодограммы. После того как словил заголовок, я ожидаю данные.

Но тут проблема, у функции HAL_UART_Receive_IT нет таймаута. Если придут только три байта она "повесится".

Изменено пользователем alik_tv

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в USART3_6_IRQHandler есть USER CODE до и после вызова обработчика HAL.

Туда и вставте свой код для анализа принятых данных.

Есть RxXferCount, pRxBuffPtr - всё можно проверить и поменять.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 hours ago, x893 said:

в USART3_6_IRQHandler есть USER CODE до и после вызова обработчика HAL.

Туда и вставте свой код для анализа принятых данных.

Есть RxXferCount, pRxBuffPtr - всё можно проверить и поменять.

Верно, только вызов HAL_UART_IRQHandler чем мне может помочь? я пока не знаю.

А если он лишний, то правильный способ от него избавиться, переопределить обработчик прерывания.

Вот только как это корректно сделать, чтобы можно было с кубом и дальше работать.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По моему до меня дошло. Я догнал этот пароход. 0)

Не обязательно пользоваться HAL_UART_Receive_IT, можно инициализировать буфер приема и включить прием прямо в main-е. А дальше, как обычно, разбирать байты в USART3_6_IRQHandler.

Но вопрос в полезности HAL_UART_IRQHandler остается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

HAL_UART_IRQHandler  много чего проверяет и обрабатывает.

Конечно можно и самому все ошибки проверять. Но если есть, что бы не пользоваться ?

Если счетчик изменился - значит что то пришло и можно его проверять.

И сразу же поставить счетчик для приема следующих байтов.

Я конечно не сильно большой любитель HAL, но почему бы и нет ?

А timeout в этом же файле можно сделать на основе SysTick_Handler.

Но это избитые истины - их и так все знают.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нашел как обработчик USART3_6_IRQHandler отключить (вкладка NVIC Mode, code generation), при этом инициализация прерывания не выключается. В файле startup_stm32f030xc.s записал свой обработчик(Куб его не трогает).

Красиво все работает. Куб и Иар друг другу не мешают.

Спасибо за поддержку.

Изменено пользователем alik_tv

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...