Easyelectronics.ru

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

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



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

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

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

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


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

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


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

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

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


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

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


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

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

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


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

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

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

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


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

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

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

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


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

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

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


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

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

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


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

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


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

Зарегистрирован: 26 апр 2019, 00:22
Сообщения: 33
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
Сообщения: 1432
Атарасий писал(а):
vt340 писал(а):
Какого ещё "сообщения"? )
Просто байтики приходят, могут с ошибками, могут с паузами, могут сразу много, могут сразу много с ошибками
Того самого, которое придет по прерыванию IDLE или таймауту и попадет в буфер DMA.

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


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

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


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

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

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


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

Зарегистрирован: 26 апр 2019, 00:22
Сообщения: 33
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
Сообщения: 677
Откуда: 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
Сообщения: 1009
Атарасий писал(а):
Не совсем понял вопрос, канал DMA у меня в конце прерывания выключается и включается, но это делается не с целью перезапуска, а с целью записи в регистр CNDTR количества принимаемых данных, после этой процедуры указатель в буфере DMA установится в 0 позицию

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


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

Зарегистрирован: 26 апр 2019, 00:22
Сообщения: 33
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
Сообщения: 1432
Атарасий писал(а):
Прием по DMA никак не мешает анализировать ваши байтики, включите прерывания на все ошибки

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


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

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

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

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

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


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

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

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

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

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

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


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

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

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


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

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

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

+100

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


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

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


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

Сейчас этот форум просматривают: dosikus_2, Eddy_Em, Katz


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

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

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