У меня работает за 6, это точно и это факт, почему у вас за 4 не знаю, я проверю DMA1 может оно быстрее. Код выложите свой сравню. ДМА может работать с разной скоростью, нужно понять просто, как выжать максимальную.
Я перебрал кучу настроек, всегда получается 4 такта кроме случаев, когда размер источника в 2 раза больше, т.е., например, читаешь из порта 16 бит, а пишешь по 8, но тогда выходит 8 тактов, а не 6. С разной скоростью DMA тоже не должен работать, если не считать лаги. VGA либа, на которую я ссылался, выдает 800x600, там скорость вывода пикселей ровно 40MHz, а скорость проца - 160MHz. Код практически такой-же, как и на F103: Спойлер
Код красивый, но непонятный в хлам, как я его запущу, когда половина не объявленных типов переменных и функций? Могу только смысл понять, что память 32 битный буфер, порт как 8 бит, сейчас проверю. Наконец то! А говорили ДМА не может с разной скоростью работать! Но работает же теперь 4 такта, правда не знаю корректно ли массив заполнился и в нем данные как распределены из 32 бит всего 8 занято?... не порядок мягко говоря. Нет наоборот из массива в 4000 занято только 1000, но полностью, тогда наоборот отлично, что я могу сказать. Пойду на f103 проверю этот интересный факт. Проверил, он так не может, у него нет FIFO буфера или просто архитектура такая, ему все равно на размерность источника и буфера, 9 тактов и выравнивать он не может, если источник 8 бит, а буфер 32 он пишет только в младшие и все, потому и прироста в скорости нет.
Да и перечитайте, что вы написали, там не о 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 раз.
Да и перечитайте, что вы написали, там не о 4 тактах говорится "with the exception of the bus access phase.", т.е. доступ к шине может быть больше а на сколько не указано, это от загрузки шины зависит видимо, ну оно так и есть стоит два ДМА запустить их скорость падает.
А что вам не нравится? Да и писал не я, а Мартин. Хотите ДМА-трансфер быстрее чем вручную? Не дождётесь! Почему?
Ну выше я уже дождался) Подход к ДМА нужно было найти, ему не нравится сохранять в меньшую размерность, чем 32 бита просто.
На текущий момент выяснено ДМА: 1. у stm32f0xx ? 2. у stm32f1xx 9 тактов на мем то мем, точно, как не меняй битность источника и приемника 3. у stm32f3xx ? 4. у stm32f4xx 4 такта на мем то мем, если источник меньше буфера 8 бит и 32 бита, 6 тактов на мем то мем, если источник равен буферу=8 бит, другие комбинации не проверял, этих достаточно.
Программное чтение: 1. у stm32f0xx ? 2. у stm32f1xx 6 тактов, точно 3. у stm32f3xx ? 4. у stm32f4xx 4 такта, точно
Код красивый, но непонятный в хлам, как я его запущу, когда половина не объявленных типов переменных и функций? Могу только смысл понять, что память 32 битный буфер, порт как 8 бит, сейчас проверю.
По-моему, и так понятно, что делает функция memorySrcAddr или что значит переменная srcInc, тем более понятно, что означает DmaDataSize::_8bits. При желании уж точно можно разобраться
Цитата:
Наконец то! А говорили ДМА не может с разной скоростью работать! Но работает же теперь 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 "лишние" байты отбрасываются...
В том и дело, что у меня это не имеет значения. 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 работает быстрее не знаю, но это и не важно, не вижу разницы, в память трамбуется хорошо, не отбрасывает, а именно трамбует. Кстати, когда речь идет о даташите, не плохо указывать страницу
Очень полезная информация. А главное ни в одном даташите нет этих данных. Стесняются своего DMA что ли? Однако на F0 получается забирать за 5 тактов
Код:
ldrb r0,[r1] ;2 strb r0,[r2] ;2 adds r2,1 ;1
И это на ядре М0. А у вас МК на ядре М3 и 6 тактов? Плохая сосиска И размер... при 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 раз(а).
Да, я измеряю скорость количеством команд, на F0 при тактовых частотах до 24МГц имею полное право так делать. Выше 24МГц уже латентность флеша добавляет. Но при умеренном размере кода можно его впихнуть в RAM и запускать оттуда. Каждая команда ldr/str выполняется за 2 такта, а adds - за 1 такт, как и написано в соответствующем Technical Reference Manual к ядру М0. Итого 5 тактов на выборку.
Для F0 может так и есть, но для F1 и выше такое уже не работает, там LDR и STR пайплайнятся с кучей оговорок.
Да, я измеряю скорость количеством команд, на F0 при тактовых частотах до 24МГц имею полное право так делать. Выше 24МГц уже латентность флеша добавляет. Но при умеренном размере кода можно его впихнуть в RAM и запускать оттуда.
Это хорошо, но вы сами дали оговорку, да и F0 мы не рассматривали. Важен результат, который получается фактически, а такие расчеты ничего не гарантируют. Проверять нужно в железе, тогда нет проблемы с неправильной интерпретацией даташитов или личных расчетов.
Вот это интересно, т.е. программу собираем для мк 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 и т.д.
Ну что, запихал без проблем прямо в Кейле 71к в STM32f103C8, я в шоке, подарочек STM сделала, мало того, что на 128МГц работает без видимых проблем (ну юсб не заработает конечно), так еще и памяти в два раза больше. Спасибо за наводку F407VE тоже есть, но там итак много памяти, пока не знаю, как ее потратить даже, но все равно приятно, что ее там в два раза больше, чем дофига
Заголовок сообщения: Re: Карманный осциллограф на STM32
Добавлено: Вс сен 04, 2016 04:29:03
Открыл глаза
Зарегистрирован: Вс май 20, 2012 18:38:12 Сообщений: 77
Рейтинг сообщения:0
Заинтересовался проектом,заказал у китайцев микроконтроллеры и дисплей.МК уже пришли-вместо STM32F103C8T6 узкопленочный выслал STM32F103ZET6(корпус 144pin).Открыл спор на алиэкспресс,но не уверен что выиграю.Возможно применение такого МК в данной схеме?Разумеется,с изменением разводки печатки.
Заинтересовался проектом,заказал у китайцев микроконтроллеры и дисплей.МК уже пришли-вместо STM32F103C8T6 узкопленочный выслал STM32F103ZET6(корпус 144pin).Открыл спор на алиэкспресс,но не уверен что выиграю.Возможно применение такого МК в данной схеме?Разумеется,с изменением разводки печатки.
Вы шутите? Радоваться нужно. Конечно применим, пин ту пут если поставите то и работать будет также, зато куча свободных ног и памяти в придачу, но проще купить еще один тот, что нужен, дешевый. А этот припасти на черный день)
Обучил ослик скриншотам, по долгому удержанию кнопки энкодера. Скрины в формате BMP, пережал для радиокота, он никак не научится нормально картинки загружать.
Обучил ослик скриншотам, по долгому удержанию кнопки энкодера. Скрины в формате BMP
Картинки - пустая трата памяти. Хоть сырые, хоть пожатые. Лучше разработайте свой, бинарный формат данных, в котором бы хранились и данные, и настройки осциллографа, при которых эти данные сняты. А потом можно написать софтину для анализа этой мути на ПК. Если конечно нужно.
Обучил ослик скриншотам, по долгому удержанию кнопки энкодера. Скрины в формате BMP
Картинки - пустая трата памяти. Хоть сырые, хоть пожатые. Лучше разработайте свой, бинарный формат данных, в котором бы хранились и данные, и настройки осциллографа, при которых эти данные сняты. А потом можно написать софтину для анализа этой мути на ПК. Если конечно нужно.
Ну можно и так сделать, правда мне лень, убил я итак много времени на этого ослика. Картинки все равно нужны. Увидел что-то, не нужно телефон искать, да и качество получше. Скрин всегда нужная штука, а памяти на флешке не жалко, что там 240 кбайт. Починил, кстати, а то двоилось изображение.
Кто собирался собирать устройство, вы не спешите, комплектующие можете заказать, но плату не травите, я уже говорил, но повторяюсь на всякий случай, 7660 не заказывайте. Плата будет меняться и схема тоже.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения