Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.75/60: Рейтинг темы: голосов - 60, средняя оценка - 4.75
fymditir
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 162
1

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

18.10.2016, 11:19. Просмотров 12465. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.10.2016, 11:19
Ответы с готовыми решениями:

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

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

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

правильное использование HAL и UART
в структуре инициализации для UART (UART_HomdleTypeDef) есть такие поля uint8_t ...

stm32 HAL UART - не могу понять
Здравствуйте, в STM32 я начинающий, приходится просить помощи. Суть вот в чём. Надо принимать из...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Что они делают ? Где и как применяются.
Колбэки это функции, которые вызываются из прерывания, т.е. в них можете разместить свой код, который должен выполнятся при наступлении прерывания. В HAL само прерывание не редактируют, а используют колбеки. При работе с DMA возникают прерывания только при полном и половинном заполнении буфера. Поэтому если у вас количество принимаемых данных не извесно, то использование колбеков не удобно, лучше просто смотреть количество принятых данных (там есть счетчик количества оставшихся до завершения байт, ну если принимаете побайтно). Т.е. зная размер буфера и сколько осталось до заполнения: определяем количество принятых данных. А зная сколько уже считали - число не обработанных байт (если идет побайтная работа). Для простоты, чтобы не следить за границами буфера, размер кольцевого буфер делаем кратным двойке, тогда маской легко все это нормировать относительно размера буфера, т.е. всегда просто увеличиваем счетчик считанных байт на единицу, и не заботимся о выходе за границы выделенной памяти.
0
18.10.2016, 18:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.10.2016, 18:27

Тонкости UART+DMA+HAL... Кто-нибуть разбирался подробно?
Собственно все работает почти нормально.. Удивляет логика работы. Вот и хочется понять это я...

LTDC HAL, вопросы по использованию
Подключаю дисплей, выбор хала обусловлен тем, что мне скоро переходить на F7 и надо бы привыкать,...

О работе с мануалом HAL
Здравствуйте! Изучаю STM32F4Dyscovery c HAL, но иногда имею сложности с документацией на функции....


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru