Почему сначала нужно установить значение, а затем направление GPIO во встроенном процессоре?

16

У меня полная занятость в качестве инженера по прошивке. Недавно мне было дано задание проверить настройки GPIO и при необходимости изменить настройки. Я нашел несколько пинов, которые были неправильно настроены, поэтому, естественно, я перенастроил их, однако мне сказали, что я сделал это в неправильном порядке. Вот о чем я говорю:

До:
GPIO1.direction = INPUT;

После:
GPIO1.direction = OUTPUT;
GPIO1.value = 0;

Однако во время проверки кода мне сказали, что мне нужно изменить порядок инициализации следующим образом:

GPIO1.value = 0;
GPIO1.direction = OUTPUT;

Другими словами, сначала установите значение, а затем установите направление вывода. Мне также сказали, что так должно быть на современных процессорах, потому что они используют два регистра, один для ввода и один для вывода, однако старые процессоры используют только один регистр, поэтому порядок операций не будет иметь значения.
(Примечание: современный = ARM Cortex M3 и выше, старый = Intel 8051)

Я попросил лучшего объяснения на работе, но не смог получить хороший ответ. Вот почему я решил спросить здесь.

Итак, вот мои вопросы:

  1. Почему порядок инициализации имеет значение на новых процессорах?
  2. Почему порядок инициализации не имеет значения на старых процессорах?
  3. О каких двух регистрах они говорят в современных процессорах?
  4. О каком единственном регистре говорят старые процессоры?

Если бы кто-то мог предоставить какую-то диаграмму, это было бы еще лучше.

flashburn
источник
1
«Современные» и «старые» процессоры слишком расплывчаты, чтобы дать на них полезный ответ. Различные архитектуры имеют разные настройки регистра; не зная, о ком вы говорите, невозможно разумно их прокомментировать.
Ник Джонсон
@ IgnacioVazquez-Abrams Нет, не совсем. В комнате были очень опытные инженеры, которые сказали, что у вас будут глюки на линии, если это будет сделано, как я.
вспышка ожога
@NickJohnson Modern = ARM Cortex M4 и выше, Old = Intel 8051.
вспышка ожога
@BrianDrummond LOL. Очень хорошее объяснение. А как же старые процессоры, например 8051. Почему это не важно для них?
вспышка ожога
2
Q4 будет легче ответить с помощью ссылки на таблицу.
pjc50

Ответы:

22

В оригинальном 8051 использовались так называемые псевдо-двунаправленные выходные порты (открытый сток с подтягиванием), поэтому настройки направления портов не было.

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

Смотрите мой ответ здесь , например.

Изменить: Вот структура выводов ввода / вывода для (относительно) современного КМОП микроконтроллера :

введите описание изображения здесь

TRIS (TRIState) называется DDR (регистр направления данных) во многих других микро. В этом случае, если выходной сигнал TRIS высокий, тогда оба транзистора выключены, но порт все еще может быть считан.

Вот немного более сложная структура выводов ввода / вывода для более новой Microchip micro .

введите описание изображения здесь

Снова защелка TRIS отключает вывод. Этот включает в себя защелку LAT, которая помогает избежать проблем чтения-изменения-записи . В серии PIC вы должны записывать только в регистр LAT (и читать из регистра PORT).

Вот оригинальная внутренняя схема контактов портов ввода / вывода 8051 и CMOS 8051 (из этого источника ):

введите описание изображения здесь

Существует некоторая дополнительная сложность в том, что параллельно с подтягивающим устройством имеется ускоряющий транзистор, который кратковременно включается для преодоления внешней емкости. Как видите, управление TRIS / DDR вообще отсутствует. Подтягивающие МОП-транзисторы, используемые в нормальной работе, являются «слабыми» - они достаточно малы (низкий Idss), чтобы внешний выход, подключенный к выводу, мог снизить уровень псевдонаправленной линии порта.

Спехро Пефхани
источник
Спасибо за объяснение. Я не работал с оборудованием некоторое время, поэтому мне трудно понять объяснение из описания. Не могли бы вы предоставить изображения? Скажите, как аппарат с конфигурацией выводов будет выглядеть на современном процессоре по сравнению с 8051? Я был бы очень признателен.
вспышка ожога
Что вы подразумеваете под оборудованием? Внутренняя схема GPIO чипа?
Спехро Пефхани
Правильно. Некоторая диаграмма была бы действительно полезна.
вспышка
16

Если вы сначала установите направление, штифт на короткое время будет сконфигурирован для вывода любого текущего значения на выходе. Если вы сначала установите значение, этого не произойдет.

Таким образом, делая это так, как вам было рекомендовано, можно избежать сбоев на выходе, которые могут варьироваться от безвредных до катастрофических, в зависимости от того, к чему подключен вывод.

Ник Джонсон
источник
Благодарю. Так что насчет старых процессоров, почему это не важно для них? Старый = Intel 8051
flashburn
Я не знаком с 8051. Исходя из того, что сказали ваши коллеги, если один и тот же регистр конфигурирует и направление, и значение, это не имеет значения, потому что компилятор оптимизирует две записи в одну.
Ник Джонсон
2
вероятно, все еще будет хорошей привычкой делать это «новым» способом для старых процессоров также по вышеуказанной причине. Разные orocessor могут иметь разные требования, разные поставщики могут дать лучшее предложение, чем другие, и разные компании / работодатели / команды могут иметь разные политики в отношении таких деталей.
Билл
2
действительно ... всегда предполагайте, что DIO подключен к орбитальному лазеру гибели;)
Майкл
4

Предполагая, что направлением по умолчанию является вход (то есть High-Z, что имеет смысл, поскольку мы не хотим, чтобы MCU принудительно устанавливал какое-либо значение на подключенных линиях), этот порядок настройки порта предпочтителен, но не необходим. Это действительно необходимо, когда ваше приложение требует, чтобы при запуске значение порта не было, скажем 1. Затем вы установите значение, 0а затем измените направление. В этом случае вы избегаете возможного кратковременного «сбоя» между настройкой направления и значения, что может привести к скачку на этом выводе. И это верно для всех процессоров, имеющих такую ​​логику, а не только для новых.

Евгений Ш.
источник