Программирование МК STM32. УРОК 13. HAL. USART. Передача данных

Поделиться
HTML-код
  • Опубликовано: 1 авг 2024
  • Программирование на СИ в среде Keil μVision.
    Пишем код под микроконтроллер STM32F407VG на плате STM32F4DISCOVERY.
    Продолжаем работать с библиотекой HAL. Пробуем реализовать интерфейс USART (Универсальный синхронно-асинхронный приемо-передатчик)
    В данном занятии пишем код для передачи данных от микроконтроллера к компьютеру через интерфейс USART.
    Купить отладочную плату STM32F4-DISCOVERY можно здесь ali.pub/178fif
    Переходник USB-TTL лучше купить такой (сейчас у меня именно такой и он мне больше нравится) ali.pub/yv3is
    Навигация по видео:
    00:00 Введение
    00:22 Краткий обзор интерфейса USART и переходников USART-USB
    07:17 Создаём проект и пишем код для реализации интерфейса USART на передачу данных
    15:13 Смотрим результаты нашего труда
    Рекомендуется также перед просмотром данного урока просмотреть данное видео:
    УРОК 1. Установка Keil μVision • Программирование МК ST...
    УРОК 4. Библиотека HAL. STM32 CUBE MX. Светодиоды и кнопка • Программирование МК ST...
    Текстовая версия и исходный код здесь narodstream.ru/stm-urok-13-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
  • НаукаНаука

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

  • @user-yv5ot9qq1j
    @user-yv5ot9qq1j 7 лет назад +12

    Ура! Я отправил первое слово по UARTу. Это как в первый раз сказать МАМА!!! Спасибо!!!

    • @alexandrponomarenko4127
      @alexandrponomarenko4127 3 года назад +1

      Надеюсь, что не великое Русское слово отправил?))))

  • @BR549DBH
    @BR549DBH 7 лет назад +11

    Great video, Thanks for making this video. I used the CC and translated what you are saying to English and there were a few times the translated closed captions made me laugh. One part it talked about eating it. I will be watching more of your videos. Greetings for Tulsa Oklahoma. USA.

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

      I am very happy that you liked my lessons!

  • @user-vc1tm6hm9w
    @user-vc1tm6hm9w 7 лет назад +9

    Всё заработало на STM32F103C8T6. Спасибо.

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

    Вы крутой) очень здорово, огромное спасибо)

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

    С нетерпением жду новых уроков! лайк"

  • @street_chronicles
    @street_chronicles 8 лет назад +1

    Отличные видео! Так держать! Побольше подписчиков и новых видео!

  • @pashka-cherepashka
    @pashka-cherepashka 7 лет назад +1

    Огромное спасибо за урок!!

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

      И Вам спасибо за оценку!

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

    Спасибо. Педагогический навыки есть. Приятный голос. Не раздражает. И не чавкаете )). Многие чавкает , очень не приятно и противно слушать.

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

      Спасибо!
      Буду стараться. Это одно из давних видео, посмотрите последние, а вдруг я уже исправился.

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

    Спасибо)

  • @dmitriyfilatov8658
    @dmitriyfilatov8658 4 года назад +2

    Вместо ручного подсчета символов можно записать (sizeof str / sizeof str[0])

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

    Замечательные видео. Хотелось бы урок про CAN увидеть

    • @narodstream552
      @narodstream552  7 лет назад +2

      Ну да. Мне тоже хотелось. Но нигде не нашел. Опять всё придется делать самому.

  • @user-br6gp7hc4l
    @user-br6gp7hc4l 4 месяца назад

    Спасибо

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

    Здравствуйте! на 14:23 вы упомнянули про примеры от HAL, скажите, пожалуйста,где их можно найти? ссылку если можно

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

    Спасибо за уроки!
    При попытках повторить проект на STM32F429 программа CubeMX к USART присваивает пины RX PA3, а TX к PA2. В результате почему то информация не передавалась. Помогло присвоение других пинов контроллера RX PD6, а TX PD5. Может у кого то есть мнения почему так могло получится?

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

    Владимир, а можно еще узнать. А частоту под USART выставлять нужно? У меня на него идет 54 Мгц, многовато наверное, мне больше 9600 мб/с не нужно. Или он автоматически возьмет ту частоту, которая ему нужна, если в настройках написать 9600?

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

    В случае если примерно каждое пятое сообщение проскакивает в духе "USART Tran®+‹5USA*ўЙ…№smit" грешить надо на погрешность внешнего кварца?
    P.S. Сообщение в кавычках не редактировал, такое выдал терминал))

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

    Кстати еще. Вероятно, есть готовая библиотека по MODBUS. Было бы очень полезно узнать.

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

      Есть такая библиотека, причем бесплатная, но мне не понравилась.

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

    Чуть не по теме. Кто то пробовал использовать встроенный в STM32 вычислитель CRC для вычисления 16 битной суммы? Есть примеры? А то кругом только CRC32.

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

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

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

    Доброе время суток. Мучаюсь с уарт уже некоторое время. опыта немного. Мне надо принимать и отправлять байты. Сделано все халом. стандартные функции приема и передачи по прерыванию. созданы буфера на прием и передачу. Общение между 2мя stm32f030k6 линии связи развязаны оптикой 817. Скорость от 600 до 9600. Работает. Если запускать одновременно.Но, стоит поиграться во время работы с питанием одного мк, или передергивать одну из линий связи, один из процов уходит в хард фаулт. а мне бы не хотелось чтоб проц прерывал работу в случае сбоя. Причем один и тот же код работы уарта ведет себя по разному при добавлении его в разные проекты. Как можно исправить. И возможно ли пообщатсья с вами чтоб решить этот вопрос?

  • @user-bl3yb6wx1z
    @user-bl3yb6wx1z Год назад

    Подскажите,
    а как работать с RS485 ?

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

    Ждем урок по передаче и приеме uart-rs485 по Modbus RTU (slave-master).

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

      По Modbus уроки как правило бывают в специализированных ВУЗах, там для этого есть оборудование, у меня такого нет. Передачей с контроллера на контроллер по 485-му интерфейсу я занимался, также через переходник с ПК с установкой на последнем виртуальных промышленных устройств - тоже. Это всё не то. Только наличие реального промышленного устройства обуславливает качественные уроки.

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

    Можно еще детский вопрос )) Переходникам нужны драйверы, или они просто втыкаются в свободный USB и тут же появляется виртуальный com порт.

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

      Деколи треба, а деколи і ні. В Менеджері пристроїв зразу буде видно ваш пристрій. Якщо буде написано що невідомий пристрій то треба вигуглити драйвер

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

    Владимир, можно узнать про переходники на 3:41
    Я вот что опасаюсь. У STM входы 3-вольтовые, а эти платы питаются от USB, и скорей всего они 5 вольтовые. Они не сжигают порты?
    Я конечно слышал, что порты у STM толерантны к 5 вольтам, но может для подстраховки поставить какой-нибудь согласователь уровней? Померьте напряжение на выходах этих модулей. Заранее спасибо!

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

      У меня пока ничего не сгорело. И согласователей никаких не ставил. Последнее время пользуюсь красными FTDI.

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

      Ну может микроконтроллер работает на грани и на последнем издыхании? Пока новый - может и тянет кое-как, а состарится и откажет в самый ответственный момент.

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

    Здравствуйте , подскажите , а как передавать если размер буфера не известен(не больше 64 байт) и в конце необходимо добавить

    . Если можно с примером

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

      Здравствуйте!
      sprintf(str,"Бла_бла_бла
      ");
      HAL_UART_Transmit(&huart2, str, strlen(str), 0xFFFF);

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

      Не совсем то .Я считываю данные с USB ( VCP)
      ================================
      static int8_t CDC_Receive_FS (uint8_t* Buf, uint32_t *Len)
      memcpy (user_data, Buf, *Len);
      USBD_CDC_ReceivePacket(&hUsbDeviceFS);
      return (USBD_OK);
      ================================
      Принял теперь передать нужно в юарт
      HAL_UART_Transmit_IT (&huart3, user_data,8);
      ================================
      Передаются но !!! допустим первый раз получили 8 бит отправили пришло все правильно второй раз отправили 4 байта принимаем первых 4 то что отправили , а остальные те что с прошлого раза остались . пробую очистить буфер *user_data = '\0'; но не помогает

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

      Можно почту вашу ? или мне напишите motor2036"собака"ya.ru

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

      Denys Nikolaevich То же самое

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

      sprintf(str_tx,"USB Transmit
      ");
      CDC_Transmit_FS((uint8_t*)str_tx, strlen(str_tx));

  • @user-ge3oi5kp7f
    @user-ge3oi5kp7f 4 года назад +1

    Usart1 только у меня не работает ?
    И почему вы используете usart2 ???

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

      На STM32F4 Discovery (STM32F407VGT) у меня тоже не работал первый USART, вместо слов передавал . А второй работает как надо

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

    Здравствуйте! Скажите, пожалуйста, как передавать число? Например если я хочу передать счетчик таймера

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

      Здравствуйте! Я так думаю, что Вы хотите передать какое-то число именно через шину USART. Как вариант уложить его в буфер побайтно передать. Такая практика широко используется в моих уроках по датчикам MEMS, когда мы передаем 16-битные показания в шину USART и USB. Так что советую посмотреть и, я думаю, всё станет предельно понятно.

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

      Да, все верно, хочу передать число по USART.
      Искал MEMS в ваших уроках, такого слова в названиях не нашел.
      Скажите, пожалуйста, как называется урок? обязательно посмотрю

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

      MEMS - это микроэлектронные механические системы. Технология так сказать. По этой технологии выполнены все датчики, которые мы рассматриваем, начиная с самого первого акселерометра.

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

      HAL_UART_Transmit (&huart1,&count,1,0xFFFF); count переменная.

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

    Hi! You used to work module GPS traker with STM32 // I'm try to connect with it
    You can help me :)

  • @AAAAAA-lt9mi
    @AAAAAA-lt9mi 5 лет назад

    Всем привет!
    У меня не понятная ситуация. Отправляю один символ "M", на компьютере отображается "Y". В общем отправляю конкретные символы, приходят совсем другие.
    Кто-нибудь сможет помочь?

    • @AAAAAA-lt9mi
      @AAAAAA-lt9mi 5 лет назад

      В общем решился вопрос. Проблема была в китайском usb-comport.

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

    Подскажите пожалуйста, функция HAL_UART_Transmit передает только один байт (255) , а если я хочу передать длинное число (миллион), как мне действовать?
    Разбить число на разряды и впихнуть каждый разряд в элемент массива, и потом каждую цифру передавать как ascii-символ? И на ответной части собрать обратно?

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

      Функция HAL_UART_Transmit передаёт не один байт, а сколь угодно. Мы ей показываем место в памяти, где лежат данные, а в следующем аргументе - количество байтов.
      А если Вы хотите передать например 32-битное число, то положите его по этому адресу и передайте 4 байта. А на той стороне также примите 4 байта в память и затем заберите оттуда число. Мы постоянно так делаем, например, передавая количество системных квантов с клиента серверу в последних уроках.

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

      Ну вот я хочу передать двухбайтное число X = 4500 (сигнал с ацп). Пишу:
      uint16_t X;
      HAL_UART_Transmit(&huart3, &X, 2, 0xFFFF);
      Кейл выдает ошибку, мол, мне нужно 8 бит, а мне дают 16. Что ему не нравится? Я же ему указал, что будет передаваться два байта. Может как-то по другому надо записать?

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

      явное преобразование надо конечно.
      Преобразовываем указатель:
      (void *) &syscnt
      HAL_UART_Transmit(&huart3,(uint8_t*) &X, 2, 0xFFFF);
      Это же элементарный СИ.
      Позанимайтесь немного языком.
      Принимаем на другой стороне аналогично. Я выше писал как.

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

      Спасибо большущее! Преобразовал указатель, наконец-то ошибок нет и мк начал передавать!
      Но только передается почему-то задом наперед. Передаю число 4500 (hex1194), а терминал принимает 9411 (dec 37905).
      Можно ли в программе или в CubeMX настроить, чтобы мк сперва передавал старшие байты, а потом младшие?

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

      Пожалуйста!
      Это правильная передача. Передаётся именно так, как располагается в памяти. Сначала идут младшие биты, а потом старшие (little endian). И проектогенератор тут не при чём. Не надо ничего настраивать. Зачем Вам нужно, чтобы шли сначала старшие (big endian)? Вы принимаете какой программой? Сами писали?

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

    Довольно грамотный подход к урокам! Но в сл. раз лучше не вылезать за рамки темы ) Если урок про HAL USART и передачу данных, то нет смысла рассказывать про железки )

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

      Спасибо за поправки, Я учту, конечно. Но просто порой бывают случаи такие, что не рассказать про железки нельзя. Т.к. USART интерфейс находится тоже в контроллере, в железе и в переходнике. Тут железки надо соединять. Но, тем не менее спасибо за комментарий. Я обязательно пересмотрю данное видео и, может быть, найду тут что то постороннее. Ну, его-то я править уже не могу, но в будущем учту.

    • @Kaagwaan
      @Kaagwaan Год назад

      @@narodstream552 а зачем нужен дополнительный переходник FT232RL, если плата и так прекрасно соединяется с ПК через встроенные ST-Link и USB-разъем? Передача и прием через UART тоже нормально работают по этому каналу связи.