Comments 21
начиная с логических анализаторов
если сильно хочется скостылить логический анализатор- берите девборду на ezusb fx3, прошивка гуглится по "fx3lafw", поддерживается сигроком со всеми вытекающими, умеет в сто мегагерц.
В моем случае это 76.8 kHz
сделай хотя бы х4 оверсемплинг, а то биты терять начнешь, как только температура поменяется.
Использовал такой метод для захвата видеосигнала c ZX Spectum:http://we.easyelectronics.ru/citizen/zahvat-videosignala-ot-zx-spectrum-pri-pomoschi-stm32f4.html
В электронике все — это либо АЦП либо ЦАП.
В цифровой электронике, вы, наверное, хотели сказать. В аналоговой эти преобразования - лишние.
6) Подключить к пину внешние прерывания по отрицательному перепаду напряжения. GPIO_MODE_IT_FALLING
Если вы вовремя успеваете обрабатывать прерывание по началу передачи, то захват сигнала GPIO через DMA с оверсемплингом х8 - это перебор. Достаточно x1. Или вообще чисто по прерываниям работать.
А вот постоянный оверсемлинг х3 в циклическом DMA ослабит требования к скорости обработки прерывания. Можно обрабатывать захваченные сэмплы потом, когда будет время. И обработка получается максимально тупая, без ответа на IRQ, перенастройки таймера и DMA.
Да, придётся обрабатывать постоянно, даже когда приёма нет. Можно слегка соптимизировать - следить за аппаратным битом "был недавно запрос IRQ" или "был перепад уровня". Но разницы особой нет - при постоянном потоке через UART вам всё равно приходится обработку успевать делать на полной скорости.
8) Можно захватывать I/Q выходы цифровых радио front end микросхем.
С оговоркой. Поскольку DMA делит шину с CPU и другими DMA, дискретизация по времени получается не очень точная. Для применения DMA+GPIO в качестве ЦАП или АЦП всё равно приходится иметь нечто аппаратное, что ровненько нарезает сигнал по времени.
В электронике все — это либо АЦП либо ЦАП.
А как же пины земли и питания? :-)
без отладочного UART. Я привык отлаживать прошивки через UART Shell и это стало проблемой. Хотел было отлаживаться через Segger RTT, но отсутствие прав админа на РС не позволяли
это все явно отмазки :) запишем проще - хотелось странного :)
в arduino это наверно больше 10 лет есть, зовется softstserial и обходится без всяких dma. и сделано оно как раз для тех кому нужный пин не достаточно квадратный.
softstserial может softserial?
https://technobee.ru/index.php/soft/betaflight/item/nastrojka-softserial-v-betaflight.html?ysclid=mu89cbt9bh750280975
раз так важно то я все таки про softwareserial https://github.com/arduino/ArduinoCore-avr/tree/master/libraries/SoftwareSerial хотя они там тоже прерываний то наиспользовали
но ближе к теме (stm32) дейcтвительно https://github.com/betaflight/betaflight/blob/master/src/main/drivers/serial_softserial.c
тут он сделан еще и потому что в аппаратуре радиуправления удумали использовать инвертированный uart. у некоторых mcu она включается аппаратно, но кому то захотелось именно вот так
начиная с логических анализаторов
если сильно хочется скостылить логический анализатор- берите девборду на ezusb fx3, прошивка гуглится по "fx3lafw", поддерживается сигроком со всеми вытекающими, умеет в сто мегагерц.
В моем случае это 76.8 kHz
сделай хотя бы х4 оверсемплинг, а то биты терять начнешь, как только температура поменяется.
Использовал такой метод для захвата видеосигнала c ZX Spectum:http://we.easyelectronics.ru/citizen/zahvat-videosignala-ot-zx-spectrum-pri-pomoschi-stm32f4.html
Здесь стоит обратить внимание на одну важную особенность контроллеров STM32F4 — в контроллере есть два модуля DMA, и только контроллер DMA2 имеет доступ к периферийным модулям, находящимся на шине AHB1. Модули GPIO соединены именно с шиной AHB1.
Судя по блок-схеме оба DMA имеют доступ к AHB1.

Однако в самом деле

Только DMA2 имеет доступ к шине AHB1.
Использовал такой метод для захвата видеосигнала c ZX
Что же Вы, тогда не проголосовали что делали это?

