Код красивый, но непонятный в хлам, как я его запущу, когда половина не объявленных типов переменных и функций? Могу только смысл понять, что память 32 битный буфер, порт как 8 бит, сейчас проверю. Наконец то!Reflector писал(а):Я перебрал кучу настроек, всегда получается 4 такта кроме случаев, когда размер источника в 2 раза больше, т.е., например, читаешь из порта 16 бит, а пишешь по 8, но тогда выходит 8 тактов, а не 6. С разной скоростью DMA тоже не должен работать, если не считать лаги. VGA либа, на которую я ссылался, выдает 800x600, там скорость вывода пикселей ровно 40MHz, а скорость проца - 160MHz.GFX писал(а): У меня работает за 6, это точно и это факт, почему у вас за 4 не знаю, я проверю DMA1 может оно быстрее. Код выложите свой сравню. ДМА может работать с разной скоростью, нужно понять просто, как выжать максимальную.
Код практически такой-же, как и на F103:Спойлер
Код: Выделить всё
ch1.initMemToMem((void*)&GPIOA->IDR, DmaDataSize::_8bits, false, data, DmaDataSize::_32bits, true, 3584, DmaPriority::VeryHigh, 1); void initMemToMem(void* srcAddr, DmaDataSize srcSize, bool srcInc, void* dstAddr, DmaDataSize dstSize, bool dstInc, uint16_t bufSize, DmaPriority prio, uint32_t channel, bool circular = false, bool doubleBuffer = false) { _assert_(dma == DMA2); disableConfirmed(); dma->LISR = dma->HISR = 0; memorySrcAddr(uint32_t(srcAddr)); memoryDstAddr(uint32_t(dstAddr)); bufferSize(bufSize); stream->CR = (doubleBuffer << 18) | uint32_t(DmaDir::MemToMem) | uint32_t(prio) | (uint32_t(srcSize) << 11) | (uint32_t(dstSize) << 13) | (circular << 8) | (srcInc << 9) | (dstInc << 10) | (channel << 25); }
- Вложения
-
- Скриншот 2016-09-03 11.15.35.png
- (64.93 КБ) 684 скачивания


