Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Въпрос за DMA на ST
http://mcu-bg.com/mcu_site/viewtopic.php?f=2&t=8427
Страница 1 от 1

Автор:  mladejat [ Чет Дек 30, 2010 10:34 pm ]
Заглавие:  Въпрос за DMA на ST

Здравейте,
Струва ми се някъде във форума бях срещал, че при контролерите на ST ако е активно DMA за Rx от UART , не работи прекъсването Receiver Time-out. Може би нещо съм се объркал, защото не можах да го намеря пак. Не го открих и на първо ровене в Reference manual за STM32F10x... Обмислям ползването на STM32F103 и ако има нещо такова ми се иска предварително да знам.
Благодаря.

Автор:  Цецо [ Чет Дек 30, 2010 11:31 pm ]
Заглавие: 

А ти къде го видя това прекъсване, щото STM-ките, които аз съм пипал по принцип си нямат такова. Или бъркам?

Автор:  mladejat [ Пет Дек 31, 2010 12:17 am ]
Заглавие: 

Ами аз писах "Струва ми се...бях срещал...", но не го намирам нито във форума нито в Reference manual.
Това "Receiver Time-out" е от SAM7S и го използвах, защото не намерих точен аналог в описанието на ST, освен "Idle line detected", което май не е точно същото.
Може би не зададох добре въпроса за това нека от начало - приемам данни от UART и предварително не знам размера. Сега ползвам прекъсване от DMA ако си напълни текущия буфер или прекъсване от таймаут ако са приети по-малко от размера на буфера данни и източника замлъкне.
Как с STM32 да реализирам тази постановка? Има ли подобен механизъм и ако да - термина който да търся?

Автор:  mladejat [ Пет Дек 31, 2010 1:27 am ]
Заглавие: 

Май нямат такава вградена функция и замазват нещата с Application note AN3109.

Автор:  Цецо [ Пет Дек 31, 2010 2:24 pm ]
Заглавие: 

Ахъ. Нямат. Естествено това не е недомислица в проектирането, а "особенност" :). Но те така си я влачат още от STR9 тая периферия, ако се не лъжа. Иначе UART-а им има какви ли не безполезни чудесии. Но нещо толкоз елементарно - няма. Тъпотия.

Както и да е. Имаше различни подходи да я заобиколиш. Idle line със сигурност не е решение, поне на мен никога не ми е вършило работа. Според зависи от скоростта на данните и през колко време имаш фреймове може да правиш разни еквилибристики.

Един прост вариант който все се каня да изпробвам (и все не стигам до него) е да пусне DMA-то в кръгов режим. После навиваш един таймер за някакво време (съобразено с това какви фреймове и колко дълги очакваш да получиш). И в прекъсването на тоя таймер изваждаш каквото се е събрало в DMA-то и го предаваш на основния процес да си го дъвче. За ниски до средни скорости (115200) би трябвало да върши работа.

Автор:  mladejat [ Пет Дек 31, 2010 2:40 pm ]
Заглавие: 

Благодаря за идеята. Ако го докарам до употреба на ST ще имам едно на ум за този вариант.
Весело посрещане на Новата година на всички.

Автор:  miro_atc [ Пет Дек 31, 2010 5:11 pm ]
Заглавие: 

Явно е заразно... при луминари го има същия проблем, receive timeout се получава само ако определен брой клокове след получаване на последния байт не се получи нов и стария си стои неизчетен. При пуснато ДМА обаче всичко се изчита моментално и така таймоут не може да се получи.

При атмел таймоути има само при USART, т.е. DBGU-то на 7-ците и простите UART-и на SAM3 нямат.

В случаите когато няма хардуерен аз си правя софтуерен, който през 1mS проверява и сигнализира. Полирането изглежда като овърхед, но всъщност като CPU usage е от порядъка на 0.01% - 0.1% като в това включвам и проверките за таймоутите на нишките на RTOS-а. Тъй че проблемът не е толкова голям, колкото изглежда. Ех, все пак минималния таймоут е 2-3mS (ако се полира през 1ms), но в общия случай това е повече от достатъчно.

Автор:  Цецо [ Нед Яну 02, 2011 3:13 pm ]
Заглавие: 

Е да бе, то не чак такъв проблем. Но дразни мама му стара, щото това са елементарни неща....

От друга страна, то по добре това отколкото.....

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/