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

Вопросы по работе UART через HAL.

18.10.2016, 11:19. Показов 22580. Ответов 47
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
HAL_UART_Receive_IT(&huart1,&test[0],100);
HAL_UART_Transmit_IT(&huart1,&test1[0],100);
HAL_UART_Receive_DMA(&huart1,&test[0],100);
HAL_UART_Transmit_DMA(&huart1,&test1[0],100);
Вопросы по этим функциям.

1. Прерывание длится пока не будет получен весь массив или только один байт ? (решено, прерывание вызывается пока не будет получен весь массив, потом необходимо вызывать инициализировать заново)
1.1 Аналогично для режима DMA.
1.2 В режиме DMA можно включить кольцевой массив. Тогда достаточно инициализировать 1 раз, и данные всегда будут поступать в буфер.
2. Почему при приёме каждое новое слово дописывается в массив, а не перезаписывает его с 1 элемента ? (решено, см п 2.1)
2.1 Или это потому что слово меньше 100 байт, и пока он не получит все 100 байт он будет считать это продолжением передачи (решено, так и есть)
3. Для простой передачи данных во внешнее устройство правильнее использовать HAL_UART_Transmit_DMA ? (решено, да правильнее снижается нагрузка на CPU + появляются дополнительные удобства в виде кольцевого буфера и возможности только раз запустить функцию, возможно есть и другие)
4. Динные полученные через DMA, не являются атомарными:
4.1 Для прерываний ?(решено, атомарность 1 байт)
4.2 Для основной программы ?(решено, атомарность 1 байт)
5. Динные полученные через IT, не являются атомарными:
5.1 Для прерываний ? (решено, атомарность 1 байт)
5.2 Для основной программы ? (решено, атомарность 1 байт)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.10.2016, 11:19
Ответы с готовыми решениями:

STM32F103C8T6 HAL UART
Добрый вечер. Ситуация такая, не могу понять как правильно реализовать прием данных по UART не использую к примеру прерывания. У меня...

UART, HAL, stm32
Здравствуйте, только недавно узнал о существовании библиотеки HAL. Решил попробовать отправлять по блютуз модулю данные. Получается что-то...

Stm32f4 Uart Hal
Здравствуйте. Изучаю плату STM32F4 discovery. Для неё имеется куча примеров, спасибо. А мне вот надо UART6 (тот который...

47
0 / 0 / 0
Регистрация: 24.08.2009
Сообщений: 3
18.10.2016, 11:31
Прежде всего скажу следующее ,не холивара ради! просто мнение... Так как сам пользую HAL.
функции по приему/передачи UART реализованы слегка коряво. Но это на мой взгляд.

Работают они следующим образом - по умолчанию прерывание ЗАПРЕЩЕННО! При вызове ф-ции прерывание разрешается и пока счетчик не обнулится оно будет разрешено. И после этого опять запрется.

именно поэтому вы будите получать байты в свой массив пока не будет получено то кол-во байт которое вы указали в параметрах.
Почему мне это НЕ нравится? Дело в том что в большинстве моих задач я НЕ знаю когда мне придет запрос... А если я не вызову фци-ю приема то и не получу ничего.. Никогда..
0
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 162
18.10.2016, 11:51
Цитата Сообщение от kos
Прежде всего скажу следующее ,не холивара ради! просто мнение... Так как сам пользую HAL.
функции по приему/передачи UART реализованы слегка коряво. Но это на мой взгляд.

Работают они следующим образом - по умолчанию прерывание ЗАПРЕЩЕННО! При вызове ф-ции прерывание разрешается и пока счетчик не обнулится оно будет разрешено. И после этого опять запрется.

именно поэтому вы будите получать байты в свой массив пока не будет получено то кол-во байт которое вы указали в параметрах.
Почему мне это НЕ нравится? Дело в том что в большинстве моих задач я НЕ знаю когда мне придет запрос... А если я не вызову фци-ю приема то и не получу ничего.. Никогда..
Проверил так оно и есть. И как с этим нормально бороться? У меня похожая ситуация, работа с модемом. То есть, как скинуть счётчик. Я никогда не буду получать команды больше буфера, если я его обработаю и скину счётчик то запрета прерываний никогда не произойдёт, и заново инициализировать не будет нужно.
0
1 / 1 / 0
Регистрация: 10.09.2015
Сообщений: 171
18.10.2016, 12:23
Цитата Сообщение от fymdeler
Цитата Сообщение от kos
Прежде всего скажу следующее ,не холивара ради! просто мнение... Так как сам пользую HAL.
функции по приему/передачи UART реализованы слегка коряво. Но это на мой взгляд.

Работают они следующим образом - по умолчанию прерывание ЗАПРЕЩЕННО! При вызове ф-ции прерывание разрешается и пока счетчик не обнулится оно будет разрешено. И после этого опять запрется.

именно поэтому вы будите получать байты в свой массив пока не будет получено то кол-во байт которое вы указали в параметрах.
Почему мне это НЕ нравится? Дело в том что в большинстве моих задач я НЕ знаю когда мне придет запрос... А если я не вызову фци-ю приема то и не получу ничего.. Никогда..
Проверил так оно и есть. И как с этим нормально бороться? У меня похожая ситуация, работа с модемом. То есть, как скинуть счётчик. Я никогда не буду получать команды больше буфера, если я его обработаю и скину счётчик то запрета прерываний никогда не произойдёт, и заново инициализировать не будет нужно.
На самом деле с приемом все проще... Если используется DMA, то организуйте циклический буфер и смотрите сколько пришло и сколько считали с него данных - кольцевой буфер. В библиотеке к 1-Wire я так и делал, можете посмотреть, там у меня все строки с комментариями.
0
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 162
18.10.2016, 12:27
Цитата Сообщение от vbokom
На самом деле с приемом все проще... Если используется DMA, то организуйте циклический буфер и смотрите сколько пришло и сколько считали с него данных - кольцевой буфер. В библиотеке к 1-Wire я так и делал, можете посмотреть, там у меня все строки с комментариями.
дайте ссылочку пожалуйста.

То есть правильно понимаю, что у вас реализовано вне основного цикла программы ?
0
1 / 1 / 0
Регистрация: 10.09.2015
Сообщений: 171
18.10.2016, 12:43
Цитата Сообщение от fymdeler
Цитата Сообщение от vbokom
На самом деле с приемом все проще... Если используется DMA, то организуйте циклический буфер и смотрите сколько пришло и сколько считали с него данных - кольцевой буфер. В библиотеке к 1-Wire я так и делал, можете посмотреть, там у меня все строки с комментариями.
дайте ссылочку пожалуйста.

То есть правильно понимаю, что у вас реализовано вне основного цикла программы ?
Да, правильно понимаете, я один раз вызываю функцию приема и контроллер сам принимает данные по мере из прихода, а я в удобное для меня время их считываю. Ссылку на библиотеку я кидал в Вашем прошлом вопросе https://forum.iosyitistromyss.... 62#p465062
0
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 162
18.10.2016, 13:00
Цитата Сообщение от vbokom
Да, правильно понимаете, я один раз вызываю функцию приема и контроллер сам принимает данные по мере из прихода, а я в удобное для меня время их считываю. Ссылку на библиотеку я кидал в Вашем прошлом вопросе https://forum.iosyitistromyss.... 62#p465062
Спасибо, во многом уже сам разобрался, осталось только кольцевой буфер прикрутить.
0
0 / 0 / 0
Регистрация: 24.08.2009
Сообщений: 3
18.10.2016, 13:15
СОбственно уже на все ответили.
Можно в Callback приема UART написать свою логику приема с кольцевым буфером и всегда разрешенным прерыванием. Я б сделал так. В моих задачах DMA по приему всегда был избыточен так как в большинстве случаев пакеты были короткими и длинна их заранее не известна. Проще было складывать по байтно в кольцевой буфер в прерывании
0
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 162
18.10.2016, 14:11
Кольцевой буфер реализовал.
Собственно сейчас возник вопрос, как понять что приём завершён.

Как один из вариантов вижу таймаут. то есть если прошло слишком много времени между байтами то это новое слово.
Или есть какие либо другие механизмы ?
0
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 162
18.10.2016, 14:12
Цитата Сообщение от kos
В моих задачах DMA по приему всегда был избыточен так как в большинстве случаев пакеты были короткими и длинна их заранее не известна. Проще было складывать по байтно в кольцевой буфер в прерывании
Так и сделал. Остался вопрос как понять что конец.
0
0 / 0 / 0
Регистрация: 19.09.2017
Сообщений: 31
18.10.2016, 14:40
Цитата Сообщение от fymdeler
Цитата Сообщение от kos
В моих задачах DMA по приему всегда был избыточен так как в большинстве случаев пакеты были короткими и длинна их заранее не известна. Проще было складывать по байтно в кольцевой буфер в прерывании
Так и сделал. Остался вопрос как понять что конец.
Это уже ты сам при обработке кольцевого буфера должен знать что и когда должно прийти.... и как это обработать...
это зависит от твоего протокола обмена.
0
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 162
18.10.2016, 14:49
Цитата Сообщение от dvy
Цитата Сообщение от fymdeler
Цитата Сообщение от kos
В моих задачах DMA по приему всегда был избыточен так как в большинстве случаев пакеты были короткими и длинна их заранее не известна. Проще было складывать по байтно в кольцевой буфер в прерывании
Так и сделал. Остался вопрос как понять что конец.
Это уже ты сам при обработке кольцевого буфера должен знать что и когда должно прийти.... и как это обработать...
это зависит от твоего протокола обмена. Нее, это не интересно. :) Это анализатор содержимого и не универсальное решение. Почти получилось реализовать через таймаут. Но проблема в прерывании, окончательная обработка осуществляется только при следующем байте.

То есть передаю "hitto world" но что бы слово считалось законченным нужно передать что то ещё после него но с паузой.

