Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры 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. Просмотров 12441. Ответов 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
TotSomyyMyhotysh
0 / 0 / 0
Регистрация: 16.06.2016
Сообщений: 37
19.10.2016, 11:42 41
Цитата Сообщение от fymdeler
При написании своего колбека он тоже должен быть void (void) как IRQHadler ?
Колбэк описан, но не написан. Те его можно посмотреть в заголовочных файлах библиотеки, в нашем случае он объявлен как
Код
void HAL_UART_TxCpltCallback(UART_HomdleTypeDef *huart);
те мы имеем возможность внутри функции взаимодействовать с обработчиком переферии, которое собственно, прерывание и вызвало. Например добавить символ переноса строки после каждой передачи, отправить статусные коды.

Цитата Сообщение от fymdeler
Просмотрел обработчик, в нём нашёл только вызов HAL_UART_ErrorCallback других не нашёл.
А вы точно понимаете то, куда смотрите? Подучите язык программирования на котором пишите, с такими проблемами вы далеко не уедете.

0
vbokom
1 / 1 / 0
Регистрация: 10.09.2015
Сообщений: 171
19.10.2016, 11:51 42
Цитата Сообщение от fymdeler
Нашёл они ещё глубже закопаны.
Ну, вот и замечательно. Теперь наверное более понятно, что такое колбеки :)
0
fymditir
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 162
19.10.2016, 11:52 43
В целом думаю разобрался. Буду пробовать.

То есть я в любом удобном месте вместо
__wiok void HAL_UART_RxHalfCpltCallback(UART_HomdleTypeDef *huart) объявляю функцию void HAL_UART_RxHalfCpltCallback(UART_HomdleTypeDef *huart) и пишу в ней свой обработчик.

Сама же функция колбека вызовется в обработчике внутри этой функции HAL_UART_IRQHomdler(*huart);

Сразу вопрос, этот обработчик будет единым для всех UART ?

то есть функция HAL_UART_RxHalfCpltCallback будет вызываться в случае данного события для любого активного порта USORT.
0
fymditir
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 162
19.10.2016, 11:55 44
Цитата Сообщение от TotSamiyMihotych
А вы точно понимаете то, куда смотрите? Подучите язык программирования на котором пишите, с такими проблемами вы далеко не уедете.
А чем я тут по вашему занимаюсь ?! Как раз изучаю особенности языка и исполнительных механизмов применительно к конкретному типу контроллеров.
0
TotSomyyMyhotysh
0 / 0 / 0
Регистрация: 16.06.2016
Сообщений: 37
19.10.2016, 12:18 45
Цитата Сообщение от fymdeler
объявляю функцию void HAL_UART_RxHalfCpltCallback(UART_HomdleTypeDef *huart) и пишу в ней свой обработчик.
Скорее описываете, тк за вас ее объявил HAL.
Цитата Сообщение от fymdeler
Сама же функция колбека вызовется в обработчике внутри этой функции HAL_UART_IRQHomdler(*huart);
Чуть глубже, но суть мы все тут поняли.

Цитата Сообщение от fymdeler
Сразу вопрос, этот обработчик будет единым для всех UART ?
то есть функция HAL_UART_RxHalfCpltCallback будет вызываться в случае данного события для любого активного порта USORT.
Да, именно для этого в колбэк и передается обработчик того порта, который его вызвал - нам дают возможность сделать разную логику работы для каждого из портов.
0
fymditir
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 162
19.10.2016, 12:21 46
Цитата Сообщение от TotSamiyMihotych
Да, именно для этого в колбэк и передается обработчик того порта, который его вызвал - нам дают возможность сделать разную логику работы для каждого из портов.
То есть проверяю что за порт передан в функцию и в зависимости от этого выбираю какой мой обработчик её обработает.
0
vbokom
1 / 1 / 0
Регистрация: 10.09.2015
Сообщений: 171
19.10.2016, 12:29 47
Цитата Сообщение от fymdeler
Цитата Сообщение от TotSamiyMihotych
Да, именно для этого в колбэк и передается обработчик того порта, который его вызвал - нам дают возможность сделать разную логику работы для каждого из портов.
То есть проверяю что за порт передан в функцию и в зависимости от этого выбираю какой мой обработчик её обработает.
Совершенно верно. Только не какой обработчик, а как он его обрабатывает. В принципе и какой, выставляете флаг - а в основной программе аыбираете обработчик
0
fymditir
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 162
19.10.2016, 12:36 48
Цитата Сообщение от vbokom
Совершенно верно. Только не какой обработчик, а как он его обрабатывает. В принципе и какой, выставляете флаг - а в основной программе аыбираете обработчик
Ну это я так назвал, смысл понятен.

У меня вся обработка будет в прерываниях, хотя это считается не айс. Но мне пока так удобнее.

Всем большое спасибо, разобрался. Правда сделал всё немного по другому :)

P.S. Хотя если подумать, всю обработку надо выносить в основной цикл оставив в прерываниях только флаги.
0
19.10.2016, 12:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.10.2016, 12:36

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

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

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


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

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

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