Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Re: Карманный осциллограф на STM32

Сб сен 03, 2016 10:15:37

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);
}
Код красивый, но непонятный в хлам, как я его запущу, когда половина не объявленных типов переменных и функций? Могу только смысл понять, что память 32 битный буфер, порт как 8 бит, сейчас проверю. Наконец то! :beer: А говорили ДМА не может с разной скоростью работать! Но работает же теперь 4 такта, правда не знаю корректно ли массив заполнился и в нем данные как распределены из 32 бит всего 8 занято?... не порядок мягко говоря. Нет наоборот из массива в 4000 занято только 1000, но полностью, тогда наоборот отлично, что я могу сказать. Пойду на f103 проверю этот интересный факт. Проверил, он так не может, у него нет FIFO буфера или просто архитектура такая, ему все равно на размерность источника и буфера, 9 тактов и выравнивать он не может, если источник 8 бит, а буфер 32 он пишет только в младшие и все, потому и прироста в скорости нет.
Вложения
Скриншот 2016-09-03 11.15.35.png
(64.93 KiB) Скачиваний: 630
Последний раз редактировалось GFX Сб сен 03, 2016 10:48:17, всего редактировалось 2 раз(а).

Re: Карманный осциллограф на STM32

Сб сен 03, 2016 10:15:53

GFX писал(а): Да и перечитайте, что вы написали, там не о 4 тактах говорится "with the exception of the
bus access phase.", т.е. доступ к шине может быть больше а на сколько не указано, это от загрузки шины зависит видимо, ну оно так и есть стоит два ДМА запустить их скорость падает.

А что вам не нравится? Да и писал не я, а Мартин. Хотите ДМА-трансфер быстрее чем вручную? Не дождётесь! Почему? Мартин написал почему. Где-то этот расклад встречал и в официальных доках СТМ, но не могу вспомнить где. Максимальная скорость ДМА это м2м, выше уже не бывает и быть не может. Для р2м латентность будет на пару тактов больше. При выводе р2м в порт из ОЗУ латентность для Ф0 - 6 тактов, для Ф1хх - 11 тактов. Для Ф4 не пробовал. Не думаю, что при чтении с порта в ОЗУ что-то радикально подвинется в цифрах.
Последний раз редактировалось scorpi_0n Сб сен 03, 2016 10:19:02, всего редактировалось 1 раз.

Re: Карманный осциллограф на STM32

Сб сен 03, 2016 10:17:31

scorpi_0n писал(а):
GFX писал(а): Да и перечитайте, что вы написали, там не о 4 тактах говорится "with the exception of the
bus access phase.", т.е. доступ к шине может быть больше а на сколько не указано, это от загрузки шины зависит видимо, ну оно так и есть стоит два ДМА запустить их скорость падает.

А что вам не нравится? Да и писал не я, а Мартин. Хотите ДМА-трансфер быстрее чем вручную? Не дождётесь! Почему?
Ну выше я уже дождался) Подход к ДМА нужно было найти, ему не нравится сохранять в меньшую размерность, чем 32 бита просто.

Re: Карманный осциллограф на STM32

Сб сен 03, 2016 10:51:03

На текущий момент выяснено ДМА:
1. у stm32f0xx ?
2. у stm32f1xx 9 тактов на мем то мем, точно, как не меняй битность источника и приемника
3. у stm32f3xx ?
4. у stm32f4xx 4 такта на мем то мем, если источник меньше буфера 8 бит и 32 бита, 6 тактов на мем то мем, если источник равен буферу=8 бит, другие комбинации не проверял, этих достаточно.

Программное чтение:
1. у stm32f0xx ?
2. у stm32f1xx 6 тактов, точно
3. у stm32f3xx ?
4. у stm32f4xx 4 такта, точно

Re: Карманный осциллограф на STM32

Сб сен 03, 2016 11:10:32

GFX писал(а):Код красивый, но непонятный в хлам, как я его запущу, когда половина не объявленных типов переменных и функций? Могу только смысл понять, что память 32 битный буфер, порт как 8 бит, сейчас проверю.

По-моему, и так понятно, что делает функция memorySrcAddr или что значит переменная srcInc, тем более понятно, что означает DmaDataSize::_8bits. При желании уж точно можно разобраться :)

Наконец то! :beer: А говорили ДМА не может с разной скоростью работать! Но работает же теперь 4 такта, правда не знаю корректно ли массив заполнился и в нем данные как распределены из 32 бит всего 8 занято... не порядок мягко говоря.

В том и дело, что у меня это не имеет значения. 8->8, 8->16, 8->32, 16->16 - во всех этих случаях получается 4 такта. Кроме того 8->8 и 8->32 визуально выглядят идентично, 8->32 я выбрал, т.к. это дает только 1 Memory transfer, а не 4. В даташите есть таблица на все варианты. Обрати внимание, что в этом плане DMA для F1 и F4 отличаются, на F1 "лишние" байты отбрасываются...

Re: Карманный осциллограф на STM32

Сб сен 03, 2016 14:08:14

