STM32 UART IDLE LINE interrupt. Прием данных по UART не зная размера данных, используем IDLE
Вставка
- Опубліковано 6 вер 2024
- #STM32 #UART #IDLE
STM32 UART IDLE LINE interrupt. Прием данных по UART не зная размера данных, используем IDLE.
В данном видео я покажу как на микроконтроллерах STM32 принимать данные по UART не зная сколько байт придет, используя прерывание IDLE и DMA.
( Онлайн уроки по STM32 )
Пожалуй, самое простое и бытовое объяснение работы с uart на stm...
Спасибо!
Спасибо, очень полезно
здравствуйте. мне очень понравилось ваш видео курс. Вы ещё подготовить видео такое, uart1 принимает данные и ему шифрует с алгоритма гост или аеs и передаеть через uart2.. можете готовить видео?
зарание спасибо.....
Вопрос, а через сколько по времени после последнего байта, поднимается idle ?
Я тут почитал, есть некоторые сообщения о проблемах с ДМА. Так вот убедитесь в следующем. В STM32F4 есть особенность. Внимательно смотрите где выделяется буфер который вы передаете в функцию. ДМА не умеет работать с CCM памятью. Кто не в курсе у данного чипа память разделена на 2 региона адреса 0х1000000 и 0х2000000. И вот первая это CCM. Если вы передадите такой адрес то ничего хорошего не получится. Что касается других контроллеров курите мануалы серы.
Существенная не точность, - если HAL_UART_RxCpltCallback вызывается один раз, это не значит, что прерывание по UART тоже будет один раз (это видно по коду HAL)
Несколько другая ситуации с DMA , однако если необходимо вызвать прерывание только один раз, нужно либо править HAL, либо делать все вручную (лучше с использованием LL)
Спасибо, очень полезно! С меня лайк и подписка!
Хорошо объясняете, лайк, подписка!
Дякую. Нічого зайвого.
здравствуйте. мне очень понравилось ваш видео курс. Вы ещё подготовить видео такое, uart1 принимает данные и ему шифрует с алгоритма гост или аеs и передаеть через uart2.. можете готовить видео?
stm32 подоожал в 10 раз)
Все МК подорожали, да 103 больше всех так как самый ходовой.
Да, ето самой простой и иновативный метод прием данни не зная их размер. У меня есть такое пожелание: Как передавать и приемать данни по УАРТ, каторые представляют обичние переменны, например от размер uint32_t. Все примери которые я встречал были основно с передача и приема символные байти для монитора. Интерес представляет обмен данны между двумя микроконтролера по УАРТ на обичные переменный, несимволные - int, float, doble и т.д. Спасибо.
Передаются как строки, а потом на приемном устройстве сделать преобразование из строки в необходимые типы данных функцией atoi . Как вариант
Из-за чего в буфер ни чего не записывается, но при этом срабатывает прерывание и ReceiveType == HAL_UART_RECEPTION_STANDARD ?
А если без DMA? второй пакет данных, если другого размера, size сохраняет количество принятых байт предыдущего. Почему так? если я послал например 8 байт size стало 8. после послал 4 size стал 4. а потом опять 8 size остался все-ровно 4.
Спасибо автору за видео!
У меня изначально возник вопрос: почему прерывание по 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.
Teşekkürler
не получилось у меня с dma
Как с вами связаться? Есть деловой предложение.
Подскажите пожалуйста, запрограммировал по вашему примеру плату. Только у меня на UART1 сидит GPS модем, UART2 это данные в порт компа. И ловлю дефект, связанный с тем, что если я сделаю так: выключу питание, отсоединю GPS, включу плату, включу терминал и открою порт на ПК, подсоединю GPS модем то у меня все прекрасно работает. Но если GPS модем сидит на линии, когда подается питание на плату то никаких данных по UART1 не передается. Подскажите пожалуйста, в чем может быть причина?
Может какой-то мусор отправляется при включении? В идеале мне кажется померить что на линиях уарт1 в момент подачи питания. Как успехи разобрались?
Не работает блин по DMA. До этого всё огонь, попадает в калбек. Как ттолько IT меняю на DMA всё - тишина, даже буфер не наполняется. Кто знает что делаю не так?
Поменяй местами инициализацию UASART и DMA. Инициализация UASART должна быть первой. Увидел в сети чей-то комментарий и мне это также помогло, видимо дело в HAL (работал в STM32CubeIDE 1.9 /mcu STM32L476RG)
У меня была того же рода проблема - в дебаге выяснил, что после запуска юарта с ДМА в режиме ожидания IDLE (HAL_UARTEx_ReceiveToIdle_DMA), срабатывает прерывание ЮАРТа по переполнению (OVERRUN), и обработчик запрещает дальнейшие прерывания по событию IDLE, очищая бит USART_CR1_IDLEIE.
В итоге решил вопрос принудительным очищением флага UART_CLEAR_OREF перед запуском функции.
Возможно это происходило из-за того, что до запуска ЮАРТа с ДМА в режиме ожидания IDLE (HAL_UARTEx_ReceiveToIdle_DMA), запускал ЮАРТ в блокирующем режиме HAL_UART_Receive.
Еще дополню. В STM32F4 есть особенность. Внимательно смотрите где выделяется буфер который вы передаете в функцию. ДМА не умеет работать с CCM памятью. Кто не в курсе у данного чипа память разделена на 2 региона адреса 0х1000000 и 0х2000000. И вот первая это CCM. Если вы передадите такой адрес то ничего хорошего не получится.
а чо так можно было ?!
здравствуйте. мне очень понравилось ваш видео курс. Вы ещё подготовить видео такое, uart1 принимает данные и ему шифрует с алгоритма гост или аеs и передаеть через uart2.. можете готовить видео?
зарание спасибо.....
здравствуйте. мне очень понравилось ваш видео курс. Вы ещё подготовить видео такое, uart1 принимает данные и ему шифрует с алгоритма гост или аеs и передаеть через uart2.. можете готовить видео?
зарание спасибо.....
здравствуйте. мне очень понравилось ваш видео курс. Вы ещё подготовить видео такое, uart1 принимает данные и ему шифрует с алгоритма гост или аеs и передаеть через uart2.. можете готовить видео?
зарание спасибо.....
здравствуйте. мне очень понравилось ваш видео курс. Вы ещё подготовить видео такое, uart1 принимает данные и ему шифрует с алгоритма гост или аеs и передаеть через uart2.. можете готовить видео?
зарание спасибо.....