Сб сен 03, 2016 10:15:37
Код красивый, но непонятный в хлам, как я его запущу, когда половина не объявленных типов переменных и функций? Могу только смысл понять, что память 32 битный буфер, порт как 8 бит, сейчас проверю. Наконец то! А говорили ДМА не может с разной скоростью работать! Но работает же теперь 4 такта, правда не знаю корректно ли массив заполнился и в нем данные как распределены из 32 бит всего 8 занято?... не порядок мягко говоря. Нет наоборот из массива в 4000 занято только 1000, но полностью, тогда наоборот отлично, что я могу сказать. Пойду на f103 проверю этот интересный факт. Проверил, он так не может, у него нет FIFO буфера или просто архитектура такая, ему все равно на размерность источника и буфера, 9 тактов и выравнивать он не может, если источник 8 бит, а буфер 32 он пишет только в младшие и все, потому и прироста в скорости нет.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);
}
Сб сен 03, 2016 10:15:53
GFX писал(а): Да и перечитайте, что вы написали, там не о 4 тактах говорится "with the exception of the
bus access phase.", т.е. доступ к шине может быть больше а на сколько не указано, это от загрузки шины зависит видимо, ну оно так и есть стоит два ДМА запустить их скорость падает.
Сб сен 03, 2016 10:17:31
Ну выше я уже дождался) Подход к ДМА нужно было найти, ему не нравится сохранять в меньшую размерность, чем 32 бита просто.scorpi_0n писал(а):GFX писал(а): Да и перечитайте, что вы написали, там не о 4 тактах говорится "with the exception of the
bus access phase.", т.е. доступ к шине может быть больше а на сколько не указано, это от загрузки шины зависит видимо, ну оно так и есть стоит два ДМА запустить их скорость падает.
А что вам не нравится? Да и писал не я, а Мартин. Хотите ДМА-трансфер быстрее чем вручную? Не дождётесь! Почему?
Сб сен 03, 2016 10:51:03
Сб сен 03, 2016 11:10:32
GFX писал(а):Код красивый, но непонятный в хлам, как я его запущу, когда половина не объявленных типов переменных и функций? Могу только смысл понять, что память 32 битный буфер, порт как 8 бит, сейчас проверю.
Наконец то! А говорили ДМА не может с разной скоростью работать! Но работает же теперь 4 такта, правда не знаю корректно ли массив заполнился и в нем данные как распределены из 32 бит всего 8 занято... не порядок мягко говоря.
Сб сен 03, 2016 14:08:14
Ну работает 4 такта и ладно, почему у вас и в 8->8 работает быстрее не знаю, но это и не важно, не вижу разницы, в память трамбуется хорошо, не отбрасывает, а именно трамбует. Кстати, когда речь идет о даташите, не плохо указывать страницуReflector писал(а):В том и дело, что у меня это не имеет значения. 8->8, 8->16, 8->32, 16->16 - во всех этих случаях получается 4 такта. Кроме того 8->8 и 8->32 визуально выглядят идентично, 8->32 я выбрал, т.к. это дает только 1 Memory transfer, а не 4. В даташите есть таблица на все варианты. Обрати внимание, что в этом плане DMA для F1 и F4 отличаются, на F1 "лишние" байты отбрасываются...
Сб сен 03, 2016 15:51:03
GFX писал(а):Вы изменяете скорость количеством команд? не смешите, дайте реальную скорость своего кода посчитанную как-то желательно на логическом анализаторе. "4000*6 = 24 000 байт" кто вам сказал такое? что это за расчет? просто ни в какие ворота он не годится, смешно просто. подсказка каждая команда не весит 1 байт, вторая подсказка, не каждая команда выполняется за 1 такт. И смех и грех.Andrew Martin писал(а):Очень полезная информация. А главное ни в одном даташите нет этих данных. Стесняются своего DMA что ли?
Однако на F0 получается забирать за 5 тактов
- Код:
ldrb r0,[r1] ;2
strb r0,[r2] ;2
adds r2,1 ;1
И это на ядре М0. А у вас МК на ядре М3 и 6 тактов? Плохая сосиска
И размер... при 4000 семплов длина сосиски будет 4000*6 = 24 000 байт.
мой код, кстати, лучше вашего, сосиска не плоха.Вот только выполняются эти две команды по 3 такта и это есть в описании этих команд, вернее в описании 3 задержки в каждой команде, чему они равны хз, ну судя по всему по 1 такту а там ХЗ, но по факты вместе они 6 тактов занимают
- Код:
LDR r2,[r1,#0x00]
STRB r2,[r0,#0x07]
ldrb r0,[r1] ;2
stm r2!,{r0} ;2
GFX писал(а):ему не нравится сохранять в меньшую размерность, чем 32 бита просто.
Сб сен 03, 2016 16:46:42
Andrew Martin писал(а):Да, я измеряю скорость количеством команд, на F0 при тактовых частотах до 24МГц имею полное право так делать. Выше 24МГц уже латентность флеша добавляет. Но при умеренном размере кода можно его впихнуть в RAM и запускать оттуда.
Каждая команда ldr/str выполняется за 2 такта, а adds - за 1 такт, как и написано в соответствующем Technical Reference Manual к ядру М0. Итого 5 тактов на выборку.
Сб сен 03, 2016 21:00:34
Andrew Martin писал(а):Да, я измеряю скорость количеством команд, на F0 при тактовых частотах до 24МГц имею полное право так делать. Выше 24МГц уже латентность флеша добавляет. Но при умеренном размере кода можно его впихнуть в RAM и запускать оттуда.
Сб сен 03, 2016 23:23:03
Ну что, запихал без проблем прямо в Кейле 71к в STM32f103C8, я в шоке, подарочек STM сделала, мало того, что на 128МГц работает без видимых проблем (ну юсб не заработает конечно), так еще и памяти в два раза больше. Спасибо за наводку F407VE тоже есть, но там итак много памяти, пока не знаю, как ее потратить даже, но все равно приятно, что ее там в два раза больше, чем дофигаReflector писал(а):GFX писал(а):Вот это интересно, т.е. программу собираем для мк STM32F103СB, чтобы ошибки по памяти не было, а потом тупо пытаемся залить в МК с заявленными 64 кбайтами 128? Где можно об этом почитать, выглядит загадочно
В документации есть глава "Device overview", там все подвиды мк сведены в таблицу и сгруппированы в том числе по объему флеша и RAM. Например, у меня есть F103VC, в таблице он в одной группе с 103VD и 103VE, в таком случае обычно(может и всегда) все эти 3 мк есть 103VE, т.е. самый старший из них. Реально у 103VC в 2 раза больше флеша и на четверть больше RAM. F103C8 в таблице рядом с F103CB и они оба F103CB. F407VE рядом с F407VG и они оба VG. Так под F407VG прогу и собираем, главное подобрать правильные настройки программатора или его самого, иначе придется шить отдельной утилитой, что не так удобно. Еще есть и более экзотические варианты, у того же F030 не только в 2 раза больше памяти, но еще есть 32-ти битный таймер и по сути он F031. У F101 есть USB и т.д.
Сб сен 03, 2016 23:46:35
GFX писал(а):мало того, что на 128МГц работает без видимых проблем
Вс сен 04, 2016 04:29:03
Вс сен 04, 2016 10:02:41
Вс сен 04, 2016 10:25:43
Вы шутите? Радоваться нужно. Конечно применим, пин ту пут если поставите то и работать будет также, зато куча свободных ног и памяти в придачу, но проще купить еще один тот, что нужен, дешевый. А этот припасти на черный день)molotok26 писал(а):Заинтересовался проектом,заказал у китайцев микроконтроллеры и дисплей.МК уже пришли-вместо STM32F103C8T6 узкопленочный выслал STM32F103ZET6(корпус 144pin).Открыл спор на алиэкспресс,но не уверен что выиграю.Возможно применение такого МК в данной схеме?Разумеется,с изменением разводки печатки.
Вс сен 04, 2016 10:26:48
redram55 писал(а):ссылочку на дисплей дадите?
этот пойдет?тут вроде выводы не так https://ru.aliexpress.com/item/J34-F85-Free-Shipping-2-8-240x320-SPI-TFT-LCD-Serial-Port-Module-PCB-Adapter-Micro/32602444645.html?spm=2114.30010708.3.1.f2dSFv&ws_ab_test=searchweb201556_0,searchweb201602_5_10039_10057_10065_10056_10055_10054_10069_10059_10058_10017_10070_10060_10061_10052_10062_10053_10050_10051,searchweb201603_1&btsid=515ab26c-9e61-488b-ad91-58a48e9cac1e
Пн сен 05, 2016 17:42:27
Пн сен 05, 2016 21:03:44
GFX писал(а):Обучил ослик скриншотам, по долгому удержанию кнопки энкодера. Скрины в формате BMP
Вт сен 06, 2016 00:25:01
Ну можно и так сделать, правда мне лень, убил я итак много времени на этого ослика. Картинки все равно нужны. Увидел что-то, не нужно телефон искать, да и качество получше. Скрин всегда нужная штука, а памяти на флешке не жалко, что там 240 кбайт. Починил, кстати, а то двоилось изображение. Радиокот все равно добивает файлы, даже мелкие...Andrew Martin писал(а):GFX писал(а):Обучил ослик скриншотам, по долгому удержанию кнопки энкодера. Скрины в формате BMP
Картинки - пустая трата памяти. Хоть сырые, хоть пожатые.
Лучше разработайте свой, бинарный формат данных, в котором бы хранились и данные, и настройки осциллографа, при которых эти данные сняты.
А потом можно написать софтину для анализа этой мути на ПК. Если конечно нужно.
Вт сен 06, 2016 12:47:41
5 тактов, программно или ДМА - без разницы1. у stm32f0xx ?
Чт сен 08, 2016 00:23:02