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