Easyelectronics.ru

Электроника для всех
Текущее время: 23 янв 2021, 19:58

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 3517 ]  На страницу Пред.  1 ... 105, 106, 107, 108, 109, 110, 111 ... 141  След.
Автор Сообщение
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 18 авг 2019, 17:10 
Старожил

Зарегистрирован: 27 мар 2015, 01:22
Сообщения: 2065
Атарасий писал(а):
Если программа ляжет - IWDG ее перезапустит, в чем проблема?

Даже удобно - доп ресет по rxd )

_________________
mcu.goodboard.ru


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 18 авг 2019, 17:28 
Старожил

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 4198
Проблема в том, что IWDG - это последний бастион надежды, а не постоянный инструмент, как многие ошибочно полагают.
А по поводу "белого шума" - есть прерывания (флаги) по ошибке фрейма и по обнаружению шума. Вообще, нормально написанная программа всегда имеет обработку ошибок. На IWDG надеяться не стоит, тому есть масса причин, главная из которых - неожиданное прекращение работы без сохранения текущего состояния и результатов. Представьте, что пока вы пишите на форуме, у вас комп спонтанно перезагрузится, и текст вам придется вводить заново, а вы еще и не помните дословно, что писали. Так же и в случае МК.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 18 авг 2019, 17:40 
Старожил
Аватара пользователя

Зарегистрирован: 28 янв 2010, 11:56
Сообщения: 4039
Откуда: Винница
vt340 писал(а):
Даже удобно - доп ресет по rxd )
В некоторых контроллерах от NXP сброс при нуле на RXD вызывает безусловный переход на адрес запуска бутлоадера, который в общем-то стираемый, а в младших моделях так и вовсе отсутствует. Получается этакий "чёртовджант" ("прыжок хз-куда").
Хорошо, что в STM32 такого нет. :)

_________________
Китайская комплектация - европейское качество!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 18 авг 2019, 18:08 
Заглядывает иногда

Зарегистрирован: 26 апр 2019, 00:22
Сообщения: 62
Откуда: Москва
BusMaster писал(а):
Проблема в том, что IWDG - это последний бастион надежды, а не постоянный инструмент, как многие ошибочно полагают.
А по поводу "белого шума" - есть прерывания (флаги) по ошибке фрейма и по обнаружению шума
Лично я с этим полностью согласен. Просто вопрос был поставлен так, что что-то такое абстрактное произойдет (а фантазия же безгранична) и программа ляжет. Вот в этом случае я и сказал что всегда будет IWDG. А так конечно, если все флаги правильно обрабатывать (а так и обязано быть) то и шум отсеется и ничего не ляжет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 18 авг 2019, 18:40 
Старожил

Зарегистрирован: 27 мар 2015, 01:22
Сообщения: 2065
Атарасий писал(а):
А так конечно, если все флаги правильно обрабатывать (а так и обязано быть) то и шум отсеется

И как же правильно обрабатывать все флаги при приёме по dma?

_________________
mcu.goodboard.ru


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 18 авг 2019, 20:24 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 4910
Откуда: КЧР, поселок Нижний Архыз
Атарасий писал(а):
Вы не прикидываетесь, правда не понимаете? IDLE - это одно прерывание в конце пакета, а не 100 - по одному на каждый байт. И весь пакет уже в буфере, без всяких копирований этих самых байт.

Это значительно усложнит парсинг строк, т.к. придется заводить еще и третий буфер - куда складывать строки, заканчивающиеся на '\n' для парсинга, склеивая их из пришедших данных и уже накопившегося из предыдущей посылки.

А парсинг в прерывании значительно проще: как только получили '\n', выставили флаг и поменяли буферы. ВсĒ!
Вот в STM32F0 можно выставить прерывание на прием '\n', там — да, можно при помощи DMA принимать данные (с обработкой переполнения, если вдруг произойдет).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 18 авг 2019, 23:05 
Заглядывает иногда

Зарегистрирован: 26 апр 2019, 00:22
Сообщения: 62
Откуда: Москва
vt340 писал(а):
Атарасий писал(а):
А так конечно, если все флаги правильно обрабатывать (а так и обязано быть) то и шум отсеется

