Код красивый, но непонятный в хлам, как я его запущу, когда половина не объявленных типов переменных и функций? Могу только смысл понять, что память 32 битный буфер, порт как 8 бит, сейчас проверю. Наконец то!Reflector писал(а):GFX писал(а):У меня работает за 6, это точно и это факт, почему у вас за 4 не знаю, я проверю DMA1 может оно быстрее. Код выложите свой сравню. ДМА может работать с разной скоростью, нужно понять просто, как выжать максимальную.
Я перебрал кучу настроек, всегда получается 4 такта кроме случаев, когда размер источника в 2 раза больше, т.е., например, читаешь из порта 16 бит, а пишешь по 8, но тогда выходит 8 тактов, а не 6. С разной скоростью DMA тоже не должен работать, если не считать лаги. VGA либа, на которую я ссылался, выдает 800x600, там скорость вывода пикселей ровно 40MHz, а скорость проца - 160MHz.
Код практически такой-же, как и на 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);
}
А говорили ДМА не может с разной скоростью работать! Но работает же теперь 4 такта, правда не знаю корректно ли массив заполнился и в нем данные как распределены из 32 бит всего 8 занято?... не порядок мягко говоря. Нет наоборот из массива в 4000 занято только 1000, но полностью, тогда наоборот отлично, что я могу сказать. Пойду на f103 проверю этот интересный факт. Проверил, он так не может, у него нет FIFO буфера или просто архитектура такая, ему все равно на размерность источника и буфера, 9 тактов и выравнивать он не может, если источник 8 бит, а буфер 32 он пишет только в младшие и все, потому и прироста в скорости нет.