Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32f103
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
klen
Всем привет. сейчас со мной произошел такой казус которым не могу не поделится.
написал код которыей ведет обмен по USART - по полингу, все работает, хорошо! едем дальше - перекладываю это все на DMA - прием работает, передача работает только один раз - сделал костыль, сказал что передача также как и прием циркулярная и в перрывании по окончании передачи из озу уарт запрещаю работу канала DMA, при наличии свежего буфера вклчаю канал и DMA начинает перекидывать данные в uart - заработало! хорошо! ...упс почемуто прием перестал работь... ведь ниче не делал..... потрати 2 часа с перерывами на обдумывание смыла бытия ... неработает, весь код перелопатил... передача работает прием нет (это по отладчику я смотрел)... достал осцилограф, байты идут. вывод - передача физически рабьотает, что с приемником UART? возвращаю прием на код по полингу - неработает.. да чтож такое то??? внутренне чутью подсказало включить и выключиь девайс - все заработало! если б не передернул питане то наверно до утра можнобылобы боротся с приемником уарта. шайтан байран.

вот так.


теперь вопрос по DMA, как каналу DMA сказать чтоб он умел однократно по команде перекачивать данные. если я использую режим DMA_Mode_Normal то он делает предачу в уарт один раз и встает как вкопаный, как ево пнуть чтоб еще раз повторил сее действие.

теперь еще непонятно. размер регистра USART->DR имеет вид полуслова, как правильно из байтового массива с помощью DMA в него писать, вернее он пишется правильно но в одном месте прочитал чтто по DMA можно и по четыре байта пересылать - тогда такты системной шины экономятся. че тут реально происходит и как лучше и правильнее.
Serj78
Прямо по теме не скажу, но один раз под отладчиком у меня проц повис sad.gif, вышел выходом из отладчика, повторить не удалось. Также столкнулся с невозможностью посмотреть данные USART из отладчика. ( Компилятор Keil 4.12)
И самое важное- весь реалтайм под отладчиком свихивается, но наверно, вы и сами это знаете (требуется время на обработку команд отладчика).
KnightIgor
Цитата(Serj78 @ Dec 18 2010, 21:08) *
И самое важное- весь реалтайм под отладчиком свихивается, но наверно, вы и сами это знаете (требуется время на обработку команд отладчика).


Чтобы мне сюда не повторяться, глянь сообщение в другой ветке. Может поможет.


Цитата(klen @ Dec 18 2010, 20:08) *
теперь вопрос по DMA, как каналу DMA сказать чтоб он умел однократно по команде перекачивать данные. если я использую режим DMA_Mode_Normal то он делает предачу в уарт один раз и встает как вкопаный, как ево пнуть чтоб еще раз повторил сее действие.


1. Организовать обработчик прерывания от DMA по окончании передачи (по биту ххх_IT_TCn). Там ЗАПРЕТИТЬ канал DMA.
2. Как только назреет очередная порция, вновь загрузить в канал DMA регистр адрес указателя на источник данных и счетчик и РАЗРЕШИТЬ DMA. Он и рванет по-новой.

В коде у меня это выглядит примерно так (речь у меня об SPI, потому DMA1_IT_TC3, но и в UART работает аналогично):

Код
//обработчик прерывания от готовности DMA

        DMA_ClearITPendingBit(DMA1_IT_TC3);
        DMA_Cmd(SPI_DMA, DISABLE);
...

//конец прерывания
...
//запуск очередной передачи

        SPI_DMA->CMAR  = (uint32_t)src;
        SPI_DMA->CNDTR = cnt;
        DMA_Cmd(SPI_DMA, ENABLE); // понеслась...


Цитата
теперь еще непонятно. размер регистра USART->DR имеет вид полуслова, как правильно из байтового массива с помощью DMA в него писать, вернее он пишется правильно но в одном месте прочитал чтто по DMA можно и по четыре байта пересылать - тогда такты системной шины экономятся. че тут реально происходит и как лучше и правильнее.


Если ты передаешь байты через UART (а не 9-ти битные полуслова, к примеру), то зачем тратить память на массив из слов, если в таковых только байт и используется?Или имеется что другое в виду?
Fktrctq
По поводу включить/выключить. Сталкивался с подобной ситуацией, то-ли при программировании SPI, то-ли того же самого UART. Подозреваю, все дело в том, что когда происходит перекомпиляция ПО и его последующая прошивка в МК, то сброса как такового, не происходит, т.е. содержимое регистров и ОЗУ сохраняется (я это проверял на не инициализируемых массивах). Таким образом, если для настройки периферии (т.е. установки битов в регистрах) Вы используете операцию лог. ИЛИ, предполагая, что изначально все регистры имеют нулевое значение - то это как раз и может привести в описанный Вами ситуации. Возможное решение: перед настройкой регистров UART - предварительно их обнулить.
KnightIgor
Присоединяюсь к Fktrctg по поводу обнуления регистров периферии перед инициализацией. Для того и есть функции DeInit в библиотеке.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.