GFX писал(а):Провожу на глаз и потом, видишь у меня частоту сигнала определяет, так вот сигнал 300кГц а определяется как 450, я считал из расчета 6 тактов на замер и частота совпадала. Ну и при прямом сравнении сосиськи и ДМА видно что в 1.5 раза разница
Как-то я делал товарищу, который до сих пор сидит на AVR, простенький ЛА на разогнанном в 2 раза F031. Кроме того там был генератор от 1Hz до 48 Mhz, частотомер(висящий на входе ETR), который брал этот диапазон, один аналоговый канал до 4.36MHz и частоту дискретизации можно было менять в широких пределах. Т.к. от ЛА на крохотном экранчике толку мало, то клиент был на C#. И этот девайс показывает, что для F4 получается 4 такта для DMA или асма, а для F0 и F1 - по 5. Хоть точки на графике считай, хоть дрыгай ножкой по окончанию заполнения всего буфера и меряй частоту... Если сомневаешься, что для F4 должно быть 4 такта, можешь почитать
эту серию статей, там парень пытался избавиться(и избавился) от артефактов при работе с VGA. Не может же быть, чтобы у меня правильно показывало 4 такта, но вместо 9 выдавало 5

Кроме того у меня в файлик сохраняются сырые данные и можно посмотреть сколько там точно приходится выборок на период. Например, для максимальной частоты семплирования 96 / 5 = 19.2MHz получаем ровный заборчик 0101 для меандра 9.6MHz.

Для 1MHz уже выходит 9-10 выборок на полупериод, в среднем на период будет 19, как и должно быть.

Более низкие частоты семплирования уже задаются через таймер, там минимум 6 тактов. Лесенка 0101 будет для меандра 8MHz, а для 1MHz в файлике одни 8-ки, т.е. 16 выборок на период.

Так что все видно наглядно, такты посчитаны правильно. Вот только это очень плохо. Я обрадовался, что ДМА может работать с портами ввода-вывода и на тебе, процедура ручного считывания отнимает 30 кбайт памяти, т.е. половину из доступной, лучше я на ней анализатор спектра намучу или сохранение на флешку скриншотов, а тут такая подстава. свободно памяти 2.4 кбайта, это только на исправление косяков можно сказать. Есть код работающий быстрее, только не на ХОЛовский функциях?
У меня все на клаcсах

Код: Выделить всё
Dma1Ch3 ch3;
ch3.initMemToMem((void*)&GPIOA->IDR, DmaDataSize::_8bits, false, data, DmaDataSize::_8bits, true, 3584, DmaPriority::VeryHigh);
ch3.interruptEnable(DmaFlag::TransferComplete);
ch3.enable();
__WFI();
Внутри init помимо установки всяких CPAR/CMAR/CNDTR только для CCR выставляются биты приоритета, размера и инкремента, т.е. ровно то, что туда передается. Потому я и говорил, что тут сложно где-то накосячить, а вот измеряя частоту при помощи ADC ошибиться намного проще.