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

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

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

  • @АлександрКопытенко
    @АлександрКопытенко ปีที่แล้ว +3

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

  • @ПетрБондарчук-п2о
    @ПетрБондарчук-п2о 3 ปีที่แล้ว +4

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

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

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

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

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

  • @АлександрМартынов-й1б
    @АлександрМартынов-й1б 2 ปีที่แล้ว

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • @sergbo3114
    @sergbo3114 8 หลายเดือนก่อน

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

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

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

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

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

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

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

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

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

  • @АлександрВасильев-п1ц
    @АлександрВасильев-п1ц 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.

  • @tiger0007t
    @tiger0007t 8 หลายเดือนก่อน

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

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

    Teşekkürler

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

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

    • @АлександрМартынов-й1б
      @АлександрМартынов-й1б 2 ปีที่แล้ว

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

  • @ДронниДрон
    @ДронниДрон 2 ปีที่แล้ว

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

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

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

    • @АлександрВасильев-п1ц
      @АлександрВасильев-п1ц 2 ปีที่แล้ว

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

    • @sergbo3114
      @sergbo3114 8 หลายเดือนก่อน

      Еще дополню. В 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.. можете готовить видео?
    зарание спасибо.....