Управление портом DMA

Racemaniac
Пт 22 апреля 2016 г., 18:55
Просто маленький мозг, который я хотел опубликовать здесь :). Я хотел посмотреть, как быстро DMA может управлять портами, поэтому я настроил память DMA на передачу памяти в регистр GPIO BSRR. Результатом является переключение PIN 11 при почти 4 МГц, но вы можете управлять всем портом (все 16 контактов) на этой скорости с переносом :).
Мне было интересно о быстрых способах вывода параллельных данных, и попробовал это :).
#include uint32_t toggle[1000]; void setup() { pinMode(11, OUTPUT); pinMode(33, OUTPUT); pinMode(32, INPUT); for(int i = 0; i < 1000; i++) toggle[i] = i%2 ? 0x00010000 : 0x00000001; while(!digitalRead(32)); //it waits until you press the maple mini button dmaTransfer(toggle, (uint32_t*)&GPIOA->regs->BSRR, 1000); } void loop() { } void dmaTransfer(uint32_t* from, uint32_t* to, uint32_t dataLength) { dma_init(DMA1); dma_setup_transfer(DMA1, DMA_CH1, from, DMA_SIZE_32BITS, to, DMA_SIZE_32BITS, DMA_PINC_MODE | DMA_MEM_2_MEM); dma_set_num_transfers(DMA1, DMA_CH1, dataLength); dma_enable(DMA1, DMA_CH1); }

Мадиас
Пт 22 апреля 2016 г., 19:29
Был бы интересным проектом по созданию 16-битного параллельного дисплеев, управляемого портом DMA. Но я предполагаю, что на рынке дешевого рынка нет 16-битных дисплеев, которые поддерживают 4 МГц :)
Но вы можете построить 16-битный разделитель резисторного разделителя с такой скоростью, что вы не получите точные 16-битные с сетью разделителей резисторов в доме.

Werecatf
Пт 22 апреля 2016 г., 19:41
Мадиас написал:Был бы интересным проектом по созданию 16-битного параллельного дисплеев, управляемого портом DMA. Но я предполагаю, что на рынке дешевого рынка нет 16-битных дисплеев, которые поддерживают 4 МГц :)

Мадиас
Пт 22 апреля 2016 г., 8:46 вечера
WereCatf написал: ILI9341-это дешево, и он поддерживает 16-битный параллельный интерфейс, но я не знаю, как на самом деле управлять одним или чем-то еще.

Werecatf
Пт 22 апреля 2016 г., 21:21
Мадиас написал:Но я не вижу «реального применения» для супер высокоскоростной TFT на STMF1.

Martinayotte
Пт 22 апреля 2016 г., 21:37
Просто потому, что именно процессор знает, что нарисовать.
Наличие некоторого DMA для передачи чего -либо означает, что данные поступают из кадровую буфер:
Давайте говорит, что экран 320x480 с RGB24 = 460K ОЗУ.

Werecatf
Пт 22 апреля 2016 г., 22:12
Martinayotte написал:Просто потому, что именно процессор знает, что нарисовать.
Наличие некоторого DMA для передачи чего -либо означает, что данные поступают из кадровую буфер:
Давайте говорит, что экран 320x480 с RGB24 = 460K ОЗУ.

Mrburnette
Пт 22 апреля 2016 г., 11:05 вечера
WereCatf написал: <...>
Я думаю, вы упустили дело: я просто говорил, что вам не всегда нужна практическая причина, чтобы сделать что -то просто для удовольствия, вы знаете..

Martinayotte
Сб 23 апреля 2016 г. 1:10
Допустим, есть случай, что DMA может быть полезным и что в каком -то другом случае это совершенно бесполезно !
В случае ЖК -дисплея он совершенно бесполезен, если только не привязана к какой -то большей системе, такой малиновой PI и аналогично, где вы можете легко посвятить каркас 512 КБ или 1 МБ, в противном случае это было бы бесполезно ...

Конечно, в приложении, как неопиксель, DMA вполне подходит: маленький буфер, который необходимо отправлять снова и снова.

Это тот же сценарий, который я сделал 25 лет назад: отправка потока DMX512 над RS485 на 250 КБ снова и снова с использованием MC68302 с DMA на сериале.

Не пытайтесь использовать DMA, чтобы просто сделать светодиод, мигающий ... : ugeek:

Rogerclark
Сб 23 апреля 2016 г. 1:21
Я кратко посмотрел на Teensy Lib для ILI9341 и я думаю, что он использует 2 буфера линии

Таким образом, он заполняет один буфер линии, в то время как другой

Тем не менее, это дает преимущество только тогда, когда вы выполняете то, что вы можете эффективно выполнять линию по линии.

Я не слишком уверен, при каких обстоятельствах линейная рендеринг на самом деле дает лучшую производительность. Возможно, текст растрового изображения, где шрифт может быть линией доступа по линии.
И, конечно же.

Но я не думал, что стоило того, чтобы переносить код подростков в течение количества времени и усилий, которые он собирался принять.


Мне все еще нравится идея использования обратного вызова DMA и думаю, что это должно быть вариантом в функциях SPI DMA, но, возможно, вряд ли кто -то его использует.

Martinayotte
Сб 23 апреля 2016 г. 1:38 утра
Конечно, SPI DMA может быть полезен, как я упоминал, как Neopixel, DMX512 или любой потоковой тип вещей.

Для ЖК -дисплея, я все еще убеждаю, что это довольно бесполезно, даже уменьшая область рамки кадра, потому что, если вам придется делать DrawCircle () с почти заполнением экрана, ЦП придется ждать, вероятно, 10+ раз, что DMA закончил раньше инициализируйте следующую передачу DMA, пока весь DrawCircle () ... : ugeek:

Racemaniac
Сб 23 апреля 2016 г. 8:46 утра
Вы можете DMA из некоторого внешнего источника памяти до регистров порта, чтобы нарисовать экран, но это становится сложным XD

Стевех
Сб 23 апреля 2016 г., 11:33
Martinayotte написал: ...ЦП придется подождать, вероятно, 10+ раз, что DMA закончил, прежде чем инициализировать следующую передачу DMA, пока весь DrawCircle () ... : ugeek:

Регулировка для RTC Drift