STM32F207 превратили в осциллограф — и упёрлись в 1.764 МГц
На PA6 платы NUCLEO-F207ZG приходит сигнал, TIM2 выдаёт импульсы запуска, ADC1 оцифровывает напряжение, а DMA2 прокручивает буфер из 16 384 отсчётов. У этой связки есть неожиданно острый угол: конфигурация задаёт таймеру ровно 2.0 МГц, хотя таблица характеристик STM32F207 для внешнего триггера 12-битного АЦП при частоте ADC 30 МГц указывает максимум 1.764 МГц. Код действительно создаёт два миллиона TRGO-импульсов в секунду. Получает ли АЦП гарантированно преобразование на каждый импульс, опубликованные материалы не доказывают.
Проект BTTLab интересен именно тем, как далеко можно зайти без внешнего быстрого АЦП и FPGA. ADC1 работает в 12-битном режиме на канале 6, TIM2 служит общей временной схемой, DMA пишет выборки по кругу. После заполнения половины или конца буфера прошивка просматривает свежие данные и ищет восходящий фронт с гистерезисом 20 кодов. Затем она собирает кадр из 4096 отсчётов, оставляя 1024 точки до найденного события. При номинальных 2.0 MSPS на экране оказывается фрагмент длиной 2.048 мс, включая историю сигнала перед фронтом.
Это честный способ получить осциллографическое поведение из обычного микроконтроллера: таймер, АЦП и DMA держат равномерную сетку времени, процессор не пытается успеть к каждой выборке. Но триггер здесь программный и ретроспективный. CPU видит фронт после DMA callback, а не открывает аппаратные ворота захвата в момент пересечения уровня. Для повторяющихся сигналов такая схема даёт устойчивую картину; на медленной шумной синусоиде автор уже отмечает нестабильность синхронизации ниже примерно 12 кГц.
Выдавать каждый отсчёт наружу микроконтроллер и не пытается. Один кадр несёт 8194 байта вместе с синхрословом. Через USART3 на 921600 бод его передача занимает около 88.9 мс, поэтому UART показывает отдельные захваченные окна, а не непрерывный поток 2 MSPS. Полный поток 12-битных отсчётов в 16-битной упаковке потребовал бы минимум 4 MB/s ещё до служебных данных. В текущем коде нет очереди кадров и проверки занятости UART: новый триггер во время DMA-передачи способен потеряться.
Цифровая часть уже превращает F207 в аккуратный регистратор коротких событий. Измерительным входом PA6 пока не стала. Репозиторий прямо сообщает об отсутствии входной защиты и схемы смещения. АЦП принимает только диапазон от 0 до VREF+, обычно около 0…3.3 В; отрицательная полуволна, щуп с десятками вольт и даже ток через защитные диоды требуют отдельного рассчитанного фронтенда. Нужны также измерения реальной частоты выборки, джиттера, шума, коэффициента передачи и АЧХ. Без них 2.0 MSPS остаются настройкой таймера, а не доказанной полосой или точностью прибора.
Самое ценное в проекте — чёткая граница, которую он высвечивает. У простого MCU хватает периферии, чтобы поймать фронт, сохранить прошлое сигнала и показать его на ПК. Дальше начинаются требования, из-за которых осциллографы получают аттенюаторы, смещение, ограничители, опорные источники, калибровку и отдельную триггерную архитектуру. Один GPIO с DMA-буфером позволяет увидеть форму импульса; доверять увиденному можно только после того, как вход и временная база становятся такими же тщательно спроектированными, как прошивка.
### Источники
| Материал | Что подтверждает |
|---|---|
| BTTLab, репозиторий stm32osc1ch — https://github.com/BTTLab/stm32osc1ch | Архитектуру проекта, заявленные 2 MSPS, отсутствие реализованных input protection и offset circuitry. |
| BTTLab, OSCILLOSCOPE_V1.ioc — https://github.com/BTTLab/stm32osc1ch/blob/main/firmware/OSCILLOSCOPE_V1.ioc | ADC1 на PA6, 12 бит, TIM2 TRGO, DMA circular и USART3 921600 бод. |
| BTTLab, main.c — https://github.com/BTTLab/stm32osc1ch/blob/main/firmware/Core/Src/main.c | PSC=0, ARR=29, размер буфера и кадра, программный trigger, передачу UART DMA без очереди. |
| STMicroelectronics, datasheet STM32F205/207 — https://www.st.com/resource/en/datasheet/CD00237391.pdf | Ограничения ADC, диапазон VAIN, 2 MSPS для одного АЦП и fTRIG 1.764 МГц в указанных условиях. |