Якщо ви ознайомилися з розділом 31 Таблиці даних, доступним звідси , тут вам можуть стати дещо зрозумілішими.
Ось підсумок того, що я знаю:
PIO розшифровується як паралельний вхід / вихід та пропонує функцію зчитування та запису декількох портів реєстрації одночасно. Там, де у таблиці даних згадується реєстр, наприклад PIO_OWER, бібліотека Arduino має макроси для доступу до них у такому форматі REG_PIO? _OWER де? є або A, B, C або D для різних доступних портів.
Я, як правило, все ще використовую функцію Arduino pinMode () для встановлення вводу / виводу на штифти, оскільки це робить код більш читабельним, ніж виклики на основі абревіатури, такі як REG_PIOC_OWER = 0xdeadbeef, але потім використовуйте прямі регістри для встановлення штифтів для продуктивність / синхронізація. Поки я нічого не робив із введенням, тому всі мої приклади базуються на результатах.
Для базового використання, ви б використовували REG_PIO? _SODR для встановлення високих вихідних ліній, а REG_PIO? _CODR для встановлення їх низьких. Наприклад, REG_PIOC_SODR = 0x00000002 встановив бит 1 (пронумерований від нуля) на PORTC (це цифровий контакт 33) високим. Усі інші штифти на PORTC залишаються незмінними. REG_POIC_CODR = 0x00000002 встановив бит 1 на низькому рівні PORTC. Знову всі інші штифти були б незмінними.
Оскільки це все ще не є оптимальним або синхронізованим, якщо ви працюєте з паралельними даними, існує реєстр, який дозволяє записувати всі 32 біти порту одним викликом. Це REG_PIO? _ODSR, тому REG_PIOC_ODSR = 0x00000002 тепер би встановив біт 1 на висоті PORTC, а всі інші біти на PORTC були б встановлені низькими миттєво в одній інструкції процесора.
Оскільки навряд чи ви потрапляли б у ситуацію, коли вам потрібно одночасно встановити всі 32 біти порту, вам потрібно буде зберегти поточне значення штифтів, виконати операцію AND, щоб замаскувати ті, які ви Якщо ви хочете змінити, виконайте операцію АБО, щоб встановити ті, які ви хочете встановити, то виконайте запис і ще раз, і це не є оптимальним. Щоб подолати це, процесор сам виконає маскування за вас. Існує регістр під назвою OWSR (реєстр запису статусу виводу), який маскує будь-які біти, які ви записуєте в ODSR, які не відповідають бітам, встановленим в OWSR.
Отже, якщо ми зателефонуємо REG_PIOC_OWER = 0x00000002 (це встановлює біт 1 високого рівня OWSR) та REG_PIOC_OWDR = 0xfffffffd (це очищає всі біти, крім біта 1 OWSR), а потім знову зателефонує REG_PIOC_ODSR = 0x00000002, цього разу лише зміниться біт 1 PORTC та всі інші біти залишаються незмінними. Зверніть увагу на те, що OWER вмикає будь-які біти , встановлені на 1 у значенні, яке ви пишете, і що OWDR вимикає будь-які біти , встановлені на 1 у значенні, яке ви пишете. Незважаючи на те, що я зрозумів це, читаючи це, мені все ж вдалося помилитися з кодом під час написання мого першого тестового коду, думаючи, що біти OWDR відключені, які не були встановлені на 1 у значенні, яке я написав.
Я сподіваюся, що це хоча б дало вам початок у розумінні PIO належного процесора. Прочитайте та п'єсу, і якщо у вас виникнуть додаткові запитання, я спробую відповісти на них.
Редагувати: Ще одне ...
Звідки ви знаєте, яким бітам ПОРТ відповідають відповідні цифрові лінії лінійки? Перевірте це: Due Pinout