
Сообщение от
tnt23
xintrea, покажите конфигурацию GPIO. Можно в виде исходников, можно скриншотом из CubeMX.
Здравствуйте. Выкроилось свободное время, продолжаю.
Исходники можно взять здесь: https://github.com/xintrea/mikroshamem
(На всякий случай, здесь идет речь о коммите aed203fd684d2adade93fdf8efbb0ae2e138d670, который актуален на момент написания данного сообщения)
По сути, проект написан с использование CMSIS, в нем всего два файла на Си и один заголовочный (в каталоге /src, естественно).
Сейчас код в таком состоянии, что в нем есть только инициализация перифирии и бесконечный цикл. В бесконечном цикле сделано ожидание чтобы сигналы /32К и /RD (ножки A10 и A11 на STM) одновременно были в физическом 0. Если не так, то ШД на B8-B15 находится в состоянии Input, чтобы не мешать работе Микроши. Если оба сигнала в 0, то ШД на B8-B15 переключается на выход в классическом режиме Push-Pull, и на ШД выставляется байт 0x00.
Для эксперимента, нога старшего разряда (B15) притянута к 3.3V через резистор 1кОм, а ШД Микроши отключена полностью. Это притягивание как-бы эмулирует единицу, которая "остается" от слова состояния 82H когда Микроша подключена к STM.
Так вот, в этом эксперименте картина абсолюто та же самая, что и на последнем скриншоте. STM-ка почему-то притягивает к нулю B15 всего на ~120нс и сразу отпускает, даже не дождавшись, когда хотя бы один сигнал /32К или /RD перестанет быть равен 0. Хотя по алгоритму в коде этого не должно быть.
И самое главное: если в коде раскомментировать строчку 146, в которой написана единственная команда:
Код:
// GPIOA->BSRR = (1<<GPIO_BSRR_BS0_Pos); // Светодиод включается
... то длительность притягивания B15 к 0 сильно удлинняется, и можно сказать что становится правильной! А эта строчка всего-навсего устанавливает 1 на ноге A0, которая никакого отношения к делу не имеет! Причем на ноге A0 никаких переключений нет, она как в первый раз установилась в 1 так и переставляется все время на 1 этой строчкой.
На скриншоте:
Желтый - /RD
Голубой - /32К
Синий - ножка B15 STM (с подтяжкой к 3.3V через 1кОм)

Если быть точным, то при раскомментировании строчки установки 1 на A0, длительность притягивания B15 к 0 все же длинновата, по-хорошему возврат в 1 должен начаться спустя не более ~150-280нс после восходящего фронта желтой линии. Установка 1 для A0 должна занимать не более 30нс, я это проверял на ногодрыге. Детектирование состяния /32К или /RD занимает, как мы видим, 120-250нс. Поэтому возврат к 1 должен начинаться спустя ~150-280нс от восходящего желтого фронта. А он начинает восходить к 1 спустя 500нс. Это странно.
Возможно, у меня ошибка в коде, но я ее не вижу. Буду рад, если кто-нибудь ткнет носом где в коде проблема.
- - - Добавлено - - -

Сообщение от
Ведущий_специалист
была другая проблема, стм банально не успевал войти в прерывание по сигналам RD или WR. Пропуская обращение и получалась каша. А так - да, коллеги выше правильно подсказали - неправильно настроены порты микроконтроллера.
Поэтому я сразу отказался от прерываний. В моем коде просто бесконечный цикл.