Да, я уже проверил. STM32F3 и F4 могут забирать с портов за 2 такта. 32 MSPS получается гарантированно. Правда при этом происходят какие то чудеса. Процессор на что то иногда отвлекается) Пока не разобрася на что. Прерывания отключены. А если забирать с внутреннего АЦП то вроде все чисто.
Вот и получается: 1. STM32F3 + AD9280 + ОУ + делитель + генератор минуса = 32мГц (может 40) Входное сопротивление 1 мОм. 2. STm32F303 (и все!) = 16 мГц Входное сопротивление 100 кОм. Правда всего 4 предела по уровню.
Сейчас собран втотой вариант и что характерно работает и пользуюсь. А первый... ну наверно неспешно доделаю..
Да, я уже проверил. STM32F3 и F4 могут забирать с портов за 2 такта. 32 MSPS получается гарантированно. Правда при этом происходят какие то чудеса. Процессор на что то иногда отвлекается)
Есть такое. Я после запуска DMA делал __WFI(), проц засыпает до прерывания и, во-первых, меньше помехи на ADC, во-вторых, DMA никто не мешает и должно всегда забирать данные за 2 такта.
fusion, P-CAD пока осваиваю может по-этому второго слоя не вижу. Печатка на Хмегу 32 односторонняя, судя по-всему? Если так, то площадки с отверстиями соединять проводами согласно схемы? Шина АЦП на какие порты МК включена или тупо делать по печатке? Оптрон не указан, через ключ включу реле или можно применить полевик?
STM32F3 и F4 могут забирать с портов за 2 такта. 32 MSPS получается гарантированно
на F030 DMA тоже молотит до F_CPU/2. вот меандр 15МГц, проц на 60МГц, DMA1.1 в режиме MEM2MEM, приоритет максимум, чтение из GPIOA.IDR:
видно что читает по 4 точки на период, без пропусков, т.е. и на F030 получается 30MSPS программным чтением (типа *buf++ = GPIOA->IDR; ...) длительность одного уровня "пляшет" по 1/2/3 семпла на полупериод...
видно что читает по 4 точки на период, без пропусков, т.е. и на F030 получается 30MSPS
Я такое тоже наблюдал Частота дискретизации была 19.2M, если подавать на вход 9.6M сгенерированную тем же мк, то получаем идеальную лесенку 0101..., но если подать 16M или 24M, то откуда-то берутся 4 или 3 точки не период. Визуально 16M и 4М выглядят почти одинаково, не дай себя обмануть
по SysTick получается 5 тактов на пересылку - 12MSPS на 60МГц, преимущества над АЦП F303 нет. переход в SLEEP на время пересылки не влияет.
Я и говорил, что 5 тактов. Вчера проверил на F407, там 4. Заявленные 2 такта - это если загрузить в регистры константы и по очереди выводить их в порт, что в данном случае бесполезно.
Я забираю с АЦП за 2 такта ассемблером: LDRB rez,[#0x50000040] // ADC1 STRB rez,[addressbuffer], #1 LDRB rez,[#0x50000140] // ADC2 STRB rez,[addressbuffer], #1
и так 1024 раза) Получается 36 МСПС при 72 мГц у F303. АЦП конечно 18 мГц не тянет, теряет младшие разряды. Но сигнал на мелком экране все равно видно.
На F407 получились 4 такта, как и с DMA. Еще хуже если сохранять в CCM RAM - 5 тактов... Обычно LDR + STR пайплайнятся до 3-х, не уверен, что 2 такта в принципе достижимы... Может если из CCM RAM запускать, ты не так случайно делаешь?
Про CCM RAM не знаю не изучал еще) Но в Кейл если поставить оптимизацию на 0, то скорость сразу падает до 5 тактов вместо 2. Как так может быть пока не понимаю. Он что оптимизирует мой ассемблерный код? Пробовал на stm32f411 100mHz. Забирает с порта 50 мГц. Но иногда опять пропуски. Редко. Но есть. Прерывания отключены. __disable_irq(); __disable_fiq(); Даже не знаю чем там процессор занимается) Документации мало. На АВР с ассемблером было все четко - как написал так и работает. Буду разбираться дальше
У меня STRB без смещения. STRB rez,[addressbuffer], #1 - это автоинкремент addressbuffer на единичку. Без проверки без цикла 1024 раза - считать/записать. На вход подаю мегагерц и по клеточкам на дисплее считаю какая скорость.
Про CCM RAM не знаю не изучал еще) Но в Кейл если поставить оптимизацию на 0, то скорость сразу падает до 5 тактов вместо 2. Как так может быть пока не понимаю. Он что оптимизирует мой ассемблерный код?
Чего гадать, ставь брейпоинт в релизной сборке и смотри что он там нагенерил... Я первый раз на массив volatile не поставил, так умный компилятор сначала в кучу регистров данные с порта считал, а потом все это сохранил
Цитата:
У меня STRB без смещения. STRB rez,[addressbuffer], #1 - это автоинкремент addressbuffer на единичку. Без проверки без цикла 1024 раза - считать/записать. На вход подаю мегагерц и по клеточкам на дисплее считаю какая скорость.
Без разницы есть смещение или нет, все равно команда выполняется одинаковое время. Но я переделал на ассме:
Ладно, проведем очередную проверку, так чтобы без ЛА, частотомеров и подсчета квадратиков Выставляем частоту мк 100MHz, создаем цикл на 125000 итераций, внутрь которого помещаем 100 LDR + STR, все это пихаем в бесконечный цикл в начале которого инвертим светодиод. Если каждый LDR + STR выполняется за 4 такта, то на весь вложенный цикл уйдет 4 * 100 * 125000 = 50 млн. тактов или пол секунды, т.е. светодиод должен мигать с частотой 1 Гц, что я и наблюдаю.
Заголовок сообщения: Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - пр
Добавлено: Чт авг 11, 2016 07:54:55
Извините, что влезаю в процесс, но... А аналоговую часть уже делали? Вопрос такой - можно ли так создать искусственную среднюю точку для усилителя. Понимаю, что это в 2 раза заузит входной диапазон (до +-1,6V), но всё же имеет ли такое решение шанс на жизнь? Жутко не хочется возиться с преобразователем -3,3V, к тому же лишний источник помех. Спойлер Спасибо.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения