STM32. UART, DMA, IT. Отправка данных. Практика. (Урок 6)

แชร์
ฝัง
  • เผยแพร่เมื่อ 14 ต.ค. 2024

ความคิดเห็น • 57

  • @GroveLoveBIG
    @GroveLoveBIG 4 ปีที่แล้ว +2

    Спасибо большое.
    Не забывайте в плейлист добавлять все уроки, многие люди по плейлистам ориентируются.

  • @PHLANEC
    @PHLANEC 9 หลายเดือนก่อน +1

    Не столько порадовало слово кюекюе, сколько буси :D

  • @ilmaks
    @ilmaks ปีที่แล้ว

    Очень понятный урок! Спасибо!

  • @zhdanvadim9536
    @zhdanvadim9536 ปีที่แล้ว

    Спасибо за уроки🎉

  • @sv-avtomatika
    @sv-avtomatika 4 ปีที่แล้ว

    Большое спасибо за ролики. Пытаюсь перейти с ардуино на стм. Подобных видео много в интернете, и только ваши заходят на ура. Есть несколько вопросов:
    1. Как вы делаете автоформатирование текста кода в труСтудио?
    2. Как правильно выставлять время ожидания отправки и какому времени равно 0xFFFF?

    • @Solderingironspb
      @Solderingironspb  4 ปีที่แล้ว +2

      Мне приятно, что Вам нравится))
      Ответ: 1. Ctrl+Shift+F. Работает и в CubeIDE.
      2. На счет правильности выставления времени ожидания. Это очень сложно, т.к. это Вам каждое сообщение нужно будет прогонять через логический аналзатор и смотреть, сколько времени требуется под то или иное сообщение. 0xFFFF = 65535. Это я просто максимальное время выставил. Его не обязательно записывать в hex формате. Можете и в dec записывать). Я не уверен на 100%, но я думаю там устроено так, что он отправил за какое-то время данные и дальше ждать уже не будет. Поэтому можете ставить и 100 и больше. Главное, чтоб оно успевало отправлять. А вообще блокирующей функцией пользоваться не советую, т.к. она все тормозит.

  • @konstantingolinskiy4944
    @konstantingolinskiy4944 4 ปีที่แล้ว +1

    Выводим сразу в UART функция UART_Printf() форматированный вывод
    #include
    #include
    void UART_Printf(const char* fmt, ...) {
    char buff[256];
    va_list args;
    va_start(args, fmt);
    vsnprintf(buff, sizeof(buff), fmt, args);
    HAL_UART_Transmit(&huart1, (uint8_t*)buff, strlen(buff),
    HAL_MAX_DELAY);
    va_end(args);
    }

    • @Solderingironspb
      @Solderingironspb  4 ปีที่แล้ว

      Константин, в данном случае функция является блокирующей, что не есть хорошо для оптимальной работы. Лучше использовать прерывания.

    • @konstantingolinskiy4944
      @konstantingolinskiy4944 4 ปีที่แล้ว

      @@Solderingironspb я знаю , но она идентична тому что вы в начале урока отправляли без прерывания. А по поводу прерывания чтобы проверить свободен или нет UART можно просто вместо где у вас IF ставить цикл while( HAL_UART_GetState (&huart1) == HAL_UART_STATE_BUSY_TX ) ; получается пока шина занята мы крутимся в цикле как шина освободится то покидаем его, единственное блокируем код , если не хотим блокировать то тогда как вы показывали в видео с флагами. А по поводу отладочной информации ее лучше выводить не в UART ( ардуиновская привычка ) а через SWO ( ресурсы МК практически не используются, единственное работает только на передачу )

    • @Solderingironspb
      @Solderingironspb  4 ปีที่แล้ว +1

      UART используется ж не только для отладки) Полностью согласен с Вами на счет работы с swo в режиме дебага) в начале видео, если присмотритесь к программатору моему, он перепаян. Там и swo и rst выведены)

  • @openFrimeTv
    @openFrimeTv 2 ปีที่แล้ว

    спасибо. теперь понял зачем очередь)
    получается нужно смотреть все ролики подряд а не выборочно.

    • @Solderingironspb
      @Solderingironspb  2 ปีที่แล้ว

      Да) поэтому я и нумерую их)

  • @СергейГончаров-э4г
    @СергейГончаров-э4г 3 ปีที่แล้ว

    Около месяца назад увлекся микроконтроллерами и просматриваю в том числе и ваши уроки, мне нравиться как вы преподносите материал, и тоже учусь на TrueSTUDIO, но настораживает что у IDE нет уже поддержки, хочется узнать ваше мнение по этому моменту.

    • @Solderingironspb
      @Solderingironspb  3 ปีที่แล้ว

      Я сейчас пересел на CubeIDE. Полет нормальный. В принципе, одно и то же)) По поводу TrueSTUDIO остались теплые воспоминания))

    • @СергейГончаров-э4г
      @СергейГончаров-э4г 3 ปีที่แล้ว

      @@Solderingironspb я тоже сегодня пересел на CubeIDE, но вот простая программа по передаче по UART не получается собирается без ошибок но терминал не видит данные, хотя если запускаю в KEIl то все нормально, но Keil не не нравиться, хочется как то что бы CubeIDE получалось

    • @Solderingironspb
      @Solderingironspb  3 ปีที่แล้ว

      @@СергейГончаров-э4г значит делаете что-то не так. IDE не влияет на код. Вы по моему уроку с UART работали?

    • @СергейГончаров-э4г
      @СергейГончаров-э4г 3 ปีที่แล้ว

      @@Solderingironspb Проще чем по вашему уроку , активирую через CubeMX режим USART1 в асинхронном режиме, выставляю тактирование, перехожу через Project Manager в среду программирования, в main.c прописываю массив со строкой и функцию HAL_UART_Transmit(), передаю ей массив, в блок while(), когда перехожу в KEIL все сразу работает (то есть терминал получает сообщение в виде строки), когда после тех же операций перехожу в CubeIDE терминал не видит сообщений, хотя сборка прошла спешно , вот на этом я пока и застрял..

    • @НикитаЧернышов-ъ6х
      @НикитаЧернышов-ъ6х 2 ปีที่แล้ว

      @@СергейГончаров-э4г Интересно, чем все закончилось, решили проблему?)))))))

  • @yurii851
    @yurii851 2 ปีที่แล้ว

    Бомба

  • @sv-avtomatika
    @sv-avtomatika 4 ปีที่แล้ว

    Вы используете три способа отправки в юарт, подскажите в каких случаях какой способ применять и какой способ используется в ардуино?

    • @Solderingironspb
      @Solderingironspb  4 ปีที่แล้ว

      хм....в ардуино скорее всего блокирующая функция прописана, НО утверждать не буду, не разбирался в ее внутренностях) По поводу Stm32: первый способ - это блокирующая функция, пользоваться ей крайне не желательно, т.к. она будет тормозить весь код (аналогично использованию Delay). Второй способ - работает на прерываниях. Писать сложней, но зато ничего не блокируется. МК кинул данные на отправку и занимается другими делами. Потом только проверяет, можно ли еще одну передачу осуществить или рано еще. Третий способ считается самым продвинутым. Меньше нагружает ядро. Работает еще быстрее. Как-то так...

  • @ivanrusev2270
    @ivanrusev2270 2 ปีที่แล้ว

    А как вы терминал открываете в компиляторе?И у меня панель другая.Это не Cubeide/ Atolic truestudio

    • @Solderingironspb
      @Solderingironspb  2 ปีที่แล้ว

      Ардуиновский? по UART кидаю данные на USB TTL конвертер. Он в компьютере определен, как Com port. Я его просто открываю в Arduino IDE(монитор порта).
      Можно вместо USB TTL конвертера использовать любую Arduino плату, ту же Arduino nano. Ресет на ардуино закорачиваем на землю и все(Система мк не запускается, плата просто работает, как USB TTL конвертер). Только в данном случае UART соединение между STM32 и платой ардуино будет не Tx->Rx, Rx->Tx, а Tx->Tx, Rx->Rx.

  • @Dmitriy_KIPiA
    @Dmitriy_KIPiA 2 ปีที่แล้ว

    Ок, вопрос))) ПИшем символы и они передаются по UART перекодируясь потом по коду ASCII в двоичный код. А как мне отправить например число 5? Ну или число 10 например, чтобы UART отправил его не как два числа 1 и 0 , а именно 10?

    • @Solderingironspb
      @Solderingironspb  2 ปีที่แล้ว +1

      uint8_t A = 10;
      HAL_UART_Transmit(&huart1, &A, 1, 10);

  • @edmelectronics4110
    @edmelectronics4110 3 ปีที่แล้ว

    Скажите пожалуйста, как можна приемать и передават данни по UART, каторые представляют целье натуралнье числа - стойности переменная, а не символами-числа типа char? Я пробвал разные варианть, но не успел. Функция UART сделана так, что можно передается только символами. В Ардуино ето очень просто, делается по умолчание, но сюда не так...

    • @Solderingironspb
      @Solderingironspb  3 ปีที่แล้ว +2

      Я протокол свой делал. Для примера можете глянуть мое видео: «Практика #06». Мне так куда больше нравится работать, т.к. с проверкой CRC надежней получается.

    • @edmelectronics4110
      @edmelectronics4110 3 ปีที่แล้ว +1

      @@Solderingironspb Спасибо. Библиотека сделана очень грамотно.

  • @TheArgishtiavetikyan
    @TheArgishtiavetikyan ปีที่แล้ว

    сними видео для CMSIS желателно STM32f4

    • @Solderingironspb
      @Solderingironspb  ปีที่แล้ว

      а в чем проблема? Там немного отличается от F1, но не прям кардинально. Я попробовал на STM32F411CEU6 на CMSIS поработать. вроде получается. Вот тут есть некоторые функции: github.com/Solderingironspb/STM32F411CEU6_CMSIS_notes
      Тут главное тактирование поднять и понять, как с GPIO работать, т.к. отличие от F1 большие. А интерфейсы настраиваются почти аналогично.

  • @ЛюсёкСорока
    @ЛюсёкСорока 3 ปีที่แล้ว +3

    Отправка по прерыванию - реально говнокод )
    Прерывание работает не так. Флаги как раз в прерывании и надо обнулять - первый буфер улетел - флаг выставили. ВТорой отправляем - проверяем флаг. Первый отправился, прерывание сработало - флаг обнулили, можем отправлять следующее.
    А так обычная очередь, прерывание здесь ничего не делает абсолютно.

    • @nikolaystepanets2483
      @nikolaystepanets2483 ปีที่แล้ว

      Попробовал как-то так сделать, вроде работает. Когда все сообщения отправлены то просто ничего не происходит, но каждую секунду обнуляется счетчик и передача происходит заново.
      Единственный нюанс - странная проблема с дебагом. Когда перехожу к выводу второй строки tx_buffer1 то в консоли выводится дубликат первой строки tx_buffer. Видимо где-то ошибка...
      обработчик прерываний:
      HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) {
      queue++;
      }
      цикл While:
      if (queue == 1){
      HAL_UART_Transmit_IT(&huart1, tx_buffer, sizeof tx_buffer / sizeof tx_buffer[0]);
      }
      if (queue == 2){
      HAL_UART_Transmit_IT(&huart1, tx_buffer1, sizeof tx_buffer1 / sizeof tx_buffer1[0]);
      }
      if ((HAL_GetTick() - T >= 1000) && queue > 2) {
      T = HAL_GetTick();
      queue = 1;
      }

  • @sashaisupov6593
    @sashaisupov6593 3 ปีที่แล้ว

    Наблюдение: все корректно работает на STM32F103C8T6, но с STM Discovery на STM32F407VGT6 наблюдаются траблы со скоростью порта и выходит непонятно что

    • @Avenir-Sigrun
      @Avenir-Sigrun ปีที่แล้ว

      любопытно почему так

  • @РоманСоловей-б6с
    @РоманСоловей-б6с 2 ปีที่แล้ว

    Не понятно почему у СТМ нету возможности настраивать юарт на 7 бит. В тех же АВР есть такая функция. И в своей практике встречал устройства которые обмениваются именно так.

    • @Solderingironspb
      @Solderingironspb  2 ปีที่แล้ว +1

      В некоторых Stm32 есть 7мибитный USART. Вот, как пример. (стр. 700) www.st.com/resource/en/reference_manual/DM00031936-.pdf
      Programmable data word length (7, 8 or 9 bits)
      STM32F04x STM32F07x STM32F09x поддерживают 7мибитный USART.

    • @РоманСоловей-б6с
      @РоманСоловей-б6с 2 ปีที่แล้ว

      @@Solderingironspb спасибо. Но все равно это странно. У них так много настроек а такое элементарное не сделали

    • @Solderingironspb
      @Solderingironspb  2 ปีที่แล้ว

      Ну да)

  • @АлексейИванов-т4ч
    @АлексейИванов-т4ч 3 ปีที่แล้ว

    Еще хотел спросить, как вас найти в контакте?

    • @Solderingironspb
      @Solderingironspb  3 ปีที่แล้ว

      В описании ссылка есть на группу) в группе я админ) так и найдете)

  • @АлексейИванов-т4ч
    @АлексейИванов-т4ч 3 ปีที่แล้ว

    Здравствуйте, Олег. Делаю все как у вас, перечитал кучу страниц в интернете. Не получается у меня выводить текст. Ни русский, ни английский. В порт сыплет кракозябры. Где то может не совпадают кодировки или еще что? 3 дня бьюсь, все без толку. Можете мне помочь? Моя почта asdfgj@mail.ru

  • @biriuk3344
    @biriuk3344 3 ปีที่แล้ว

    А у меня вопреки всему на ардуинском мониторе и на сторонних терминалах из UART идут
    кракозябры независимо от установки шрифта и кодировки!!! Где ключ от фокуса?
    SOS! SOS! SOS!

    • @Solderingironspb
      @Solderingironspb  3 ปีที่แล้ว

      Скорость выставлена правильно? Кодировка совпадает?

    • @biriuk3344
      @biriuk3344 3 ปีที่แล้ว

      Да всё проверил. Уже закипел как чайник. Всё скопировал "от и до".

    • @biriuk3344
      @biriuk3344 3 ปีที่แล้ว

      SWO работает правильно.

    • @biriuk3344
      @biriuk3344 3 ปีที่แล้ว

      Кодировки проверял UTF8 и Cp1251 латинницу и кириллицу. ВЕЗДЕ кракозябры. :(

    • @Solderingironspb
      @Solderingironspb  3 ปีที่แล้ว

      Без паники) можете написать мне Вконтакте. Подберем удобное время для Вас и меня. Подключусь удаленно или так разберемся с проблемой)