| Микроконтролери и електроника 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 ] |
| Заглавие: | |
Ахъ. Нямат. Естествено това не е недомислица в проектирането, а "особенност" Както и да е. Имаше различни подходи да я заобиколиш. 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/ |
|