Программирование МК 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
  • НаукаНаука

Комментарии • 52

  • @Kruzakov
    @Kruzakov 4 года назад

    Огромное спасибо , за данные уроки . Пересел с Pic на stm32 .

  • @timelord1137
    @timelord1137 4 года назад

    Спасибо Вам)

  • @stksfd
    @stksfd 8 лет назад

    Однозначно Лайк!

    • @narodstream552
      @narodstream552  8 лет назад

      +Paradise for SPIDERS
      Спасибо большое, Богдан! Ты настоящий ценитель искусства кодинга микрочипов)

  • @orazaliseytpenbetov1552
    @orazaliseytpenbetov1552 3 года назад

    Решено

  • @veklynets
    @veklynets 8 лет назад +2

    функции легче искать : в окне слева - дерево проекта, есть вкладка функции, а там список их соответственно по файлам и алфавитном порядке )

    • @narodstream552
      @narodstream552  8 лет назад

      Спасибо за подсказку. Я давно в курсе этого дерева, но извините, так привык.

  • @DrargonsM
    @DrargonsM 8 лет назад +2

    Шпариш уроки как пирожки! Лайк за труды!!!

    • @msdesignru
      @msdesignru 8 лет назад

      Когда человек увлечен своим делом, он может шпарить хоть каждый день по три видоса.

    • @narodstream552
      @narodstream552  8 лет назад

      Ну да, можно, только если бы кто-нибудь потом всё это монтировал, писал метаданные, а ещё когда-то надо и осваивать новый материал, причем очень профессионально осваивать, чтобы не выложить в паблик сырец, что недопустимо. Когда всё в одном лице, тяжеловато. Дохода от этого практически почти нет, поэтому нанять кого-то ещё для ускорения процесса не представляется возможным. Поэтому пока так как есть. Максимум по 3 видео в неделю.

    • @msdesignru
      @msdesignru 8 лет назад

      Я не помню спрашивал Вас или нет - работаете ли Вы удаленно? Если да, можете сбросить мне описания Ваших последних работ в 1-2 предложениях и Ваши условия. Лучше в личку mail@msdesign.ru

    • @narodstream552
      @narodstream552  8 лет назад

      msdesign.ru Я работаю администратором приложений 1С-Предприятие и не удалённо, а на стационарном рабочем месте.

    • @msdesignru
      @msdesignru 8 лет назад

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

  • @user-fo1uf9li3d
    @user-fo1uf9li3d 6 лет назад +1

    Добрый день! Большое спасибо за урок, но у меня возник вопрос, на который я так и не нашел ответа. Как всё-таки передавать произвольное число символов?

  • @user-yo6no3jk9l
    @user-yo6no3jk9l 5 лет назад +2

    Владимир, расскажите пожалуйста как преобразовать строку в int. С компьютера идут чары, а я хочу потом управлять программой в зависимости от принятого числа (управление скважностью ШИМа). Чисел много, табличный способ будет очень громоздким.

  • @denysnikolaevich511
    @denysnikolaevich511 8 лет назад

    Очень понравились ваши уроки , продолжайте в том же духе !!! Было бы круто посмотреть про CAN модуль , не планируете на этот модуль урок ?

    • @narodstream552
      @narodstream552  8 лет назад

      Спасибо!
      Пока нет, к сожалению. Уже слишком много готовых непоказаных проектов набралось, во-первых, во-вторых, нет пока устройств, которые можно подключить по данной шине, в наличии. Как появятся, буду разбираться

  • @user-cp123pc5tk8d
    @user-cp123pc5tk8d 6 лет назад

    В общем так как и думал , принимать по ДМА разного размера данные размер которых не знаешь - неудобно да и будет выглядеть как глюк программы.
    Но вот передавать по ДМА удобно . Настроил в кубе ДМА например для тх первого юарта , сгенерил проект , прописал пару строчек :
    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... как решить эту проблему можно кто в курсе?

  • @user-gg7hz6ch8f
    @user-gg7hz6ch8f 7 лет назад

    Если нам не известно сколько байтов будет вы можете сделать урок по прерыванию чтобы он перестал когда получить перевод строки /r/n просто тут заказываешь 8 байт и если 8 байт не принимаешь заходить в цикл error

  • @cool_aip1604
    @cool_aip1604 7 лет назад +1

    добрый день! столкнулся с проблемой принять по uart посылки разной длины - 2 и 6 байт. использую HAL_UART_Receive_IT(&huart1, dataUARTResive, SendByte); если SendByte=2, то в посылке по 6 теряются последние 4, если SendByte=6, то надо 3 раза посылать. оба варианте не проходные. всю голову сломал. может кто знает как правильно сделать?

  • @user-fd7fj4ii8g
    @user-fd7fj4ii8g 3 года назад

    Как восстановить связь при обрыве линии, а потом при ее соединении ??

  • @user-io7vy6pg7k
    @user-io7vy6pg7k 6 лет назад +7

    С длиной сообщения не удобно вообще. Есть выход? Если неизвестна длина?

    • @user-cp123pc5tk8d
      @user-cp123pc5tk8d 6 лет назад +1

      Из за этого тоже приходится писать свой код в обработчике прерываний.
      Я часто пишу АТ команды для интерфейса юарт и нужно принимать разной длины сообщения по юарту...

    • @user-pc9br8yt6j
      @user-pc9br8yt6j 4 года назад

      Dma режим. Ловите по первому принятому байту. Hal unlock. Dma ready. Stop Dma. Clear cntr. Start Dma.

  • @oneone5777
    @oneone5777 6 лет назад

    Столкнулся с такой ситуацией, что максимальная длинна буфера для принимаемых данных может быть 976 байт. при 977 не запускается . Как его можно увеличить. stm32f103c8t6

  • @MordoVIA1958
    @MordoVIA1958 5 лет назад +1

    Зачем писать прерывание в бесконечном цикле? Оно на то и прерывание, что может быть записано в сторонке. Нужно писать код в обработчике прерываний.

  • @obuhovmi
    @obuhovmi 8 лет назад

    А где найти обработчик прерывание при приеме данных? Что бы можно было сделать кольцевой буфер! И если у нас не известно количество байт которые должны прийти, то надо поставить 1 третьим параметром?

    • @narodstream552
      @narodstream552  8 лет назад

      Callback поставить
      есть в документации по HAL

  • @feodor17sumkin
    @feodor17sumkin 5 лет назад

    Спасибо большое, все заработало!
    Подскажите пожалуйста, а функция HAL_UART_Receive_IT может принимать только символы или любое число? Если я хочу принять просто 8-битное число, мне надо написать вот так?:
    uint8_t A = 0;
    HAL_UART_Receive_IT(&huart3, &A, 8);

    • @narodstream552
      @narodstream552  5 лет назад

      Данная функция принимает буфер. А данные могут там быть любые.

  • @user-nl8oq5ol6p
    @user-nl8oq5ol6p 2 года назад

    Добрый день, уважаемый. Я понимаю, что мой вопрос будет глупым, но как передать по уарту переменную, которая объявлена как 32-х разрядная. Не ужели искусственно перекидывать в массив??

  • @user-cp123pc5tk8d
    @user-cp123pc5tk8d 6 лет назад

    А как по ДМА или по прерыванию (при помощи HAL функции) складывать сообщения в буфер разной длины ? Вот к примеру надо принимать ат команды и их обрабатывать.

    • @narodstream552
      @narodstream552  6 лет назад +1

      Парсить поток.
      Посмотрите уроки по модулю HC-05, думаю, поймёте.

    • @user-cp123pc5tk8d
      @user-cp123pc5tk8d 6 лет назад

      narod stream , дайте ссылочку пожалуйста :)

    • @narodstream552
      @narodstream552  6 лет назад +1

      Урок 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

    • @user-cp123pc5tk8d
      @user-cp123pc5tk8d 6 лет назад

      narod stream , в уроках рассказывается именно как по дма парсить входной поток? А то посмотрю только завтра видос..

    • @narodstream552
      @narodstream552  6 лет назад +1

      Нет, не DMA, но принцип, думаю будет понятен.

  • @user-dv6tz1ui8k
    @user-dv6tz1ui8k 5 лет назад

    Доброе утро! Я подключил usart к rs232 на ноутбуке и передаю показания на stm. Включил watchdog. Когда я отключаю ноут, watchdog начинает постоянно ресетить stm. Видимо пока на функцию обработки usart не придут данные, stm не пропускает эту функцию дальше и watchdog переполняется. Вы не знаете, есть ли функция проверки подключения usart, что провода не висят в воздухе а именно подключены? А то можно задеть ногой кабель, и stm вместо того чтобы просто замолчать начнет постоянно перезагружаться.
    Сделать бы условие: если usart не подключен, то выходим из функции, а если подключен то выполняем функцию.

    • @narodstream552
      @narodstream552  5 лет назад

      Не слышал даже об этом. У меня много где отправка на USART прописана, а терминальную программу я не включаю.
      Хотя я переходник при этом не отключаю, он у меня в ST-Link обычно встроен.

  • @feodor17sumkin
    @feodor17sumkin 5 лет назад

    Подаю из терминала HEX-цифры, но прерывание отрабатывается только один раз. Т.е. подаю из терминала единичку - светодиод зажигается. Подаю нолик - но светодиод не гаснет.
    Но если перезагрузить мк, то нолик принимается и обрабатывается в прерывании нормально, а вот единичка следом уже нет. Интересно, почему так?
    PS. Лампочки на адаптере usb-rs232 моргают, значит данные с компьютера идут нормально.

    • @feodor17sumkin
      @feodor17sumkin 5 лет назад

      Разобрался, скорость побольше поставил.

  • @orazaliseytpenbetov1552
    @orazaliseytpenbetov1552 3 года назад

    Решено
    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);
    }

  • @SolderingIronMen
    @SolderingIronMen 7 лет назад

    Если размер буфера str[] 8 байт, а инициализируете Вы его массивом из одного байта ({0}), то проинициализируется только первый элемент буфера. Вы можете в этом убедится поставив 1 вместо 0 ({1}).

    • @feodor17sumkin
      @feodor17sumkin 5 лет назад

      А как поправить? Написать вот так что ли? {0,0,0,0,0,0,0,0};
      Или написать просто 0 без фигурных скобок ?

  • @andreyparovozz
    @andreyparovozz 6 лет назад

    А почему только 8?

    • @narodstream552
      @narodstream552  6 лет назад

      Вопрос не понял. Формируйте, пожалуйста, комментарии поподробнее. Они же не для меня, здесь читают и смотрят многие.

    • @sandrok14
      @sandrok14 4 года назад

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

  • @andrikjustme2871
    @andrikjustme2871 4 года назад

    Ну слушайте, человек в кепке, то есть автор, ваши уроки конечно очень познавательны, но есть ли среди исходников хоть один проект, где бы вот так открыть в кейле и скомпилить? Ну пока что не встречал! То константа не от того проца, то драйверов нету. Это у вас защита от дурака такая или же причина в чем то другом?