Программирование МК STM32. УРОК 15. HAL. USART. DMA

แชร์
ฝัง
  • เผยแพร่เมื่อ 7 ม.ค. 2025

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

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

    Спасибо за Ваш труд. Желаю Вам здаровя и много денег за то, что Ви совсем безплатно сдалали Ваш канал за люди как нам. Вый являетесь кредитор на библейском принципе"сделай добро и брось его в море", а мы являемся дольжники, ваш резонанс на хорошо и вселена дает вам удачи от другое место.

  • @serb_off
    @serb_off 8 ปีที่แล้ว +6

    Благодарю вас за ваш труд! Кажый день слежу за вашим каналом

  • @ЛевКоршунов-ж5е
    @ЛевКоршунов-ж5е 5 ปีที่แล้ว +1

    Terminal v1.9b не любит некоторые символы, к примеру, знак доллара, решотку и т.п., почему - то, передает какую - то белиберду или вообще, игнорирует их
    А, вообще, спасибо за видеву, осваиваю сейчас самый дрянной STM32F030F4 о двадцати ногах. Поскоку платы для него нет, раскорячили его на NUCLEO F030R8, тот выпаяли, этот впендюрили, вроде, работает. Но, тема контроллеров новая для меня, посему хэлловорлд без бубна не напишу для него. Будем учиться

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

    Привет из Азербайджана)
    Спасибо за уроки

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

    Самый крутой канал. Много чему можно научиться

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

    Сделал я как на видео, с передачей данных на комп получилось с приёмом я поймал вилы. Пол дня просидел так ни фига не получилось, потом я стал уже придираться к каждой мелочи и заметил что у автора сначала идёт инициализация DMA а потом UART у меня наоборот. На просторах инета я нашёл статью где как раз были описаны подобные грабли и как это исправить, DMA периферии с которой будете работать должна быть настроена первее самой периферии. Как оказалось порядок инициализации можно настроить в Кубе во вкладке Project Manager\Advanced Settings поставил как у автора и о чудо данные стали приниматься. В даташитах про этот прикол также ни фига не сказано.

    • @TheVoalex
      @TheVoalex 6 หลายเดือนก่อน

      Дай Вам Бог Здоровья!

  • @alexmueller1041
    @alexmueller1041 7 ปีที่แล้ว +1

    вообще работает как-то странно. Есть такой участот кода.
    if(hdma_usart1_rx.State == HAL_DMA_STATE_READY){
    HAL_Delay(100);
    HAL_UART_Receive_DMA(&huart1, (uint8_t*) str, 20);
    //HAL_Delay(100);
    hdma_usart1_rx.State = HAL_DMA_STATE_BUSY;
    }
    при передачи по ASART в переменной str сохраняются значения "поочереди". При чем без прохождения курсора в код IF(...) То есть передаю 12 еще раз 12 итд. В переменной все сохраняется 121212... Но при этом STATE остается Busy, а значит код в IF(...) не должен выполнятся. Когда переменная str наполняется, State становится Ready и начинает выполнятся код в IF(...). Не могу понять одного , как переменная str может заполнятся без прохождения курсорра в IF(...)?

  • @ДмитрийТисов-ж6я
    @ДмитрийТисов-ж6я 9 หลายเดือนก่อน

    Спасибо

  • @timelord1137
    @timelord1137 5 ปีที่แล้ว +1

    Спасибо)

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

    thanks for the explanation. How is it possible to write data from BufferDMA to UARTBuffer both when the CpltCallback interrupt (BufferDMA full) is triggered and when the IDLE interrupt is triggered. What strategy do you use to manage writing pointers? thank you

  • @TheMysteo
    @TheMysteo 7 ปีที่แล้ว +1

    Здравствуйте! Подскажите пожалуйста, что может быть ? Делаю все как в вашем видео, по приему данных UART через DMA, но почему-то первый и второй байт массива одинаковый, хотя если смотреть через преобразователь UART USB , первый и второй байт не дублируется

  • @MrK0mix
    @MrK0mix 8 ปีที่แล้ว +3

    А почему не использовался стандартный колбэк дма функции UART_DMAReceiveCplt()? Крутить проверку в режиме блокировки безусловно понятнее, но так вся библиотека хол выстраивается уже в понятную архитектуру.

    • @narodstream552
      @narodstream552  8 ปีที่แล้ว +1

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

  • @2007mannaz
    @2007mannaz 6 ปีที่แล้ว +1

    Добрый день, я нечего не понимаю с STM32. Проста почему то прерывании отслеживаем в бесконечном цикле. Проста на AVR указывается конкретный код в обработчике прерывании и тем самым его не запускали с бесконечного цикла. Ведь прерывание на то и прерывание, чтоб вызывалось по наступлению события, для этого даже отдельная функция. А тут мы постоянно ещё что та отслеживаем, ведь это теряет всякий смысл. Или я что та не понимаю?

    • @narodstream552
      @narodstream552  6 ปีที่แล้ว +1

      Здравствуйте!
      Мы отслеживаем скорей всего не само прерывание, а его флаг в данный момент. А так да. Нужно обработать событие.

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

    Thanks

  • @denysnikolaevich511
    @denysnikolaevich511 8 ปีที่แล้ว +1

    Здравствуйте , подскажите как правильно отправить строку в которой есть спец символы ?
    Я по вашим урокам понял для этого есть sprinf но он не понимает символ "
    Передать нужно строку AT+SAPBR=3,1,"CONTYPE","GPRS" в юарт .

    • @denysnikolaevich511
      @denysnikolaevich511 8 ปีที่แล้ว +1

      разобрался сам
      sprintf(usb_tx,"AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"
      ");

    • @narodstream552
      @narodstream552  8 ปีที่แล้ว

      Denys Nikolaevich здравствуйте! Обычная работа со строками в си.

    • @denysnikolaevich511
      @denysnikolaevich511 8 ปีที่แล้ว

      Ну это очевидно вам , я же си не знаю только учусь =)

  • @МихаилЖуравель-в2к
    @МихаилЖуравель-в2к 7 ปีที่แล้ว +5

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

    • @dmitryponyatov2158
      @dmitryponyatov2158 4 ปีที่แล้ว +5

      Это DMA, оно к ядру процессора доступ не имеет - чем байты сравнивать будете?

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

      Да и к тому же какой максимальный буфер тогда брать

  • @MRTORNADO777
    @MRTORNADO777 8 ปีที่แล้ว

    классное видео!👍

    • @narodstream552
      @narodstream552  8 ปีที่แล้ว

      +MR TORNADO
      Спасибо! Я рад, что Вам понравилось!

  • @Aleksandr_Sidorov
    @Aleksandr_Sidorov 6 ปีที่แล้ว

    А можно просто конкретно урок про DMA отснять уж просто бьюсь не первый день когда работает когда нет

  • @sergbo5509
    @sergbo5509 6 ปีที่แล้ว +4

    Какой-то странный пример с ДМА. Зачем ждать заполнения не пойму. Вся философия ДМА в том что бы он заполнялся независимо от процессора, а когда у программы будет время она сразу же извлекает данные из ДМА или передает ссылку дальше, что бы не переполнился буфер. Т.е. в идеале полного заполнения не должно быть, следующее что должен сделать процессор после заполнения это остановить поток данных, т.е. Убрать CTS. Единственное когда реализуется ожидание заполнения, это ДМА с двойной буферизацией, там в то время когда один буфер заполняется второй извлекается, обычно используется в системах захвата данных в реальном времени, типа АЦП и тд. Правда как для демонстрации работы дма может и сойдет и так.

    • @narodstream552
      @narodstream552  6 ปีที่แล้ว

      Вы верно подметили! Именно демонстрация. Урок не метит на оптимизацию кода, он направлен именно на то, чтобы показать применение периферии!

  • @ДмитрийБуньков-щ8ш
    @ДмитрийБуньков-щ8ш 8 ปีที่แล้ว +1

    Здравствуйте. Подскажите пожалуйста. Копаюсь с реализацией протокола modbus на rs 485 через usart стмки. С помощью обычных прерываний всё работает. Пытаюсь прикрутить dma, но вот в чем проблема. То количество байт, которое я приму, заранее не известно. Поэтому нужно дать команду на приём большого количества байт и в процессе того, как они будут идти, прервать приём и сбросить его в 0 байт, чтобы новый пакет опять начал писаться в массив сначала. Как это сделать? И в регистры тыкался, и функции всякие вызывал, ничего не помогло. Цифра в регистре, соответстветвующая количеству принятых байт никак не хочет меняться. Заранее спасибо за ответ

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

      Full или half duplex был?

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

      Как реализовали обработку таймаута на modbus при использовании dma?

  • @DrargonsM
    @DrargonsM 8 ปีที่แล้ว

    Вовчик диджей))))) йоу.!!! лайк

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

    спасибо!

  • @IhorLiehotin
    @IhorLiehotin 8 ปีที่แล้ว

    подскажите, где вы узнаете о том, какие статусы принимает DMA? (Ну тот статус, который вы отслеживали при приеме данных). В Refferense Manual и HAL Driver Manual об этом ничего не сказано просто.

    • @narodstream552
      @narodstream552  8 ปีที่แล้ว +1

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

  • @ЮрийИванов-е9о3ы
    @ЮрийИванов-е9о3ы 7 ปีที่แล้ว

    Спасибо за урок. Возможно в библиотеке HAL произошли какие то изменения у меня после передачи всего слова state=0x01 HAL_DMA_STATE_READY

    • @alexmueller1041
      @alexmueller1041 7 ปีที่แล้ว

      Tozhe samoe.

    • @alexmueller1041
      @alexmueller1041 7 ปีที่แล้ว +1

      Wot takaya struktura v hal dlya statusov
      typedef enum
      {
      HAL_DMA_STATE_RESET = 0x00U, /*!< DMA not yet initialized or disabled */
      HAL_DMA_STATE_READY = 0x01U, /*!< DMA initialized and ready for use */
      HAL_DMA_STATE_BUSY = 0x02U, /*!< DMA process is ongoing */
      HAL_DMA_STATE_TIMEOUT = 0x03U /*!< DMA timeout state */
      }HAL_DMA_StateTypeDef;
      Widno chto half_MEM0 statusa net. w stm32f100 ili hal obnovili. Nuzhno smotret Dokumentyciyu.

    • @D._-Porcupine-_.
      @D._-Porcupine-_. 7 ปีที่แล้ว

      В stm32f407 тоже самое.

    • @ЛевКоршунов-ж5е
      @ЛевКоршунов-ж5е 5 ปีที่แล้ว

      Произошли, рабочий интерфейс сильно поменялся

  • @ergokannikka
    @ergokannikka 8 ปีที่แล้ว

    Zdravstvuitje. A jest kokojeto vozmoznost vyvodit dannyje bjes polnogo zapolnjenije registra pri Recieve? Ili objezatjelno nado zaplonit ves register? Sposiba.

    • @narodstream552
      @narodstream552  8 ปีที่แล้ว

      Ergo Kannikka может буфера, а не регистра? И какого именно буфера? Буфера FIFO DMA или буфера USART?

    • @ergokannikka
      @ergokannikka 8 ปีที่แล้ว

      Ja pytajus vyvesti dannyje s DMA buffera. Sozdavaja massiv na 10 bayt DMA interrupt nje actevirujetsja poka ves buffer nje zapolnish. Vozmozno li zdjelat chtoto na podobije massiv na 30 bayt i snimat kak tolko hot chtoto tam okazetsja. Tipo variable data length. Vozmozno tokoje?

    • @narodstream552
      @narodstream552  8 ปีที่แล้ว

      Так должно и быть. DMA не отчитывается о каждом байте, т.к. передача через DMA происходит как известно без использования АЛУ, а код работает именно в нем

  • @22altair22
    @22altair22 8 ปีที่แล้ว

    жалко нельзя поставить сразу 500 лайков

    • @narodstream552
      @narodstream552  8 ปีที่แล้ว

      Тем не менее спасибо Вам за один! Это также поддержка канала.