Здесь стоит обратить внимание на одну важную особенность контроллеров STM32F4 — в контроллере есть два модуля DMA, и только контроллер DMA2 имеет доступ к периферийным модулям, находящимся на шине AHB1. Модули GPIO соединены именно с шиной AHB1.
Следовательно, для захвата данных можно использовать только DMA2. Запросы передачи данных для этого DMA могут формировать только два таймера — TIM1 и TIM8. Я решил использовать второй из них.
Прочитал Ваш текст "Захват видеосигнала от ZX Spectrum при помощи STM32F4."
Надо же. Спасибо за ценнейшее уточнение!
Я про это даже не знал, не заметил, когда код писал.
Просто пальцем в небо выбрал случайный таймер DMA2, поток. И попал.
Есть ли где-блок схема ZX Spectrum ?
Не понял вопроса.
Какова архитектура компьютера ZX Spectrum ?
Хотел бы добавить схему ZX Spectrum в свою коллекцию.
Правила Хорошей Структурной Схемы для Электронных Плат
https://habr.com/ru/articles/667030/
С ходу только такое находится: https://zxpress.ru/book_articles.php?id=1839
Там же куча модификаций была, а схемотехника обычно не очень сложная, так что структурные схемы, похоже, если и рисовали, то редко. Да и многая документация до нас не дошла.
для zx spectrum реально сущетвует 100500 схем и наверное несколько 10 "архитектур". не знаю реально ли добыть оригинальную схему с оригинальной ula (asic (и все в нем). но этот ula потом реализоывали на мелкой логике у кого какая была в закромах. потом и на fpgfa перешли. каждый добавляя "несущетвенные" отличия
Здесь стоит обратить внимание на одну важную особенность контроллеров STM32F4 — в контроллере есть два модуля DMA, и только контроллер DMA2 имеет доступ к периферийным модулям, находящимся на шине AHB1. Модули GPIO соединены именно с шиной AHB1.
Более явно это показано на схеме 6 (Figure 6. Multi-AHB matrix). До чего же мне нравятся иллюстрации от ST!

В электронике все — это либо АЦП либо ЦАП.
В цифровой электронике, вы, наверное, хотели сказать. В аналоговой эти преобразования - лишние.
6) Подключить к пину внешние прерывания по отрицательному перепаду напряжения. GPIO_MODE_IT_FALLING
Если вы вовремя успеваете обрабатывать прерывание по началу передачи, то захват сигнала GPIO через DMA с оверсемплингом х8 - это перебор. Достаточно x1. Или вообще чисто по прерываниям работать.
А вот постоянный оверсемлинг х3 в циклическом DMA ослабит требования к скорости обработки прерывания. Можно обрабатывать захваченные сэмплы потом, когда будет время. И обработка получается максимально тупая, без ответа на IRQ, перенастройки таймера и DMA.
Да, придётся обрабатывать постоянно, даже когда приёма нет. Можно слегка соптимизировать - следить за аппаратным битом "был недавно запрос IRQ" или "был перепад уровня". Но разницы особой нет - при постоянном потоке через UART вам всё равно приходится обработку успевать делать на полной скорости.
8) Можно захватывать I/Q выходы цифровых радио front end микросхем.
С оговоркой. Поскольку DMA делит шину с CPU и другими DMA, дискретизация по времени получается не очень точная. Для применения DMA+GPIO в качестве ЦАП или АЦП всё равно приходится иметь нечто аппаратное, что ровненько нарезает сигнал по времени.
А вот постоянный оверсемлинг х3 в циклическом DMA ослабит требования к скорости обработки прерывания. Можно обрабатывать захваченные сэмплы потом, когда будет время. И обработка получается максимально тупая, без ответа на IRQ, перенастройки таймера и DMA.
Да, придётся обрабатывать постоянно, даже когда приёма нет. Можно слегка соптимизировать - следить за аппаратным битом "был недавно запрос IRQ" или "был перепад уровня". Но разницы особой нет - при постоянном потоке через UART вам всё равно приходится обработку успевать делать на полной скорости.
Мне кажется, что будет лишняя нагрузка на CPU чтобы постоянно искать start бит начала UART пакета.
А с EXT INT прерыванием вам DMA выдает готовый массив UART кадра.
Собирать в кучку битовый поток пускай даже 77 кбит/c и проверять, что вся кучка равна или не равна (-1)? Я не думаю, что это сильно нагрузит такой мк. Тем более, что эту задачу можно отложить, оставив приоритет для более важных.
С вашим же алгоритмом приходится безо всяких задержек реагировать на IRQ по перепаду уровня, чтобы нужные сэмплы DMA потом чётко легли на биты UART-кадра. А в обработке IRQ окончания DMA, когда принят стоп-бит, нужно успеть снова разрешить IRQ по перепаду. Чтобы не пропустить следующий старт.
Если в коде есть более приоритетные IRQ, или где-то для атомарности они отключаются, или не дай бог есть ещё один программный UART - то ой..
SoftSerial: Двоичный АЦП на STM32 (или самодельный логический анализатор)