И как же правильно обрабатывать все флаги при приёме по dma?
Это сарказм? Какой в этом смысл? Я начинающий, но некоторые вещи очевидны даже мне. Все флаги ошибок как минимум надо проверять и сбрасывать после приема каждого сообщения. А уж нужны вам прерывания по ним, или какие то иные действия - зависит от ваших проблем на линии, реальных и выдуманных. Все проблемы и неисправности требуют индивидуального подхода.
Известную аналогию приведу в тему: отличие запада и России в том, что на западе строят дороги, а в России вместо дорог - вездеходы. Так же и у вас получается.

Eddy_Em писал(а):
Это значительно усложнит парсинг строк, т.к. придется заводить еще и третий буфер - куда складывать строки, заканчивающиеся на '\n' для парсинга, склеивая их из пришедших данных и уже накопившегося из предыдущей посылки.
Строки и наличие '\n' - это опять таки частный случай, я не отрицаю, возможно требующий индивидуального подхода, хотя, как вы верно заметили в STM32F0 и это тоже решается аппаратно. В любом случае, все ваши манипуляции со строками будут работать через DMA, и усложнится немного парсинг или нет, это уже другой вопрос, совершенно не имеющий отношения к работоспособности приема по DMA при неизвестной длине пакета.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 19 авг 2019, 00:24 
Старожил

Зарегистрирован: 27 мар 2015, 01:22
Сообщения: 2065
Атарасий писал(а):
Все флаги ошибок как минимум надо проверять и сбрасывать после приема каждого сообщения.

Какого ещё "сообщения"? )
Просто байтики приходят, могут с ошибками, могут с паузами, могут сразу много, могут сразу много с ошибками
Как их различать и метить какие хорошие, какие плохие в буфере dma?

_________________
mcu.goodboard.ru


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 19 авг 2019, 01:41 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2014, 13:25
Сообщения: 1016
Откуда: Earth
Кое-как работающий вариант колббека выглядит вот так:
Show

Единственное, что необходимо что-то придумать с указателем на приемный буфер в HAL_UART_Receive_DMA, потому что по достижению конца буфера получается какая-то хрень (я использую режим circular).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 19 авг 2019, 02:07 
Старожил

Зарегистрирован: 06 июн 2018, 22:30
Сообщения: 551
Откуда: Киев
Атарасий Зачем вам в F0 IDLE? там как раз все красиво.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 19 авг 2019, 02:31 
Заглядывает иногда

Зарегистрирован: 26 апр 2019, 00:22
Сообщения: 62
Откуда: Москва
vt340 писал(а):
Какого ещё "сообщения"? )
Просто байтики приходят, могут с ошибками, могут с паузами, могут сразу много, могут сразу много с ошибками
Того самого, которое придет по прерыванию IDLE или таймауту и попадет в буфер DMA. Для чего мне байты, не несущие в себе по отдельности никакого смысла?

MasterElectric писал(а):
Зачем вам в F0 IDLE? там как раз все красиво.
Ровно затем, зачем он описан в Reference manual: This bit is set by hardware when an Idle Line is detected.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 19 авг 2019, 11:45 
Старожил

Зарегистрирован: 27 мар 2015, 01:22
Сообщения: 2065
Атарасий писал(а):
vt340 писал(а):
Какого ещё "сообщения"? )
Просто байтики приходят, могут с ошибками, могут с паузами, могут сразу много, могут сразу много с ошибками
Того самого, которое придет по прерыванию IDLE или таймауту и попадет в буфер DMA.

В идеальном мире и в частном случае, а в реальном и в общем - байтики )

_________________
mcu.goodboard.ru


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 19 авг 2019, 12:04 
Заглядывает иногда

Зарегистрирован: 26 апр 2019, 00:22
Сообщения: 62
Откуда: Москва
Gnusmas писал(а):
Единственное, что необходимо что-то придумать с указателем на приемный буфер в HAL_UART_Receive_DMA, потому что по достижению конца буфера получается какая-то хрень (я использую режим circular).
У меня схема такая же, только я на CMSYS делаю: в прерывании по IDLE проверяю буфер DMA на переполнение, и если переполнения не было вычисляю длину пришедшего сообщения и устанавливаю флаг парсинга (парсинг происходит в основной программе). Дальше прямо в этом же прерывании отключаю канал DMA, перезаписываю в регистр CNDTR размер буфера для обнуления указателя (чтобы следующее сообщение в буфер опять с нулевой позиции попадало) и включаю канал DMA, все. По следующему IDLE картина повторится. Буфер DMA кольцевой - именно для контроля его переполнения, если пришел какой то длинный мусор, и буфер перезапишется по кругу я это увижу и парсить эту хрень не буду. Кусок примерного кода, думаю уж адаптируете под HAL.

Show Реализация на CMSYS


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 19 авг 2019, 12:16 
Заглядывает иногда

Зарегистрирован: 26 апр 2019, 00:22
Сообщения: 62
Откуда: Москва
vt340 писал(а):
В идеальном мире и в частном случае, а в реальном и в общем - байтики )
Прием по DMA никак не мешает анализировать ваши байтики, включите прерывания на все ошибки, считайте их, премножайте, да хоть дифференцируйте, получая скорость их нарастания)) А потом когда придет законченное сообщение, анализируйте необходимость его парсинга с учетом своего "вездеходного" алгоритма. Не вижу никаких проблем)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 19 авг 2019, 12:59 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2014, 13:25
Сообщения: 1016
Откуда: Earth
Атарасий писал(а):
...Кусок примерного кода, думаю уж адаптируете под HAL...

Благодарю. В "кольцевом" режиме надо запускать ДМА на прием повторно, после состоявшегося приема ? У Вас этого нет, но без этой процедуры у меня нормально принимается только первый пакет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 19 авг 2019, 13:13 
Заглядывает иногда

Зарегистрирован: 26 апр 2019, 00:22
Сообщения: 62
Откуда: Москва
Gnusmas писал(а):
Атарасий писал(а):
...Кусок примерного кода, думаю уж адаптируете под HAL...

Благодарю. В "кольцевом" режиме надо запускать ДМА на прием повторно, после состоявшегося приема ? У Вас этого нет, но без этой процедуры у меня принимается только первый пакет.
Не совсем понял вопрос, канал DMA у меня в конце прерывания выключается и включается, но это делается не с целью перезапуска, а с целью записи в регистр CNDTR количества принимаемых данных, после этой процедуры указатель в буфере DMA установится в 0 позицию (к примеру, 3-х байтное сообщение займет в буфере адреса 0, 1 и 2), а без этой процедуры буфер будет работать в кольцевом режиме, и запись следующего сообщения пойдет после предыдущего с круговой перезаписью буфера (3-х байтное сообщение займет в буфере адреса 3, 4 и 5, в следующий раз 6, 7 и 8 и т.д.).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 19 авг 2019, 13:22 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2014, 13:25
Сообщения: 1016
Откуда: Earth
Атарасий писал(а):
... это делается не с целью перезапуска, а с целью записи в регистр CNDTR количества принимаемых данных...

Это я понял. Если для DMA выбан режим circular (а не normal, как во всех примерах), то мне надо пнуть DMA на прием 1 раз при настройке/начале приема, либо еще пинать каждый раз в обработчике UART_IDLE_Callback ?
Ну тоесть я при инициализации DMA делаю так:
Код:
HAL_UART_Receive_DMA(&huart1, uart_dma_rx_buff, DMA_BUFSIZE);

Мне надо в обработчике UART_IDLE_Callback делать что-то подобное при circular mode ? В normal mode надо, я это понимаю.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 19 авг 2019, 13:27 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1397
Атарасий писал(а):
Не совсем понял вопрос, канал DMA у меня в конце прерывания выключается и включается, но это делается не с целью перезапуска, а с целью записи в регистр CNDTR количества принимаемых данных, после этой процедуры указатель в буфере DMA установится в 0 позицию

И начнется прием новых данных которые пишутся поверх старых, т.е. где-то в основном коде нужно проверить флаг и успеть эти старые данные забрать?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 19 авг 2019, 13:47 
Заглядывает иногда