Хотя если подумать, то это более правильно, анализировать получаемые данные и ждать эскейп последовательности, а там сразу в прерывании формировать готовый для дальнейшей обработки результат.
0
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 3,946
18.10.2016, 14:55
В F0 есть аппаратная поддержка modbus RTU и ASСII, прерывания по таймауту и по определенному символу.
В этой и других линейках есть прерывание по IDLE, это + DMA вот вам и решение.
Но, при использовании калокуба все обрастает некислым геморроем, все аппаратные плюшки просто херятся ...
0
0 / 0 / 0
Регистрация: 24.08.2009
Сообщений: 3
18.10.2016, 15:10
В тех протоколах что я использовал были заложены стартовые символы например и контрольная сумма. Я ловил эти символы затем принимал пакет и считал КС. Если не сходилось значит не то принял(например пакет с середины) или просто битый пакет. Можно икать кнец строки если передаются строки.
0
hosh
18.10.2016, 16:11
А в моем варианте пакеты идут со старт байтами и стоп байтами с частотой 120гц , так между двумя пачками ещё и отвечать надо ровненько... Пришлось допилить каловский обработчик добавлять в нем вызов USER_UART_Rx1Byte_Callback(huart, data); , разрешить прерывание по приему на постоянку __HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE); и теперь принимаю по байту, ловлю старт, сразу crc считаю, и по приему стоповой комбинации остается сравнить уже посчитаное crc с тем, что пришло , и если всё пучком то заряжаю таймер для своевременного ответа, ну и можно приступать к разгребанию пришедшего пакета...
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 886
18.10.2016, 16:22
В чем проблема написать свой обработчик по приему ?
Без вызова обработчика HAL хоть с кольцом, хоть как.
0
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 162
18.10.2016, 17:08
Цитата Сообщение от x893
В чем проблема написать свой обработчик по приему ?
Без вызова обработчика HAL хоть с кольцом, хоть как.
Это я уже сделал, кольцо оставил только для того что бы по окончанию буфера не приходилось инициализировать заново. Поскольку весь опрос вне основного цикла.
0
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 162
18.10.2016, 17:09
Подскажите по функциям.

HAL_UART_TxCpltCallback
HAL_UART_RxCpltCallback
и им подобным.

Что они делают ? Где и как применяются.
0
0 / 0 / 0
Регистрация: 24.08.2009
Сообщений: 3
18.10.2016, 17:22
Цитата Сообщение от fymdeler
Подскажите по функциям.

HAL_UART_TxCpltCallback
HAL_UART_RxCpltCallback
и им подобным.

Что они делают ? Где и как применяются.
Это те самые ф-ции которые Вы должны переопределить . В них вы делаете то что хотите делать. Например формируете ваш кольцевой буфер.
Вообще говоря Вам стоит разобраться как это все в HAL устроено и оптимизировать выкинув лишнее. Но надо учесть что Cube имеет свойство переписывать то что вы правили вне его операторных скобок.
0
1 / 1 / 0
Регистрация: 10.09.2015
Сообщений: 171
18.10.2016, 18:27
Цитата Сообщение от fymdeler
Подскажите по функциям.

HAL_UART_TxCpltCallback
HAL_UART_RxCpltCallback
и им подобным.

Что они делают ? Где и как применяются.
Колбэки это функции, которые вызываются из прерывания, т.е. в них можете разместить свой код, который должен выполнятся при наступлении прерывания. В HAL само прерывание не редактируют, а используют колбеки. При работе с DMA возникают прерывания только при полном и половинном заполнении буфера. Поэтому если у вас количество принимаемых данных не извесно, то использование колбеков не удобно, лучше просто смотреть количество принятых данных (там есть счетчик количества оставшихся до завершения байт, ну если принимаете побайтно). Т.е. зная размер буфера и сколько осталось до заполнения: определяем количество принятых данных. А зная сколько уже считали - число не обработанных байт (если идет побайтная работа). Для простоты, чтобы не следить за границами буфера, размер кольцевого буфер делаем кратным двойке, тогда маской легко все это нормировать относительно размера буфера, т.е. всегда просто увеличиваем счетчик считанных байт на единицу, и не заботимся о выходе за границы выделенной памяти.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.10.2016, 18:27
Помогаю со студенческими работами здесь

STM32F407 + HAL + UART
Доброго времени суток! Изучаю основы работы UART. Отладочная плата STM32F407 Discovery. Библиотека HAL. Подключаю через UART...

правильное использование HAL и UART
в структуре инициализации для UART (UART_HomdleTypeDef) есть такие поля uint8_t *pRxBuffPtr; /*!< Pointer...

HAL UART, прошу совет
Добрый вечер. Помогите новичку. Пытаюсь соединить два контроллера по uart (второй - авр). STM32f10* по прерыванию таймера раз в 1 секунду...

STM32 HAL UART прерывания
Здравствуйте. Пытаюсь осуществить контакт с устройством по UART. Логика такая: c STM32 по UART в режиме прерываний посылаю определенную...

STM32 HAL прийом даних из UART
Всем привет, хочу принять массив с UART и записать его в буфер, для дальнейшего анализа. При передаче, проблем нет, просто...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru