| Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
STM32 USART+прерывания
17.02.2012, 14:57
|
|
|
Прописка
Регистрация: 10.09.2010
Сообщений: 113
Сказал спасибо: 31
Сказали Спасибо 27 раз(а) в 27 сообщении(ях)
|
Re: STM32 USART+прерывания
А зачем массив отправлять побайтово вообще?? Не проще ли будет отправить его с помощью прямого доступа к памяти (DMA). Я правда на STM32 еще не пробовал, но работая с AT91SAM7 использовал неоднократно. Кинул адрес первого байта и длину, больше никаких хлопот, само уедет непрерывным потоком. Чтобы не быть пустозвоном, дам ссылочку, ребята используют ПДП и USART в STM32 для других целей, но думаю всем будет интересно. А прерывание можно взвести уже по окончанию всей передачи.
Последний раз редактировалось dadigor; 17.02.2012 в 15:00.
|
|
|
|
17.02.2012, 20:11
|
|
|
Гражданин KAZUS.RUN
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
|
Re: STM32 USART+прерывания
dadigor DMA на UART это шарообразный конь в вакууме. Реально на железе должно быть квитирование, а оно практически нигде нормально не реализовано = побайтная отправка.
PS для поделок а-ля "морг-морг диодом" можно и без квитирования
|
|
|
|
19.02.2012, 17:39
|
|
|
Частый гость
Регистрация: 22.04.2007
Сообщений: 26
Сказал спасибо: 10
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Re: STM32 USART+прерывания
Сообщение от Hives
|
|
Реально на железе должно быть квитирование, а оно практически нигде нормально не реализовано = побайтная отправка.
|
Что такое квитирование?
|
|
|
|
19.02.2012, 18:35
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
|
Re: STM32 USART+прерывания
Сообщение от Nik_UFO
|
|
Что такое квитирование?
|
Подтверждение доставки. Приемник сообщает передатчику - принял, давай исчо..
|
|
|
|
20.02.2012, 11:43
|
|
|
Прописка
Регистрация: 10.09.2010
Сообщений: 113
Сказал спасибо: 31
Сказали Спасибо 27 раз(а) в 27 сообщении(ях)
|
Re: STM32 USART+прерывания
Сообщение от Hives
|
dadigor DMA на UART это шарообразный конь в вакууме. Реально на железе должно быть квитирование, а оно практически нигде нормально не реализовано = побайтная отправка.
PS для поделок а-ля "морг-морг диодом" можно и без квитирования
|
Я бы не был так категоричен... хотя здесь, на форуме, для многих это как бы норма общения... Шарообразного коня в вакууме (DMA) придумали далеко не глупые люди для далеко не глупых людей, другое дело, что не все его используют - кто-то по незнанию, кто-то по отсутствию необходимости, а кто-то и по чисто религиозным причинам.
Реально на железе квитирование в моих приложениях я привык получать от приемника на другом конце линии - это подтверждение не только правильного ухода сообщения, но и его правильного приема на том конце, что для меня не менее важно. А сами сообщения в моих "поделках а ля морг-морг диодом" как правило имеют контрольную сумму в конце - для проверки приемником правильности приема. Если контрольная сумма не сойдется - приемник "не вправе" доверять такому сообщению и пошлет сообщение об ошибке приема. А вот когда от приемника не приходят ни сообщение об ошибке, ни квитанция, процессор передающей стороны может заняться вопросом, уходит ли само сообщение от передатчика, не закорочена ли линия, в общем тем, что вы сочтете нужным делать в такой ситуации.
Для меня DMA - это просто переход на другой уровень работы с процессором, развязывающий процу "руки" для других насущных задач и не обременяющий его прерываниями по каждому уходящему байту.
Хотя не спорю с тем, что в некоторых приложениях нужен и Ваш подход.
и какой подход правильнее в каждом конкретном случае - зависит от поставленной перед разработчиком задачи.
В конце-концов я же не навязываю DMA, я просто спросил у автора топика, зачем массив отправлять побайтово, если есть другая возможность - используя DMA. А решать - ему.
Последний раз редактировалось dadigor; 20.02.2012 в 13:06.
|
|
|
|
Сказали "Спасибо" dadigor
|
|
|
20.02.2012, 20:39
|
|
|
Гражданин KAZUS.RUN
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
|
Re: STM32 USART+прерывания
все красиво и чудесно в теории. ну или в конкретно вашем случае.
однако при таком подходе часто пакет даже до PHY не дойдет, а DMA отмашет "все чудесно, все в порядке". гадости в деталях
|
|
|
|
24.02.2012, 23:22
|
|
|
Прописка
Регистрация: 10.09.2010
Сообщений: 113
Сказал спасибо: 31
Сказали Спасибо 27 раз(а) в 27 сообщении(ях)
|
Re: STM32 USART+прерывания
Сообщение от Hives
|
все красиво и чудесно в теории. ну или в конкретно вашем случае.
однако при таком подходе часто пакет даже до PHY не дойдет, а DMA отмашет "все чудесно, все в порядке". гадости в деталях
|
Мне это интересно, вполне серьезно. Что в этом случае происходит? По каким причинам "ПРИ ТАКОМ ПОДХОДЕ ЧАСТО пакет даже до PHY не дойдет"?
В чем тут бывают причины не "дохождения" пакета при передаче именно с DMA ?
Я ведь просто подсказал, как просто осуществить неразрывную передачу пакета (цитирую проблему автора: "Хочу отправить массив байт... ...но 1-ый байт приходит сразу а остальные с некоторой задержкой." , я так понимаю, что это случай, когда максимально допустимый разрыв между концом стопа предыдущего байта и началом старта последующего должен быть существенно меньше времени передачи одного бита - для того, чтобы приемная сторона его не замечала и принимала пакет целиком - как один пакет.
Но Вы меня насторожили! Какие тут при передаче подводные камни, если не считать отказы выходного драйвера передающей стороны, или скажем КЗ физической линии, или отказа на приемной стороны (а все это обнаруживается отсутствием квитирования от приемника).
Или Вы имеете в виду БЫСТРОЕ (по ходу передачи пакета) обнаружение отказа выходного драйвера или КЗ физической линии при вашем методе? В некоторых приложениях это наверное необходимо, в этих случаях такие условия обговариваются в требованиях к разработке. А вот правильность приема пакета все равно не определить без квитанции от приемной стороны. Или можно, конечно, организовать эхопередачу от той, приемной стороны и контролировать ее, но это уже особый случай быстрого квитирования. Или...
В общем, хочется понять, какие конкретно проблемы могут меня подстерегать при передаче с использованием DMA для USART, которых я смогу избежать при другом методе.Я, конечно, не беру тот случай, когда в программе DMA уже используется для кучи возможных для этого в данном процессоре периферийных модулей одновременно, будем говорить об использовании DMA для одного канала USART. В чем несовершенство этого метода?
|
|
|
|
25.02.2012, 01:28
|
|
|
Гражданин KAZUS.RUN
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
|
Re: STM32 USART+прерывания
чисто как пример - чип от FTDI (Silabs, ets). слева UART, справа USB.
входящий поток от UART от режет на USB пакеты.
что будет, если его буфер засрется и он выставит nWAIT?
правильно - DMA продолжит фигачить данные как ни в чем не бывало = пакет потерян.
|
|
|
|
25.02.2012, 02:50
|
|
|
Заблокирован
Регистрация: 27.03.2007
Сообщений: 1,327
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
|
Re: STM32 USART+прерывания
Сообщение от Hives
|
|
DMA продолжит фигачить данные как ни в чем не бывало
|
Погодите-погодите ... DMA записывает очередной байт в регистр Tx процессора для выдачи наружу, например для передачи в чип FTDI UART/USB, только по запросу, а не сам по себе.
В данном случае с UART: запрос на DMA формируется сигналом TXE, когда регистр передатчика пуст. Ежели внешнее устройство не готово принять байт, то хендшейк сигнал запретит передачу, тот байт застрянет в регистре Tx процессора до лучших времён, и новый очередной сигнал TXE не появится. Таким образом, DMA будет ждать готовности внешнего устройства сколь угодно долго.
По сути дела, если говорить упрощённо, то DMA есть просто железный счётчик адреса памяти, который сдвигается на единичку от какого-либо выбранного сигнала, типа переполнился таймера, или АЦП закончило очередное преобразование, или в приёмник UART поступил новый байт и т.д. И ещё этот прямой доступ к памяти DMA может считать кол-во сделанных шагов и останавливаться, когда все нужные шаги прошёл.
Последний раз редактировалось Yurkin2007; 25.02.2012 в 03:31.
|
|
|
|
25.02.2012, 04:41
|
|
|
Гражданин KAZUS.RUN
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
|
Re: STM32 USART+прерывания
а теперь попробуй красиво реализовать все что ты расписал - с хендшейками, таймаутами и тд 
хотя бы в виде наброска
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 13:20.
|
|