ARM Embedded Tutorial - Simple GPIO on and off output/ru
│ Deutsch (de) │ English (en) │ русский (ru) │
Простой ввод и вывод GPIO
Порт состоит из «16 контактов», поэтому в большинстве регистров используются младшие «16 бит».
Исключение: «CRx» и «BSRR», с «BSRR» вы можете использовать старшие 16 бит для установки контактов.
Регистры доступа к порту
Для доступа к GPIO доступны следующие регистры:
- CRL — низкий регистр конфигурации
- CRH — высокий регистр конфигурации
- IDR - регистр входных данных
- ODR - регистр выходных данных
- BSRR — регистр сброса набора битов.
- BRR - регистр сброса битов
- LCKR - Регистр блокировки конфигурации порта
Во всех регистрах, кроме CRL и CRH, каждый бит соответствует выводу микроконтроллера.
Включить GPIO
Прежде чем вы сможете получить доступ к GPIO, вам необходимо включить его. Без этого доступ невозможен! Для PortA – PortC это делается следующим образом.
RCC.APB2ENR := RCC.APB2ENR or (% 111 shl 2);
Прямое манипулирование портом
Прежде чем вы сможете переключить вывод GPIO на ВЫСОКИЙ уровень, вам необходимо настроить его как выход. Это делается через регистры CRL и CRH.
Для этих мини-примеров я обычно выбираю «Контакт 13 порта C», потому что к этому выводу подключен светодиод STM32F103C.
Внимание: Светодиод загорается при подключении анода к источнику питания.
CRx - Установить функцию контакта
Для настройки функции доступен один полубайт (4 бита). Контакт 13 порта C на выходе. Поскольку 13 больше, чем 7, для этого используется ВЫСОКИЙ регистр CRH. 13 - 8 = 5; Это пятый полубайт в CHR. Pin0–Pin7 будет настроен с использованием CHL.
PortC.CRH := $00300000;
IDR - считать весь порт
// На контакте 13 ВЫСОКИЙ уровень?
Result := PortC.ODR and (1 shl 13) > 0;
ODR - Записать весь порт
С помощью этой функции записывается весь порт сразу.
// Только контакт 13 установлен на ВЫСОКИЙ уровень.
PortC.ODR := 1 shl 13;
// Все контакты в НИЗКОМ уровне.
PortC.ODR := 0;
BSRR - Один контакт на НИЗКИЙ уровень
С помощью этой функции вы можете установить отдельные контакты на «НИЗКИЙ».
// Устанавливаем только вывод 13 на НИЗКИЙ уровень, остальные остаются неизменными.
PortC.BSRR := 1 shl 13;
BSRR - Изменить весь порт, используя битовую маску
С помощью этой функции вы можете установить отдельные контакты на «НИЗКИЙ».
// Установите только PIN13 на НИЗКИЙ, PIN12 на ВЫСОКИЙ, остальные остаются неизменными.
PortC.BSRR := (1 shl 13) + ((1 shl 12) shl 16);
BRR - Один контакт на ВЫСОКИЙ
С помощью этой функции отдельные контакты могут быть установлены на «ВЫСОКИЙ».
// Устанавливаем только контакт 13 на ВЫСОКИЙ уровень, остальные остаются неизменными.
PortC.BSRR := 1 shl 13;
Старшие 16 бит BSRR соответствуют 16 битам BRR.
См. также
- ARM Embedded Tutorials Overview