LPC
Работа с портами ввода/вывода LPC1114.
Работа с портами ввода/вывода выполняется в каждом проекте, так как данные устройства составляют основу периферийных модулей микроконтроллера. Использование только этих портов, без применения других элементов, позволяет разработать огромное количество приложений. Но несмотря на то, что линии ввода/вывода неотъемлемая часть любого микроконтроллер, работа с ними в разных моделях может существенно отличаться. Ниже рассмотрены основные принципы, используемые в микросхемах серии LPC11xx.
Работа с периферийными портами в 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. Данный режим используется для работы с неустойчивыми сигналами.