Чому спочатку потрібно встановити значення, а потім напрямок GPIO у вбудованому процесорі?


16

Я працюю на повний робочий день інженером прошивки. Нещодавно мені дали завдання переглянути конфігурації GPIO та змінити налаштування за потребою. Я знайшов кілька штифтів, які були неправильно налаштовані, тому я природно налаштував їх, однак мені сказали, що я це зробив у неправильному порядку. Ось що я говорю:

Перед:
GPIO1.direction = ВХОД;

Після:
GPIO1.direction = ВИХІД;
GPIO1.значення = 0;

Однак під час огляду коду мені сказали, що мені потрібно змінити порядок ініціалізації на такий:

GPIO1.значення = 0;
GPIO1.direction = ВИХІД;

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

Я попросив краще пояснення на роботі, але не зміг отримати гарної відповіді. Тому я вирішив попросити тут.

Тож ось мої запитання:

  1. Чому порядок ініціалізації має значення для нових процесорів?
  2. Чому порядок ініціалізації не має значення для старих процесорів?
  3. Про які два регістри вони говорять у сучасних процесорах?
  4. Про який єдиний реєстр вони говорять на старих процесорах?

Якби хтось міг надати якусь діаграму, це було б ще краще.


1
"Сучасні" та "старі" процесори є надто розпливчастими, щоб дати корисну відповідь. Різні архітектури мають різні налаштування реєстру; не знаючи, про які ви говорите, немає ніякого способу їх інтелектуально коментувати.
Нік Джонсон

@ IgnacioVazquez-Abrams Ні, не дуже. У кімнаті були дуже досвідчені інженери, які сказали, що у вас будуть глюки на лінії, якщо це буде зроблено моїм шляхом.
спалах

@NickJohnson Modern = ARM Cortex M4 і вище, старий = Intel 8051.
спалах

@BrianDrummond LOL. Дуже приємне пояснення. А як щодо старих процесорів, наприклад 8051. Чому це для них не має значення?
спалах

2
На Q4 було б простіше відповісти за допомогою посилання на таблицю даних.
pjc50

Відповіді:


22

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

Звичайно, для сучасних справжніх двосторонніх вихідних портів краще мати встановлене значення, перш ніж увімкнути штифт порту для виведення, тому що в іншому випадку у вас може бути перехідний на виході, що може зробити щось небажане.

Дивіться моя відповідь тут , наприклад.

Редагувати: Ось контактна структура вводу-виводу для (відносно) сучасного мікроконтролера CMOS :

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

TRIS (TRIState) називається DDR (Реєстр даних даних) у багатьох інших мікросхемах. У цьому випадку, якщо вихід засувки TRIS високий, обидва транзистора 'вимкнено', але порт все ще можна прочитати.

Ось трохи складніший введення / виведення контактна структура для нової Microchip мікро .

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

Знову засувка TRIS відключає вихід. Це один включає в себе LAT засувку , яка допомагає уникнути проблем читання-запису змінити . У серії PIC слід записувати лише до реєстру LAT (і читати з регістра PORT).

Ось оригінальна внутрішня мікросхема порту вводу-виводу 8051 та CMOS 8051 classic (з цього джерела ):

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

Існує трохи додаткової складності в тому, що паралельно підтягувальному транзистору є прискорювальний транзистор, який коротко увімкнено для подолання зовнішньої ємності. Як бачите, управління TRIS / DDR взагалі немає. Підключені MOSFET, використовувані в звичайній роботі, є "слабкими" - вони досить малі (низький Idss), що зовнішній вихід, підключений до штифта, може низько підвести псевдо-двонаправлену лінію порту.


Дякую за пояснення. Я не працював з обладнанням деякий час, тому мені важко зрозуміти пояснення з опису. Ви б не хотіли надати зображення? Скажіть, як виглядало б апаратне забезпечення для налаштування штифтів на сучасному процесорі та як воно виглядає на 8051? Я б дуже цінував це.
флешберг

Що ви маєте на увазі під обладнанням? Внутрішня схема GPIO мікросхеми?
Spehro Pefhany

Це правильно. Якась діаграма була б дуже корисною.
спалах

16

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

Отже, роблячи це так, як вам рекомендували, уникайте збоїв на виході, які можуть варіюватися від нешкідливих до катастрофічних, залежно від того, з чим підключений штифт.


Спасибі. То як же старі процесори, чому це для них не має значення? Старий = Intel 8051
flashburn

Я не знайомий з 8051. Виходячи з того, що сказали ваші колеги, якщо один і той же реєстр налаштовує і напрямок, і значення, це не має значення, оскільки компілятор оптимізує два записи в одне.
Нік Джонсон

2
Мабуть, все-таки було б корисно робити це "новим" способом для старих процесорів також з вищезгаданих причин. До різних оросесорів можуть бути різні вимоги, різні постачальники можуть дати кращі пропозиції, ніж інші, а різні компанії / роботодавці / команди можуть мати різну політику щодо таких деталей.
Біллт

2
дійсно ... завжди вважайте, що DIO підключений до орбітального лазера приреченості;)
Майкл

4

Якщо припустити, що напрямок за замовчуванням є вхідним (наприклад, High-Z, що має сенс, оскільки ми не хочемо, щоб MCU примушувало будь-яке значення на підключених лініях), такий порядок настройки порту є кращим, але не є необхідним. Насправді це потрібно, коли ваша програма вимагає, щоб при запуску значення порту не було, скажімо 1. Тоді ви встановите значення, 0а потім зміните напрямок. У цьому випадку ви уникаєте можливого моментального «збою» між налаштуванням напрямку та значенням, що може призвести до шипу на цьому штирі. І це справедливо для всіх процесорів, які мають таку логіку, і не тільки нових.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.