У меня полная занятость в качестве инженера по прошивке. Недавно мне было дано задание проверить настройки GPIO и при необходимости изменить настройки. Я нашел несколько пинов, которые были неправильно настроены, поэтому, естественно, я перенастроил их, однако мне сказали, что я сделал это в неправильном порядке. Вот о чем я говорю:
До:
GPIO1.direction = INPUT;После:
GPIO1.direction = OUTPUT;
GPIO1.value = 0;
Однако во время проверки кода мне сказали, что мне нужно изменить порядок инициализации следующим образом:
GPIO1.value = 0;
GPIO1.direction = OUTPUT;
Другими словами, сначала установите значение, а затем установите направление вывода. Мне также сказали, что так должно быть на современных процессорах, потому что они используют два регистра, один для ввода и один для вывода, однако старые процессоры используют только один регистр, поэтому порядок операций не будет иметь значения.
(Примечание: современный = ARM Cortex M3 и выше, старый = Intel 8051)
Я попросил лучшего объяснения на работе, но не смог получить хороший ответ. Вот почему я решил спросить здесь.
Итак, вот мои вопросы:
- Почему порядок инициализации имеет значение на новых процессорах?
- Почему порядок инициализации не имеет значения на старых процессорах?
- О каких двух регистрах они говорят в современных процессорах?
- О каком единственном регистре говорят старые процессоры?
Если бы кто-то мог предоставить какую-то диаграмму, это было бы еще лучше.
Ответы:
В оригинальном 8051 использовались так называемые псевдо-двунаправленные выходные порты (открытый сток с подтягиванием), поэтому настройки направления портов не было.
Конечно, для современных истинных двунаправленных выходных портов лучше установить известное значение, прежде чем разрешить вывод порта для вывода, потому что в противном случае на выходе мог бы быть переходный процесс, который мог бы сделать что-то нежелательное.
Смотрите мой ответ здесь , например.
Изменить: Вот структура выводов ввода / вывода для (относительно) современного КМОП микроконтроллера :
TRIS (TRIState) называется DDR (регистр направления данных) во многих других микро. В этом случае, если выходной сигнал TRIS высокий, тогда оба транзистора выключены, но порт все еще может быть считан.
Вот немного более сложная структура выводов ввода / вывода для более новой Microchip micro .
Снова защелка TRIS отключает вывод. Этот включает в себя защелку LAT, которая помогает избежать проблем чтения-изменения-записи . В серии PIC вы должны записывать только в регистр LAT (и читать из регистра PORT).
Вот оригинальная внутренняя схема контактов портов ввода / вывода 8051 и CMOS 8051 (из этого источника ):
Существует некоторая дополнительная сложность в том, что параллельно с подтягивающим устройством имеется ускоряющий транзистор, который кратковременно включается для преодоления внешней емкости. Как видите, управление TRIS / DDR вообще отсутствует. Подтягивающие МОП-транзисторы, используемые в нормальной работе, являются «слабыми» - они достаточно малы (низкий Idss), чтобы внешний выход, подключенный к выводу, мог снизить уровень псевдонаправленной линии порта.
источник
Если вы сначала установите направление, штифт на короткое время будет сконфигурирован для вывода любого текущего значения на выходе. Если вы сначала установите значение, этого не произойдет.
Таким образом, делая это так, как вам было рекомендовано, можно избежать сбоев на выходе, которые могут варьироваться от безвредных до катастрофических, в зависимости от того, к чему подключен вывод.
источник
Предполагая, что направлением по умолчанию является вход (то есть High-Z, что имеет смысл, поскольку мы не хотим, чтобы MCU принудительно устанавливал какое-либо значение на подключенных линиях), этот порядок настройки порта предпочтителен, но не необходим. Это действительно необходимо, когда ваше приложение требует, чтобы при запуске значение порта не было, скажем
1
. Затем вы установите значение,0
а затем измените направление. В этом случае вы избегаете возможного кратковременного «сбоя» между настройкой направления и значения, что может привести к скачку на этом выводе. И это верно для всех процессоров, имеющих такую логику, а не только для новых.источник