Зарегистрирован: 26 апр 2019, 00:22
Сообщения: 62
Откуда: Москва
Gnusmas писал(а):
Это я понял. Если для DMA выбан режим circular (а не normal как во всех примерах), то мне надо пнуть DMA на прием 1 раз при настройке/начале приема, либо еще пинать каждый раз в обработчике UART_IDLE_Callback ?
Если честно, я забыл почему я отказался от режима normal, смутно помню что были какие-то сложности с приемом сообщения которое больше буфера по размеру, возможно если буфер переполняется, IDLE не появляется, не помню, надо перепроверять. Т.е. у буфера (размер буфера = максимальная возможная длина+1 байт) есть флаг "полностью заполнен", который формируется когда заполняется этот последний байт буфера. А какой уж там хвост сообщения и сколько раз он переписал буфер по кругу, становится не столь важно в этом случае. Вот чтобы после каждого приема указатель в кольцевом режиме вставал в 0-ю позицию DMA и надо пинать. В режиме normal пинать наверно не надо, но мне почему-то не понравилось то, что происходит, когда буфер переполнится. Как-то так.

Reflector писал(а):
И начнется прием новых данных которые пишутся поверх старых, т.е. где-то в основном коде нужно проверить флаг и успеть эти старые данные забрать?
Да, конечно. Начнется только не сразу, а когда придет новое сообщение. Но на то и расчет что вы должны успевать это делать, при любом виде приема по UART. Если вы делать этого не будете успевать, то тут надо использовать уже буфер реальный кольцевой, копить сообщения в очереди и обрабатывать их по мере возможности. Сложность реализации заметно возрастает. Про работу кольцевого буфера в общем и целом вот тут вроде понятно написано.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 19 авг 2019, 13:59 
Старожил

Зарегистрирован: 27 мар 2015, 01:22
Сообщения: 2065
Атарасий писал(а):
Прием по DMA никак не мешает анализировать ваши байтики, включите прерывания на все ошибки

А dma тогда зачем, кашу из топора не напоминает? )

_________________
mcu.goodboard.ru


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 19 авг 2019, 14:08 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1397
Атарасий писал(а):
Да, конечно. Начнется только не сразу, а когда придет новое сообщение. Но на то и расчет что вы должны успевать это делать, при любом виде приема по UART. Если вы делать этого не будете успевать, то тут надо использовать уже буфер реальный кольцевой, копить сообщения в очереди и обрабатывать их по мере возможности. Сложность реализации заметно возрастает.

Значит получается так, даже если у нас низкая скорость передачи, но данные идут непрерывно и IDLE срабатывать не успевает, то DMA не подходит, если между байтами есть небольшой промежуток и IDLE срабатывает, то нет никакой буферизации, т.к. старый байт нужно успеть забрать до приходу следующего, иначе нужно городить что-то заметно более сложное :) Звучит не очень оптимистично, от человека пытающегося убедить чуть ли не в безальтернативности приема по DMA ожидалось увидеть нормально работающий пример, с нормально буферизацией и в идеале не сильно сложный... И еще он должен быть рабочим, потому что примерно половина реализаций кольцевых буфер которые мне доводилось видеть таковыми не являлась, хотя могла работать в большинстве случаев, в итоге авторы грешили на китайские мк и т.д. :)

Цитата:
Про работу кольцевого буфера в общем и целом вот тут вроде понятно написано.

Это как раз пример от случая к случаю работающего буфера... Мельком глянул и сразу нашел 2 типичные ошибки.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 19 авг 2019, 14:21 
Заглядывает иногда

Зарегистрирован: 26 апр 2019, 00:22
Сообщения: 62
Откуда: Москва
vt340 писал(а):
Атарасий писал(а):
Прием по DMA никак не мешает анализировать ваши байтики, включите прерывания на все ошибки

А dma тогда зачем, кашу из топора не напоминает? )
Думаю это будет последняя моя попытка объяснить вам очевидное. Ибо вы уже толсто троллите, а я до сих пор на это ведусь.