Reflector писал(а):В том и дело, что у меня это не имеет значения. 8->8, 8->16, 8->32, 16->16 - во всех этих случаях получается 4 такта. Кроме того 8->8 и 8->32 визуально выглядят идентично, 8->32 я выбрал, т.к. это дает только 1 Memory transfer, а не 4. В даташите есть таблица на все варианты. Обрати внимание, что в этом плане DMA для F1 и F4 отличаются, на F1 "лишние" байты отбрасываются...
Ну работает 4 такта и ладно, почему у вас и в 8->8 работает быстрее не знаю, но это и не важно, не вижу разницы, в память трамбуется хорошо, не отбрасывает, а именно трамбует. Кстати, когда речь идет о даташите, не плохо указывать страницу :wink:

Re: Карманный осциллограф на STM32

Сб сен 03, 2016 15:51:03

GFX писал(а):
Andrew Martin писал(а):Очень полезная информация. А главное ни в одном даташите нет этих данных. Стесняются своего DMA что ли? :)
Однако на F0 получается забирать за 5 тактов

Код:
ldrb   r0,[r1]         ;2
strb   r0,[r2]         ;2
adds  r2,1            ;1


И это на ядре М0. А у вас МК на ядре М3 и 6 тактов? Плохая сосиска :dont_know:
И размер... при 4000 семплов длина сосиски будет 4000*6 = 24 000 байт.
Вы изменяете скорость количеством команд? не смешите, дайте реальную скорость своего кода посчитанную как-то желательно на логическом анализаторе. "4000*6 = 24 000 байт" кто вам сказал такое? что это за расчет? просто ни в какие ворота он не годится, смешно просто. подсказка каждая команда не весит 1 байт, вторая подсказка, не каждая команда выполняется за 1 такт. И смех и грех.
мой код, кстати, лучше вашего, сосиска не плоха.
Код:
 LDR      r2,[r1,#0x00]
 STRB    r2,[r0,#0x07]
Вот только выполняются эти две команды по 3 такта и это есть в описании этих команд, вернее в описании 3 задержки в каждой команде, чему они равны хз, ну судя по всему по 1 такту а там ХЗ, но по факты вместе они 6 тактов занимают


Да, я измеряю скорость количеством команд, на F0 при тактовых частотах до 24МГц имею полное право так делать. Выше 24МГц уже латентность флеша добавляет. Но при умеренном размере кода можно его впихнуть в RAM и запускать оттуда.
Каждая команда ldr/str выполняется за 2 такта, а adds - за 1 такт, как и написано в соответствующем Technical Reference Manual к ядру М0. Итого 5 тактов на выборку.

Что за расчет? Каждая из команд занимает по 2 байта. Это конечно на самой простой и быстрой сосиске. На более низких скоростях уже можно организовать цикл.
На ядре М0 лучше не сделаешь - нет постинкремента адреса. Вернее, он есть, но только для 32-битного слова (ldm/stm).
Вот этот код
Код:
ldrb   r0,[r1]         ;2
stm   r2!,{r0}        ;2

будет выполняться за 4 такта (до 24МГц), но будет класть в буфер сразу по одному 32-битному слову.

Это чем-то перекликается с вашим
GFX писал(а):ему не нравится сохранять в меньшую размерность, чем 32 бита просто.

хотя причины очевидно иные.

А адресация с Immediate offset на ядре М0 поддерживает только 32 байта.
Последний раз редактировалось Andrew Martin Сб сен 03, 2016 17:54:57, всего редактировалось 2 раз(а).

Re: Карманный осциллограф на STM32

Сб сен 03, 2016 16:46:42

Andrew Martin писал(а):Да, я измеряю скорость количеством команд, на F0 при тактовых частотах до 24МГц имею полное право так делать. Выше 24МГц уже латентность флеша добавляет. Но при умеренном размере кода можно его впихнуть в RAM и запускать оттуда.
Каждая команда ldr/str выполняется за 2 такта, а adds - за 1 такт, как и написано в соответствующем Technical Reference Manual к ядру М0. Итого 5 тактов на выборку.

Для F0 может так и есть, но для F1 и выше такое уже не работает, там LDR и STR пайплайнятся с кучей оговорок.

Re: Карманный осциллограф на STM32

Сб сен 03, 2016 21:00:34

Andrew Martin писал(а):Да, я измеряю скорость количеством команд, на F0 при тактовых частотах до 24МГц имею полное право так делать. Выше 24МГц уже латентность флеша добавляет. Но при умеренном размере кода можно его впихнуть в RAM и запускать оттуда.

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

Re: Карманный осциллограф на STM32

Сб сен 03, 2016 23:23:03

Reflector писал(а):
GFX писал(а):Вот это интересно, т.е. программу собираем для мк STM32F103СB, чтобы ошибки по памяти не было, а потом тупо пытаемся залить в МК с заявленными 64 кбайтами 128? Где можно об этом почитать, выглядит загадочно :shock:

В документации есть глава "Device overview", там все подвиды мк сведены в таблицу и сгруппированы в том числе по объему флеша и RAM. Например, у меня есть F103VC, в таблице он в одной группе с 103VD и 103VE, в таком случае обычно(может и всегда) все эти 3 мк есть 103VE, т.е. самый старший из них. Реально у 103VC в 2 раза больше флеша и на четверть больше RAM. F103C8 в таблице рядом с F103CB и они оба F103CB. F407VE рядом с F407VG и они оба VG. Так под F407VG прогу и собираем, главное подобрать правильные настройки программатора или его самого, иначе придется шить отдельной утилитой, что не так удобно. Еще есть и более экзотические варианты, у того же F030 не только в 2 раза больше памяти, но еще есть 32-ти битный таймер и по сути он F031. У F101 есть USB и т.д. :)
Ну что, запихал без проблем прямо в Кейле 71к в STM32f103C8, я в шоке, подарочек STM сделала, мало того, что на 128МГц работает без видимых проблем (ну юсб не заработает конечно), так еще и памяти в два раза больше. Спасибо за наводку :beer: F407VE тоже есть, но там итак много памяти, пока не знаю, как ее потратить даже, но все равно приятно, что ее там в два раза больше, чем дофига :))

