Работа с портами ввода/вывода LPC1114.
Работа с периферийными портами в LPC11xx организована достаточно просто. Текущие состояния линий вывода/вывода находятся в регистре GPIOxDATA, где x – номер порта. Направление работы отдельных линий на вход или выход задается в регистре GPIOxDIR. При этом значение 0 в бите GPIOxDIR, соответствующем номеру линии, означает, что линия настроена на вход, 1 – на выход. После сброса все линии работают как входные. Перед началом работы проводится настройка GPIO. Алгоритм настройки работы с GPIO состоит из следующих действий:
- Подключение GPIO к шине AHB. Можно не делать, так как после сброса подключение устанавливается по умолчанию.
- Настройка направления работы отдельных линий, выполняется установкой соответствующих битов в GPIOxDIR.
- При необходимости, настройка подтягивающих резисторов. По умолчанию, после сброса включен pull-up резистор.
- Настройка генерации прерываний, также при необходимости.
После выполнения этих действий появляется возможность работы с линиями дискретного ввода/вывода. Доступно два режима: классическая работа со всем портом с помощью регистра GPIOxDATA и доступ к отдельным битам с помощью маски.
Работа с регистром GPIOxDATA.
В режиме доступа ко всему регистру целиком, пользователь может считывать и записывать состояние одновременно всех линий. Делается это через структуру LPC_GPIOx->DATA.
Работа с отдельными линиями.
Работа с отдельными линиями выполняется с помощью операции маскирования. Это означает, что вначале необходимо установить маску, в которой единицы в отдельных разрядах будут разрешать изменение данных в соответствующих разрядах GPIOxDATA.
Например, для доступа ко всему регистру значение маски 0x3FFC, а чтобы установить высокий логический уровень на 5 линии порта GPIO3, необходимо записать следующее выражение:
LPC_GPIO3->MASKED_ACCESS[32] = 32;
Здесь 32 - значение равное 2 в 5 степени означает разрешение работы с 5 битом GPIOxDATA и соответственно с пятой линией порта. Для установки одновременно 5 и 0 линии выражение примет вид:
LPC_GPIO3->MASKED_ACCESS[33] = 33;
Значение в правой части может быть любым, главное чтобы отдельные биты двоичного представления соответствовали нужным данным (32d=10000b, 33d=10001b).
Настройка подтягивающих резисторов.
Каждая линия ввода/вывода в LPC11xx имеет отдельный регистр конфигурации IOCON_PIOx_n, где x-номер порта, n-номер линии. Эти регистры позволяют подключать дополнительные периферийные модули, а также подтягивающие резисторы. За последние отвечают биты 4 и 3 каждого регистра. Их возможные комбинации имеют следующие функции:
- 00 – не активно
- 01 – подтягивающий резистор к общей шине (pull-down)
- 10 - подтягивающий резистор к шине питания (pull-up)
- 11 – мультипликативный режим. Подключает подтягивающий резистор к шине питания, если на входе присутствует логическая 1, и к земле, если на входе логический 0. Данный режим используется для работы с неустойчивыми сигналами.