Я читаю спецификацию чипа ARM Cortex, особенно главу GPIO. В конечном итоге я хочу настроить различные выводы GPIO, чтобы использовать их в режиме «Альтернативная функция» для доступа к чтению / записи в SRAM.
Из всех доступных регистров GPIO я не понимаю два: GPIO_PUPDR
и GPIO_OTYPE
это соответственно «регистр подтягивания / понижения» и «регистр типа вывода».
Ибо у GPIO_PUPDR
меня есть три варианта:
- Нет подтягивания или опускания
- Подтягивание
- Тянуть вниз
Ибо у GPIO_0TYPE
меня есть два варианта:
- Выходной двухтактный
- Выход с открытым стоком
В чем разница между всеми различными конфигурациями, и какая будет наиболее подходящей для связи SRAM?
Документация по плате, над которой я работаю, доступна здесь (см. Стр. 24 для схем SRAM). Справочное руководство по микросхеме ARM доступно здесь (см. Стр. 145 и 146 для регистров GPIO).
microcontroller
gpio
Randomblue
источник
источник
Ответы:
Этот ответ является общим для процессоров и периферийных устройств, и в конце содержит комментарий, специфичный для SRAM, который, вероятно, имеет отношение к вашей конкретной оперативной памяти и процессору.
Выходные контакты могут работать в трех разных режимах:
Входные контакты могут быть входом затвора с:
Существует также триггерный входной режим Шмитта, при котором входной вывод тянется со слабым подтягиванием в исходное состояние. Оставленный в покое, он остается в своем состоянии, но может быть переведен в новое состояние с минимальными усилиями.
Открытый слив полезен, когда несколько ворот или штифтов соединены вместе с (внешним или внутренним) подтягиванием. Если все штыри находятся на высоком уровне, все они являются разомкнутыми цепями, и подтягивающие штыри поднимают штифты на высокий уровень. Если какая-либо булавка низкая, все они становятся низкими, поскольку они связаны друг с другом. Эта конфигурация эффективно формирует
AND
ворота.При управлении SRAM вы, вероятно, хотите, чтобы линии передачи данных или строки адреса были высокими или низкими как можно более твердыми и быстрыми, чтобы был необходим активный привод вверх и вниз, поэтому указывается двухтактный режим. В некоторых случаях с несколькими ОЗУ вы можете захотеть сделать что-нибудь умное и объединить линии, где другой режим может быть более подходящим.
При использовании SRAM с данными, вводимыми из SRAM, если микросхема ОЗУ всегда утверждает данные, то вывод без подтягивания, вероятно, в порядке, так как ОЗУ всегда устанавливает уровень, и это минимизирует нагрузку. Если линии данных ОЗУ иногда разомкнуты или находятся в трехстороннем состоянии, вам понадобятся входные контакты, чтобы иметь возможность установить свое собственное допустимое состояние. В очень высокоскоростных коммуникациях вы можете использовать подтягивание и, и, а также понижение, так что параллельное эффективное сопротивление является конечным сопротивлением, а напряжение холостого хода шины устанавливается двумя резисторами, но это несколько специфично.
источник
Я нашел этот ответ от STM32 Понимание настроек GPIO
В цифровых цепях важно, чтобы сигнальным линиям никогда не разрешалось «плавать». То есть они должны всегда находиться в высоком или низком состоянии. При плавающем состоянии состояние не определено и вызывает несколько различных типов проблем.
Способ исправить это - добавить резистор из сигнальной линии к Vcc или Gnd. Таким образом, если линия активно не приводится в действие на высоком или низком уровне, резистор вызовет дрейф потенциала до известного уровня.
ARM (и другие микроконтроллеры) имеют встроенную схему для этого. Таким образом, вам не нужно добавлять другую часть в вашу схему. Например, если вы выберете «GPIO_PuPd_UP», это равносильно добавлению резистора между сигнальной линией и Vcc.
Push-Pull: это тип вывода, который большинство людей считает «стандартным». Когда выходной сигнал становится низким, он активно «тянется» на землю. И наоборот, когда выходной сигнал установлен на высокий уровень, он активно «подталкивается» к Vcc. Упрощенно это выглядит так:
Выход Open-Drain, с другой стороны, активен только в одном направлении. Он может тянуть штифт к земле, но он не может вести его высоко. Представьте себе предыдущее изображение, но без верхнего MOSFET. Когда он не тянет на землю, полевой МОП-транзистор (нижняя сторона) просто непроводящий, что вызывает всплывание выходного сигнала.
Для этого типа выхода в цепь должен быть добавлен подтягивающий резистор, который приведет к тому, что линия станет высокой, когда она не будет переведена в низкий уровень. Вы можете сделать это с внешней деталью или установив значение GPIO_PuPd равным GPIO_PuPd_UP.
Название происходит от того факта, что утечка MOSFET внутренне не связана ни с чем. Этот тип вывода также называется «открытый коллектор» при использовании BJT вместо MOSFET.
По сути, это контролирует скорость нарастания (время нарастания и спада) выходного сигнала. Чем выше скорость нарастания, тем больше шума излучается от цепи. Хорошей практикой является замедление скорости нарастания и увеличение ее только при наличии конкретной причины.
источник
Еще один маленький кусочек: для микроконтроллеров, у которых нет явного режима «открытого стока», таких как платы на базе AVR и Arduino ATmega328, таких как Uno, этот режим «открытого стока» можно смоделировать, написав функцию-обертку который просто устанавливает вывод на «Выход НИЗКИЙ», когда вы отправляете его,
0
и который настраивает вывод как «Вход НИЗКИЙ» (режим с высоким импедансом, внутренний подтягивающий резистор НЕ включен), когда вы отправляете его a1
. Таким образом, вы получите тот же эффект. Эти современные 32-битные ARM-ядра микроконтроллеров просто имеют гораздо больше возможностей.Кроме того, p146 Справочного руководства STM32, связанного с вышеупомянутым, заявляет следующее [мои дополнения в квадратных скобках] :
В коде Arduino эта «функция-обертка» может быть реализована так:
Или упрощенно:
Обратите внимание, что для включения внутреннего подтягивающего резистора на Arduino вы можете сделать:
ИЛИ (тоже самое):
Дополнительное чтение:
источник