STM32 UART IDLE LINE interrupt. Прием данных по UART не зная размера данных, используем IDLE

Поділитися
Вставка
  • Опубліковано 6 вер 2024
  • #STM32 #UART #IDLE
    STM32 UART IDLE LINE interrupt. Прием данных по UART не зная размера данных, используем IDLE.
    В данном видео я покажу как на микроконтроллерах STM32 принимать данные по UART не зная сколько байт придет, используя прерывание IDLE и DMA.
    ( Онлайн уроки по STM32 )

КОМЕНТАРІ • 33

  • @user-rq6rx5cp7i
    @user-rq6rx5cp7i 9 місяців тому +3

    Пожалуй, самое простое и бытовое объяснение работы с uart на stm...
    Спасибо!

  • @user-oy2re3uh5o
    @user-oy2re3uh5o 3 роки тому +4

    Спасибо, очень полезно

  • @qoblanqoblan9379
    @qoblanqoblan9379 Рік тому

    здравствуйте. мне очень понравилось ваш видео курс. Вы ещё подготовить видео такое, uart1 принимает данные и ему шифрует с алгоритма гост или аеs и передаеть через uart2.. можете готовить видео?
    зарание спасибо.....

  • @smart_electronics_il
    @smart_electronics_il Рік тому +4

    Вопрос, а через сколько по времени после последнего байта, поднимается idle ?

  • @sergbo3114
    @sergbo3114 5 місяців тому

    Я тут почитал, есть некоторые сообщения о проблемах с ДМА. Так вот убедитесь в следующем. В STM32F4 есть особенность. Внимательно смотрите где выделяется буфер который вы передаете в функцию. ДМА не умеет работать с CCM памятью. Кто не в курсе у данного чипа память разделена на 2 региона адреса 0х1000000 и 0х2000000. И вот первая это CCM. Если вы передадите такой адрес то ничего хорошего не получится. Что касается других контроллеров курите мануалы серы.

  • @olegiv4814
    @olegiv4814 Рік тому +1

    Существенная не точность, - если HAL_UART_RxCpltCallback вызывается один раз, это не значит, что прерывание по UART тоже будет один раз (это видно по коду HAL)
    Несколько другая ситуации с DMA , однако если необходимо вызвать прерывание только один раз, нужно либо править HAL, либо делать все вручную (лучше с использованием LL)

  • @jordanpales3503
    @jordanpales3503 2 роки тому +1

    Спасибо, очень полезно! С меня лайк и подписка!

  • @user-dk4vr3fp3s
    @user-dk4vr3fp3s 2 роки тому

    Хорошо объясняете, лайк, подписка!

  • @olek8267
    @olek8267 Рік тому

    Дякую. Нічого зайвого.

  • @qoblanqoblan9379
    @qoblanqoblan9379 Рік тому

    здравствуйте. мне очень понравилось ваш видео курс. Вы ещё подготовить видео такое, uart1 принимает данные и ему шифрует с алгоритма гост или аеs и передаеть через uart2.. можете готовить видео?

  • @masterkit9517
    @masterkit9517 3 роки тому +2

    stm32 подоожал в 10 раз)

    • @Arduino_Kit
      @Arduino_Kit  3 роки тому +1

      Все МК подорожали, да 103 больше всех так как самый ходовой.

  • @edmelectronics4110
    @edmelectronics4110 2 роки тому

    Да, ето самой простой и иновативный метод прием данни не зная их размер. У меня есть такое пожелание: Как передавать и приемать данни по УАРТ, каторые представляют обичние переменны, например от размер uint32_t. Все примери которые я встречал были основно с передача и приема символные байти для монитора. Интерес представляет обмен данны между двумя микроконтролера по УАРТ на обичные переменный, несимволные - int, float, doble и т.д. Спасибо.

    • @AlekseiVOne
      @AlekseiVOne 2 роки тому

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

  • @BarVados
    @BarVados Рік тому

    Из-за чего в буфер ни чего не записывается, но при этом срабатывает прерывание и ReceiveType == HAL_UART_RECEPTION_STANDARD ?

  • @ko062vvs
    @ko062vvs 2 роки тому

    А если без DMA? второй пакет данных, если другого размера, size сохраняет количество принятых байт предыдущего. Почему так? если я послал например 8 байт size стало 8. после послал 4 size стал 4. а потом опять 8 size остался все-ровно 4.

  • @user-vl8rx6os8u
    @user-vl8rx6os8u 2 роки тому

    Спасибо автору за видео!
    У меня изначально возник вопрос: почему прерывание по IDLE не срабатывает сразу же, ведь линия изначально после старта UART находится в состоянии IDLE?
    В итоге сам нашёл ответ: прерывание срабатывает только если принят хотя бы 1 байт.
    В моём случае в файле stm32g4xx_hal_uart.c в обработчике прерывания HAL_UART_IRQHandler в строке 2402 значится следующее:
    /* DMA mode enabled */
    /* Check received length : If all expected data are received, do nothing,
    (DMA cplt callback will be called).
    Otherwise, if at least one data has already been received, IDLE event is to be notified to user */
    uint16_t nb_remaining_rx_data = (uint16_t) __HAL_DMA_GET_COUNTER(huart->hdmarx);
    if ((nb_remaining_rx_data > 0U)
    && (nb_remaining_rx_data < huart->RxXferSize)) {
    и только после этих проверок программа честно попадает в HAL_UARTEx_RxEventCallback.

  • @Fixaj
    @Fixaj Рік тому

    Teşekkürler

  • @tiger0007t
    @tiger0007t 6 місяців тому

    не получилось у меня с dma

  • @izmitelektronik
    @izmitelektronik Рік тому

    Как с вами связаться? Есть деловой предложение.

  • @AlekseiVOne
    @AlekseiVOne 2 роки тому

    Подскажите пожалуйста, запрограммировал по вашему примеру плату. Только у меня на UART1 сидит GPS модем, UART2 это данные в порт компа. И ловлю дефект, связанный с тем, что если я сделаю так: выключу питание, отсоединю GPS, включу плату, включу терминал и открою порт на ПК, подсоединю GPS модем то у меня все прекрасно работает. Но если GPS модем сидит на линии, когда подается питание на плату то никаких данных по UART1 не передается. Подскажите пожалуйста, в чем может быть причина?

    • @user-dk4vr3fp3s
      @user-dk4vr3fp3s 2 роки тому

      Может какой-то мусор отправляется при включении? В идеале мне кажется померить что на линиях уарт1 в момент подачи питания. Как успехи разобрались?

  • @user-jn7vh7be1z
    @user-jn7vh7be1z 2 роки тому

    Не работает блин по DMA. До этого всё огонь, попадает в калбек. Как ттолько IT меняю на DMA всё - тишина, даже буфер не наполняется. Кто знает что делаю не так?

    • @alexandrkstudy
      @alexandrkstudy 2 роки тому

      Поменяй местами инициализацию UASART и DMA. Инициализация UASART должна быть первой. Увидел в сети чей-то комментарий и мне это также помогло, видимо дело в HAL (работал в STM32CubeIDE 1.9 /mcu STM32L476RG)

    • @user-vl8rx6os8u
      @user-vl8rx6os8u 2 роки тому

      У меня была того же рода проблема - в дебаге выяснил, что после запуска юарта с ДМА в режиме ожидания IDLE (HAL_UARTEx_ReceiveToIdle_DMA), срабатывает прерывание ЮАРТа по переполнению (OVERRUN), и обработчик запрещает дальнейшие прерывания по событию IDLE, очищая бит USART_CR1_IDLEIE.
      В итоге решил вопрос принудительным очищением флага UART_CLEAR_OREF перед запуском функции.
      Возможно это происходило из-за того, что до запуска ЮАРТа с ДМА в режиме ожидания IDLE (HAL_UARTEx_ReceiveToIdle_DMA), запускал ЮАРТ в блокирующем режиме HAL_UART_Receive.

    • @sergbo3114
      @sergbo3114 5 місяців тому

      Еще дополню. В STM32F4 есть особенность. Внимательно смотрите где выделяется буфер который вы передаете в функцию. ДМА не умеет работать с CCM памятью. Кто не в курсе у данного чипа память разделена на 2 региона адреса 0х1000000 и 0х2000000. И вот первая это CCM. Если вы передадите такой адрес то ничего хорошего не получится.

  • @alfiz9943
    @alfiz9943 Рік тому

    а чо так можно было ?!

  • @qoblanqoblan9379
    @qoblanqoblan9379 Рік тому

    здравствуйте. мне очень понравилось ваш видео курс. Вы ещё подготовить видео такое, uart1 принимает данные и ему шифрует с алгоритма гост или аеs и передаеть через uart2.. можете готовить видео?
    зарание спасибо.....

  • @qoblanqoblan9379
    @qoblanqoblan9379 Рік тому

    здравствуйте. мне очень понравилось ваш видео курс. Вы ещё подготовить видео такое, uart1 принимает данные и ему шифрует с алгоритма гост или аеs и передаеть через uart2.. можете готовить видео?
    зарание спасибо.....

  • @qoblanqoblan9379
    @qoblanqoblan9379 Рік тому

    здравствуйте. мне очень понравилось ваш видео курс. Вы ещё подготовить видео такое, uart1 принимает данные и ему шифрует с алгоритма гост или аеs и передаеть через uart2.. можете готовить видео?
    зарание спасибо.....

  • @qoblanqoblan9379
    @qoblanqoblan9379 Рік тому

    здравствуйте. мне очень понравилось ваш видео курс. Вы ещё подготовить видео такое, uart1 принимает данные и ему шифрует с алгоритма гост или аеs и передаеть через uart2.. можете готовить видео?
    зарание спасибо.....