реклама на сайте
подробности

 
 
> STM32f103, залипание приеимника USART1
klen
сообщение Dec 18 2010, 16:08
Сообщение #1


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



Всем привет. сейчас со мной произошел такой казус которым не могу не поделится.
написал код которыей ведет обмен по USART - по полингу, все работает, хорошо! едем дальше - перекладываю это все на DMA - прием работает, передача работает только один раз - сделал костыль, сказал что передача также как и прием циркулярная и в перрывании по окончании передачи из озу уарт запрещаю работу канала DMA, при наличии свежего буфера вклчаю канал и DMA начинает перекидывать данные в uart - заработало! хорошо! ...упс почемуто прием перестал работь... ведь ниче не делал..... потрати 2 часа с перерывами на обдумывание смыла бытия ... неработает, весь код перелопатил... передача работает прием нет (это по отладчику я смотрел)... достал осцилограф, байты идут. вывод - передача физически рабьотает, что с приемником UART? возвращаю прием на код по полингу - неработает.. да чтож такое то??? внутренне чутью подсказало включить и выключиь девайс - все заработало! если б не передернул питане то наверно до утра можнобылобы боротся с приемником уарта. шайтан байран.

вот так.


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

теперь еще непонятно. размер регистра USART->DR имеет вид полуслова, как правильно из байтового массива с помощью DMA в него писать, вернее он пишется правильно но в одном месте прочитал чтто по DMA можно и по четыре байта пересылать - тогда такты системной шины экономятся. че тут реально происходит и как лучше и правильнее.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
Serj78
сообщение Dec 18 2010, 17:08
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 966
Регистрация: 27-05-06
Из: СПб
Пользователь №: 17 499



Прямо по теме не скажу, но один раз под отладчиком у меня проц повис sad.gif, вышел выходом из отладчика, повторить не удалось. Также столкнулся с невозможностью посмотреть данные USART из отладчика. ( Компилятор Keil 4.12)
И самое важное- весь реалтайм под отладчиком свихивается, но наверно, вы и сами это знаете (требуется время на обработку команд отладчика).
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Dec 19 2010, 16:30
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(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-ти битные полуслова, к примеру), то зачем тратить память на массив из слов, если в таковых только байт и используется?Или имеется что другое в виду?
Go to the top of the page
 
+Quote Post
Fktrctq
сообщение Dec 19 2010, 17:07
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 38
Регистрация: 10-11-05
Из: Таганрог
Пользователь №: 10 659



По поводу включить/выключить. Сталкивался с подобной ситуацией, то-ли при программировании SPI, то-ли того же самого UART. Подозреваю, все дело в том, что когда происходит перекомпиляция ПО и его последующая прошивка в МК, то сброса как такового, не происходит, т.е. содержимое регистров и ОЗУ сохраняется (я это проверял на не инициализируемых массивах). Таким образом, если для настройки периферии (т.е. установки битов в регистрах) Вы используете операцию лог. ИЛИ, предполагая, что изначально все регистры имеют нулевое значение - то это как раз и может привести в описанный Вами ситуации. Возможное решение: перед настройкой регистров UART - предварительно их обнулить.


--------------------
Вы пробовали выключить и снова включить?
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Dec 19 2010, 18:18
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Присоединяюсь к Fktrctg по поводу обнуления регистров периферии перед инициализацией. Для того и есть функции DeInit в библиотеке.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 22:16
Рейтинг@Mail.ru


Страница сгенерированна за 0.01385 секунд с 7
ELECTRONIX ©2004-2016