Pull to refresh

Comments 21

PinnedPinned comments

начиная с логических анализаторов

если сильно хочется скостылить логический анализатор- берите девборду на ezusb fx3, прошивка гуглится по "fx3lafw", поддерживается сигроком со всеми вытекающими, умеет в сто мегагерц.

В моем случае это 76.8 kHz

сделай хотя бы х4 оверсемплинг, а то биты терять начнешь, как только температура поменяется.

В электронике все — это либо АЦП либо ЦАП.

В цифровой электронике, вы, наверное, хотели сказать. В аналоговой эти преобразования - лишние.

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. и сделано оно как раз для тех кому нужный пин не достаточно квадратный.

раз так важно то я все таки про 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 оверсемплинг, а то биты терять начнешь, как только температура поменяется.

Я настраиваю программный UART на 9600 бод.
Получается надо ставить в ADC FS на 38.4 kHz.

а, 9600. тогда 76.8к хватит, да. прост смутила околостандартная частота для уарта.

(а я распробовала для всякой телеметрии 2Мбод для слабеньких мк и 4М для мк пожирнее. 9600 после этого совсем не хочется xD)

Здесь стоит обратить внимание на одну важную особенность контроллеров 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 в свою коллекцию.

Правила Хорошей Структурной Схемы для Электронных Плат
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 - то ой..

Sign up to leave a comment.

Articles