Re: Карманный осциллограф на STM32

Сб сен 03, 2016 23:46:35

GFX писал(а):мало того, что на 128МГц работает без видимых проблем

F0 и F1 гонятся в 2 раза, по крайней мере мне пока других не попадалось.

Re: Карманный осциллограф на STM32

Вс сен 04, 2016 04:29:03

Заинтересовался проектом,заказал у китайцев микроконтроллеры и дисплей.МК уже пришли-вместо STM32F103C8T6 узкопленочный выслал STM32F103ZET6(корпус 144pin).Открыл спор на алиэкспресс,но не уверен что выиграю.Возможно применение такого МК в данной схеме?Разумеется,с изменением разводки печатки.

Re: Карманный осциллограф на STM32

Вс сен 04, 2016 10:02:41

ссылочку на дисплей дадите?
этот пойдет?тут вроде выводы не так 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

Re: Карманный осциллограф на STM32

Вс сен 04, 2016 10:25:43

molotok26 писал(а):Заинтересовался проектом,заказал у китайцев микроконтроллеры и дисплей.МК уже пришли-вместо STM32F103C8T6 узкопленочный выслал STM32F103ZET6(корпус 144pin).Открыл спор на алиэкспресс,но не уверен что выиграю.Возможно применение такого МК в данной схеме?Разумеется,с изменением разводки печатки.
Вы шутите? Радоваться нужно. Конечно применим, пин ту пут если поставите то и работать будет также, зато куча свободных ног и памяти в придачу, но проще купить еще один тот, что нужен, дешевый. А этот припасти на черный день)

Re: Карманный осциллограф на STM32

Вс сен 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

Да пойдет, лишние выводы откусите или выпаяете, это под сенсор, которого там нет (пустое место под микросхему и на экране его нет)

Re: Карманный осциллограф на STM32

Пн сен 05, 2016 17:42:27

Обучил ослик скриншотам, по долгому удержанию кнопки энкодера. Скрины в формате BMP, пережал для радиокота, он никак не научится нормально картинки загружать.
Вложения
027.png
(4.26 KiB) Скачиваний: 1088

Re: Карманный осциллограф на STM32

Пн сен 05, 2016 21:03:44

GFX писал(а):Обучил ослик скриншотам, по долгому удержанию кнопки энкодера. Скрины в формате BMP


Картинки - пустая трата памяти. Хоть сырые, хоть пожатые.
Лучше разработайте свой, бинарный формат данных, в котором бы хранились и данные, и настройки осциллографа, при которых эти данные сняты.
А потом можно написать софтину для анализа этой мути на ПК. Если конечно нужно.

Re: Карманный осциллограф на STM32

Вт сен 06, 2016 00:25:01

Andrew Martin писал(а):
GFX писал(а):Обучил ослик скриншотам, по долгому удержанию кнопки энкодера. Скрины в формате BMP


Картинки - пустая трата памяти. Хоть сырые, хоть пожатые.
Лучше разработайте свой, бинарный формат данных, в котором бы хранились и данные, и настройки осциллографа, при которых эти данные сняты.
А потом можно написать софтину для анализа этой мути на ПК. Если конечно нужно.
Ну можно и так сделать, правда мне лень, убил я итак много времени на этого ослика. Картинки все равно нужны. Увидел что-то, не нужно телефон искать, да и качество получше. Скрин всегда нужная штука, а памяти на флешке не жалко, что там 240 кбайт. Починил, кстати, а то двоилось изображение.
091.png
(3.76 KiB) Скачиваний: 807
Радиокот все равно добивает файлы, даже мелкие...

Re: Карманный осциллограф на STM32

Вт сен 06, 2016 12:47:41

1. у stm32f0xx ?
5 тактов, программно или ДМА - без разницы

Re: Карманный осциллограф на STM32

Чт сен 08, 2016 00:23:02

Кто собирался собирать устройство, вы не спешите, комплектующие можете заказать, но плату не травите, я уже говорил, но повторяюсь на всякий случай, 7660 не заказывайте. Плата будет меняться и схема тоже.
Ответить