| Автор |
Съобщение |
|
mladejat
Ранг: Минаващ
Регистриран на: Чет Дек 02, 2010 5:08 pm Мнения: 27 Местоположение: Пловдив
|
 Въпрос за DMA на ST
Здравейте,
Струва ми се някъде във форума бях срещал, че при контролерите на ST ако е активно DMA за Rx от UART , не работи прекъсването Receiver Time-out. Може би нещо съм се объркал, защото не можах да го намеря пак. Не го открих и на първо ровене в Reference manual за STM32F10x... Обмислям ползването на STM32F103 и ако има нещо такова ми се иска предварително да знам.
Благодаря.
|
| Чет Дек 30, 2010 10:34 pm |
|
 |
|
Цецо
Ранг: Форумен бог
Регистриран на: Пон Сеп 27, 2004 9:22 am Мнения: 15501 Местоположение: София
|
А ти къде го видя това прекъсване, щото STM-ките, които аз съм пипал по принцип си нямат такова. Или бъркам?
_________________ "Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.
|
| Чет Дек 30, 2010 11:31 pm |
|
 |
|
mladejat
Ранг: Минаващ
Регистриран на: Чет Дек 02, 2010 5:08 pm Мнения: 27 Местоположение: Пловдив
|
Ами аз писах "Струва ми се...бях срещал...", но не го намирам нито във форума нито в Reference manual.
Това "Receiver Time-out" е от SAM7S и го използвах, защото не намерих точен аналог в описанието на ST, освен "Idle line detected", което май не е точно същото.
Може би не зададох добре въпроса за това нека от начало - приемам данни от UART и предварително не знам размера. Сега ползвам прекъсване от DMA ако си напълни текущия буфер или прекъсване от таймаут ако са приети по-малко от размера на буфера данни и източника замлъкне.
Как с STM32 да реализирам тази постановка? Има ли подобен механизъм и ако да - термина който да търся?
|
| Пет Дек 31, 2010 12:17 am |
|
 |
|
mladejat
Ранг: Минаващ
Регистриран на: Чет Дек 02, 2010 5:08 pm Мнения: 27 Местоположение: Пловдив
|
Май нямат такава вградена функция и замазват нещата с Application note AN3109.
|
| Пет Дек 31, 2010 1:27 am |
|
 |
|
Цецо
Ранг: Форумен бог
Регистриран на: Пон Сеп 27, 2004 9:22 am Мнения: 15501 Местоположение: София
|
Ахъ. Нямат. Естествено това не е недомислица в проектирането, а "особенност"  . Но те така си я влачат още от STR9 тая периферия, ако се не лъжа. Иначе UART-а им има какви ли не безполезни чудесии. Но нещо толкоз елементарно - няма. Тъпотия.
Както и да е. Имаше различни подходи да я заобиколиш. Idle line със сигурност не е решение, поне на мен никога не ми е вършило работа. Според зависи от скоростта на данните и през колко време имаш фреймове може да правиш разни еквилибристики.
Един прост вариант който все се каня да изпробвам (и все не стигам до него) е да пусне DMA-то в кръгов режим. После навиваш един таймер за някакво време (съобразено с това какви фреймове и колко дълги очакваш да получиш). И в прекъсването на тоя таймер изваждаш каквото се е събрало в DMA-то и го предаваш на основния процес да си го дъвче. За ниски до средни скорости (115200) би трябвало да върши работа.
_________________ "Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.
|
| Пет Дек 31, 2010 2:24 pm |
|
 |
|
mladejat
Ранг: Минаващ
Регистриран на: Чет Дек 02, 2010 5:08 pm Мнения: 27 Местоположение: Пловдив
|
Благодаря за идеята. Ако го докарам до употреба на ST ще имам едно на ум за този вариант.
Весело посрещане на Новата година на всички.
|
| Пет Дек 31, 2010 2:40 pm |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11266 Местоположение: Добрич
|
Явно е заразно... при луминари го има същия проблем, receive timeout се получава само ако определен брой клокове след получаване на последния байт не се получи нов и стария си стои неизчетен. При пуснато ДМА обаче всичко се изчита моментално и така таймоут не може да се получи.
При атмел таймоути има само при USART, т.е. DBGU-то на 7-ците и простите UART-и на SAM3 нямат.
В случаите когато няма хардуерен аз си правя софтуерен, който през 1mS проверява и сигнализира. Полирането изглежда като овърхед, но всъщност като CPU usage е от порядъка на 0.01% - 0.1% като в това включвам и проверките за таймоутите на нишките на RTOS-а. Тъй че проблемът не е толкова голям, колкото изглежда. Ех, все пак минималния таймоут е 2-3mS (ако се полира през 1ms), но в общия случай това е повече от достатъчно.
|
| Пет Дек 31, 2010 5:11 pm |
|
 |
|
Цецо
Ранг: Форумен бог
Регистриран на: Пон Сеп 27, 2004 9:22 am Мнения: 15501 Местоположение: София
|
Е да бе, то не чак такъв проблем. Но дразни мама му стара, щото това са елементарни неща....
От друга страна, то по добре това отколкото.....
_________________ "Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.
|
| Нед Яну 02, 2011 3:13 pm |
|
|