Программирование МК STM32. УРОК 14. HAL. USART. Прием данных
HTML-код
- Опубликовано: 2 авг 2024
- Программирование на СИ в среде Keil μVision.
Пишем код под микроконтроллер STM32F407VG на плате STM32F4DISCOVERY.
Продолжаем работать с библиотекой HAL. Продолжаем пытаться реализовать интерфейс USART (Универсальный синхронно-асинхронный приемопередатчик)
В данном занятии пишем код для приема данных от компьютера к микроконтроллеру через интерфейс USART.
Для визуализации принятых данных микроконтроллером используем дисплей LCD 20x4
Купить отладочную плату STM32F4-DISCOVERY можно здесь ali.pub/178fif
Переходник USB-TTL лучше купить такой (сейчас у меня именно такой и он мне больше нравится) ali.pub/yv3is
Дисплей LCD 20x4 можно приобрести тут ali.pub/vk7tl
Навигация по видео:
00:00 Введение
01:55 Создаём проект в CUBE
04:00 Смотрим подключенную схему.
05:20 Пишем код для реализации приёма с ПК по USART
13:45 Смотрим результаты работы (без плясок с бубном как всегда не обошлось)
Рекомендуется также перед просмотром данного урока просмотреть данное видео:
УРОК 1. Установка Keil μVision • Программирование МК ST...
УРОК 4. Библиотека HAL. STM32 CUBE MX. Светодиоды и кнопка • Программирование МК ST...
УРОК 6. Библиотека HAL. LCD 20x4. 4-битный режим • Программирование МК ST...
УРОК 7. HAL. LCD 20x4. 4-битный режим. Выводим информацию • Программирование МК ST...
УРОК 13. HAL. USART. Передача данных • Программирование МК ST...
Текстовая версия и исходный код урока здесь narodstream.ru/stm-urok-14-hal...
Группа в контакте club116656325
Группа в Одноклассниках ok.ru/group/52987126153436
Группа в Facebook / 236905359999556
Мой сайт "Программирование МК" narodstream.ru
Форум narodstream.ru/forum
Вы можете помочь проекту:
ЮMoney
yoomoney.ru/to/41001176473465
Webmoney
Z341906933112
Карта Сбербанка (МИР)
2202201799288929
Можно в USDT
1) Сеть:TRC20
Адрес: TBBPFk5Widf1CYvF7Xk5ssKXeiPJHwtMgS
2) Сеть: BSC BNB Smart Chain (BEP20) (комиссия намного меньше)
Адрес: 0x2e38754DF1e54649Bf0D5CD6fD6D8c96a9f22f17
3) Сеть: Huobi ECO Chain (HECO) (комиссия еще меньше)
Адрес: 0x2e38754DF1e54649Bf0D5CD6fD6D8c96a9f22f17 Наука
Огромное спасибо , за данные уроки . Пересел с Pic на stm32 .
Спасибо Вам)
Однозначно Лайк!
+Paradise for SPIDERS
Спасибо большое, Богдан! Ты настоящий ценитель искусства кодинга микрочипов)
Решено
функции легче искать : в окне слева - дерево проекта, есть вкладка функции, а там список их соответственно по файлам и алфавитном порядке )
Спасибо за подсказку. Я давно в курсе этого дерева, но извините, так привык.
Шпариш уроки как пирожки! Лайк за труды!!!
Когда человек увлечен своим делом, он может шпарить хоть каждый день по три видоса.
Ну да, можно, только если бы кто-нибудь потом всё это монтировал, писал метаданные, а ещё когда-то надо и осваивать новый материал, причем очень профессионально осваивать, чтобы не выложить в паблик сырец, что недопустимо. Когда всё в одном лице, тяжеловато. Дохода от этого практически почти нет, поэтому нанять кого-то ещё для ускорения процесса не представляется возможным. Поэтому пока так как есть. Максимум по 3 видео в неделю.
Я не помню спрашивал Вас или нет - работаете ли Вы удаленно? Если да, можете сбросить мне описания Ваших последних работ в 1-2 предложениях и Ваши условия. Лучше в личку mail@msdesign.ru
msdesign.ru Я работаю администратором приложений 1С-Предприятие и не удалённо, а на стационарном рабочем месте.
Я имел ввиду делаете ли Вы проекты на микроконтроллерах удаленно, основное место работы меня совершенно не интересует, мне бывает нужны разработчики на срочные работы с высоким качеством, соответственно поэтому был вопрос - есть ли у Вас желание и опыт удаленной работы.
Добрый день! Большое спасибо за урок, но у меня возник вопрос, на который я так и не нашел ответа. Как всё-таки передавать произвольное число символов?
Владимир, расскажите пожалуйста как преобразовать строку в int. С компьютера идут чары, а я хочу потом управлять программой в зависимости от принятого числа (управление скважностью ШИМа). Чисел много, табличный способ будет очень громоздким.
Очень понравились ваши уроки , продолжайте в том же духе !!! Было бы круто посмотреть про CAN модуль , не планируете на этот модуль урок ?
Спасибо!
Пока нет, к сожалению. Уже слишком много готовых непоказаных проектов набралось, во-первых, во-вторых, нет пока устройств, которые можно подключить по данной шине, в наличии. Как появятся, буду разбираться
В общем так как и думал , принимать по ДМА разного размера данные размер которых не знаешь - неудобно да и будет выглядеть как глюк программы.
Но вот передавать по ДМА удобно . Настроил в кубе ДМА например для тх первого юарта , сгенерил проект , прописал пару строчек :
void RS485U1(char *str) // PWM interface , speed 115200
{
int x=0;
str+=0;
while(str[x])
{
x++;
}
if(hdma_usart1_tx.State==HAL_DMA_STATE_BUSY)HAL_Delay(100
if(hdma_usart1_tx.State==HAL_DMA_STATE_READY)
{
if(x) HAL_UART_Transmit_DMA(&huart1,(uint8_t*)str, x);
hdma_usart1_tx.State=HAL_DMA_STATE_BUSY;
}
}
Вызываю эту функцию когда надо что то передать , работает быстро и красиво , но если данные быстро передавать , вот такая АТ команда вызывает отправку 48 байт:
if(string_cmp("STR OK!
", rx_buffer0))
{
sprintf(tx_buffer0 , "STR%sEND
" , PWM_buff);
RS485U1(tx_buffer0);
timer=0;
clear_RS485_1();
}
то на 5 - 6 ю отправку дма подвисает секунд на 20... как решить эту проблему можно кто в курсе?
Если нам не известно сколько байтов будет вы можете сделать урок по прерыванию чтобы он перестал когда получить перевод строки /r/n просто тут заказываешь 8 байт и если 8 байт не принимаешь заходить в цикл error
добрый день! столкнулся с проблемой принять по uart посылки разной длины - 2 и 6 байт. использую HAL_UART_Receive_IT(&huart1, dataUARTResive, SendByte); если SendByte=2, то в посылке по 6 теряются последние 4, если SendByte=6, то надо 3 раза посылать. оба варианте не проходные. всю голову сломал. может кто знает как правильно сделать?
Как восстановить связь при обрыве линии, а потом при ее соединении ??
С длиной сообщения не удобно вообще. Есть выход? Если неизвестна длина?
Из за этого тоже приходится писать свой код в обработчике прерываний.
Я часто пишу АТ команды для интерфейса юарт и нужно принимать разной длины сообщения по юарту...
Dma режим. Ловите по первому принятому байту. Hal unlock. Dma ready. Stop Dma. Clear cntr. Start Dma.
Столкнулся с такой ситуацией, что максимальная длинна буфера для принимаемых данных может быть 976 байт. при 977 не запускается . Как его можно увеличить. stm32f103c8t6
Зачем писать прерывание в бесконечном цикле? Оно на то и прерывание, что может быть записано в сторонке. Нужно писать код в обработчике прерываний.
А где найти обработчик прерывание при приеме данных? Что бы можно было сделать кольцевой буфер! И если у нас не известно количество байт которые должны прийти, то надо поставить 1 третьим параметром?
Callback поставить
есть в документации по HAL
Спасибо большое, все заработало!
Подскажите пожалуйста, а функция HAL_UART_Receive_IT может принимать только символы или любое число? Если я хочу принять просто 8-битное число, мне надо написать вот так?:
uint8_t A = 0;
HAL_UART_Receive_IT(&huart3, &A, 8);
Данная функция принимает буфер. А данные могут там быть любые.
Добрый день, уважаемый. Я понимаю, что мой вопрос будет глупым, но как передать по уарту переменную, которая объявлена как 32-х разрядная. Не ужели искусственно перекидывать в массив??
А как по ДМА или по прерыванию (при помощи HAL функции) складывать сообщения в буфер разной длины ? Вот к примеру надо принимать ат команды и их обрабатывать.
Парсить поток.
Посмотрите уроки по модулю HC-05, думаю, поймёте.
narod stream , дайте ссылочку пожалуйста :)
Урок 97. Подключаем bluetooth-модуль HC-05 ruclips.net/video/S4P-lAa4iFQ/видео.html
Урок 99. HC-05. Master. Соединяем два МК. Часть 1 ruclips.net/video/-59JSYhd9cE/видео.html
Урок 99. HC-05. Master. Соединяем два МК. Часть 2 ruclips.net/video/xmqYVYwpgTY/видео.html
narod stream , в уроках рассказывается именно как по дма парсить входной поток? А то посмотрю только завтра видос..
Нет, не DMA, но принцип, думаю будет понятен.
Доброе утро! Я подключил usart к rs232 на ноутбуке и передаю показания на stm. Включил watchdog. Когда я отключаю ноут, watchdog начинает постоянно ресетить stm. Видимо пока на функцию обработки usart не придут данные, stm не пропускает эту функцию дальше и watchdog переполняется. Вы не знаете, есть ли функция проверки подключения usart, что провода не висят в воздухе а именно подключены? А то можно задеть ногой кабель, и stm вместо того чтобы просто замолчать начнет постоянно перезагружаться.
Сделать бы условие: если usart не подключен, то выходим из функции, а если подключен то выполняем функцию.
Не слышал даже об этом. У меня много где отправка на USART прописана, а терминальную программу я не включаю.
Хотя я переходник при этом не отключаю, он у меня в ST-Link обычно встроен.
Подаю из терминала HEX-цифры, но прерывание отрабатывается только один раз. Т.е. подаю из терминала единичку - светодиод зажигается. Подаю нолик - но светодиод не гаснет.
Но если перезагрузить мк, то нолик принимается и обрабатывается в прерывании нормально, а вот единичка следом уже нет. Интересно, почему так?
PS. Лампочки на адаптере usb-rs232 моргают, значит данные с компьютера идут нормально.
Разобрался, скорость побольше поставил.
Решено
void Gsm_RxCallBack(void)
{
RxBuff[RxIndex] = usartBuff;
if (strstr(RxBuff, "
") != 0)
Gsm_RxClear();
if(RxIndex < _GSM_RX_SIZE)
RxIndex++;
else
Gsm_RxClear();
HAL_UART_Receive_IT(&huart1,&usartBuff,1);
}
Если размер буфера str[] 8 байт, а инициализируете Вы его массивом из одного байта ({0}), то проинициализируется только первый элемент буфера. Вы можете в этом убедится поставив 1 вместо 0 ({1}).
А как поправить? Написать вот так что ли? {0,0,0,0,0,0,0,0};
Или написать просто 0 без фигурных скобок ?
А почему только 8?
Вопрос не понял. Формируйте, пожалуйста, комментарии поподробнее. Они же не для меня, здесь читают и смотрят многие.
Это не принципиально, если нужно можно и больше передавать, главное чтобы размер буфера не был меньше чем передаваемон количество байт. Тут просто пример такой передаем ровно 8 символов
Ну слушайте, человек в кепке, то есть автор, ваши уроки конечно очень познавательны, но есть ли среди исходников хоть один проект, где бы вот так открыть в кейле и скомпилить? Ну пока что не встречал! То константа не от того проца, то драйверов нету. Это у вас защита от дурака такая или же причина в чем то другом?