Мой пример. Имею устройство с 4 работающими UART. Средняя длина входящего сообщения - 50 байт. Допустим моя линия передачи данных говно, ошибок на ней аж до 5% и я как и вы отказываюсь это признавать и чинить линию.

Прием по прерываниям выглядит так:
Количество побайтных прерываний: 4UART*50byte = 200 прерываний.
Количество операций копирования байт: 4UART*50byte = 200 операций копирования байт.
Количество прерываний ошибок: 200 байт * 5% = 10 прерываний.
Итого 210 прерываний и 200 операций на 1 цикл обмена.

Прием по DMA выглядит так:
Количество побайтных прерываний: 0 прерываний.
Количество прерываний для сообщений (IDLE): 4UART * 1сообщение = 4 прерывания.
Количество операций копирования байт: 0 операций копирования байт.
Количество операций копирования сообщений: 0 операций копирования сообщений (сообщение уже в буфере, сразу берется и парсится).
Дополнительные операции для перезапуска DMA или еще чего, с запасом: 4UART*10byte = 40 операций.
Количество прерываний ошибок: 200 байт * 5% = 10 прерываний.
Итого 14 прерываний и 40 операций на 1 цикл обмена.


Последний раз редактировалось Атарасий 19 авг 2019, 14:48, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 19 авг 2019, 14:32 
Заглядывает иногда

Зарегистрирован: 26 апр 2019, 00:22
Сообщения: 62
Откуда: Москва
Reflector писал(а):
Значит получается так, даже если у нас низкая скорость передачи, но данные идут непрерывно и IDLE срабатывать не успевает, то DMA не подходит, если между байтами есть небольшой промежуток и IDLE срабатывает, то нет никакой буферизации, т.к. старый байт нужно успеть забрать до приходу следующего, иначе нужно городить что-то заметно более сложное :) Звучит не очень оптимистично, от человека пытающегося убедить чуть ли не в безальтернативности приема по DMA ожидалось увидеть нормально работающий пример, с нормально буферизацией и в идеале не сильно сложный... И еще он должен быть рабочим, потому что примерно половина реализаций кольцевых буфер которые мне доводилось видеть таковыми не являлась, хотя могла работать в большинстве случаев, в итоге авторы грешили на китайские мк и т.д. :)
Что за протокол обмена такой, у которого данные идут непрерывно, в студию его и с примерами применения этого протокола в промышленности, желательно за рубежом. Исключения допускаю есть, но большинство протоколов в промышленности реализовано нормально.

Буфер кольцевой уже есть в DMA - бери и используй если нужна буферизация. Еще один плюс DMA.

Я не убеждаю в безальтернативности, не выдумывайте. Я не согласен с заблуждением которое тут всем втирают, что прием по DMA работает только при заранее известной длине пакета. Все работает с неизвестной длиной, с кольцевым буфером и без. Проблем нет.

Reflector писал(а):
Это как раз пример от случая к случаю работающего буфера... Мельком глянул и сразу нашел 2 типичные ошибки.
Не я писал, ошибки могут быть везде, но то и своя голова на плечах.

В общем не вижу смысла продолжать, для меня плюсы и возможности приема по DMA очевидны, как и другим людям, почитайте выше. На этом и откланяюсь. А вы можете делать унылый побайтный прием как на AVR и дальше, кто ж запретит, флаг вам в руки.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 19 авг 2019, 14:49 
Старожил

Зарегистрирован: 27 мар 2015, 01:22
Сообщения: 2065
Атарасий, вот здесь вот
Атарасий писал(а):
И аппаратно всегда проще и правильнее.

надо было вместо всегда написать иногда и вопросов бы не было )

_________________
mcu.goodboard.ru


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 19 авг 2019, 16:45 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2629
vt340 писал(а):
Атарасий, вот здесь вот
Атарасий писал(а):
И аппаратно всегда проще и правильнее.

надо было вместо всегда написать иногда и вопросов бы не было )

+100

Нахрен ДМА если надо парсить ручной ввод с консоли?


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3517 ]  На страницу Пред.  1 ... 105, 106, 107, 108, 109, 110, 111 ... 141  След.


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB