Программирование ARM AT91SAM7 Parallel Input/Output Controller (PIO) Fri, December 13 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


AT91SAM7 Parallel Input/Output Controller (PIO) Печать
Добавил(а) microsin   

Контроллер параллельного ввода/вывода (Parallel Input/Output Controller, сокращенно PIO) микроконтроллера AT91SAM7 (ARM7 компании Atmel) управляет до 32 полностью программируемых портов ввода/вывода. Каждая такая программируемая ножка микроконтроллера может быть выделена как простой программируемый цифровой порт, работающий на вход или выход (GPIO), или назначена для выполнения функции встроенного в кристалл микроконтроллера периферийного устройства (SPI, CAN, UART и т. д.). Это гарантирует эффективную оптимизацию использования выводов кристалла микроконтроллера.

Каждая ножка ввода/вывода связана с номером бита во всех 32-битных регистрах, используемых в интерфейсе программирования (см. ниже раздел "Интерфейс программирования PIO").

Каждая ножка ввода/вывода (I/O) контроллера PIO предоставляет следующие функции:

• Детектирование изменения входного логического сигнала с возможностью генерации прерывания по этому событию.
• Фильтр входных помех/иголок (glitch filter), вырезающий входные импульсы, которые по длительности меньше половины периода тактового сигнала микроконтроллера.
• Мощная поддержка управления выходным сигналом порта, позволяющая предоставить двухтактный выходной буфер или буфер с открытым стоком.
• Управление встроенным верхним нагрузочным резистором (pull-up) на каждой ножке I/O.
• Информация о состоянии входов и управление выходами.

Контроллер PIO также предоставляет функцию синхронного вывода до 32 бит данных за одну операцию записи.

ARM7 PIO block diagram fig27 1

Рис. 27-1. Блок-диаграмма PIO.

ARM7 PIO application block diagram fig27 2

Рис. 27-2. Принцип использования PIO в firmware микроконтроллера.

[Зависимости PIO от ресурсов микроконтроллера]

Мультиплексирование выводов. Каждый вывод микроконтроллера можно программно конфигурировать либо только для использования обычного сигнала ввода/вывода общего назначения (general-purpose I/O, GPIO) line only, или как линия сигнала, мультиплексируемая на одно или два устройства периферийного ввода/вывода (SPI, CAN, UART и т. д.). Поскольку мультиплексирование определено аппаратно, и следовательно зависит от модели микроконтроллера, то разработчик системы должен тщательно определить конфигурацию контроллеров PIO, которая может потребоваться для приложения firmware. Когда ножка порта используется только как вывод GPIO, например она не мультиплексируется с каким-либо встроенным в кристалл микроконтроллера периферийным устройством, программирование контроллера PIO в контексте назначения для периферийного устройства не дает никакого эффекта, и контроллер PIO может только управлять состоянием вывода (например, какой нужно выдавать лог. уровень на выходе) и его конфигурацией (например, подключен ли на нем pull-up резистор, и как настроен вывод - на вход или выход).

Внешние сигналы прерывания (External Interrupt Lines). Сигналы прерываний FIQ (быстрое прерывание) и IRQ0 .. IRQn обычно мультиплексируются с помощью контроллеров PIO. Однако нет необходимости назначать ножку I/O на функцию прерывания, поскольку контроллер PIO не оказывает влияния на входы и сигналы прерывания (FIQ или IRQ), которые используются как входы.

Управление питанием. Контроллер управления питанием (Power Management Controller, PMC [2]) управляет поступлением тактовых сигналов на контроллер PIO, чтобы можно было управлять энергопотреблением (когда тактовый сигнал отключен, то ток потребления микроконтроллера уменьшается). Запись в любой регистр интерфейса программирования PIO не требует разрешения тактовой частоты для PIO. Это означает, что конфигурировать сигналы I/O микроконтроллера не требует разрешения тактирования контроллера PIO.

Однако, когда такты отключены, доступны не все функциональные возможности PIO. Обратите внимание, что прерывание по изменению логического уровня входного сигнала (Input Change Interrupt) и чтение уровня сигнала на входе требуют разрешения подачи тактовой частоты.

После аппаратного сброса тактирование PIO по умолчанию запрещено.

Пользователь должен сконфигурировать PIO перед тем, как осуществлять доступ к информации любого входного сигнала.

Генерация прерываний. В контексте обработки прерывания контроллеры PIO считаются периферийными устройствами. Это означает, что сигналы прерывания контроллера PIO подключены среди источников прерывания 2 .. 31. Обратитесь к значению идентификатора периферии контроллера PIO в даташите на используемый микроконтроллер, чтобы определить источники прерывания, выделенные для контроллеров PIO.

Контроллер PIO может генерировать прерывание только в том случае, если для контроллера PIO разрешено тактирование (это осуществляется программированием PMC [2]).

[Функциональное описание PIO]

Один контроллер PIO (в микроконтроллере AT91SAM7 их несколько, PIOA, PIOB и т. д.) предоставляет до 32 полностью программируемых линии ввода/вывода. Основная логика управления показана на рис. 27-3. В этом описании отображен один такой сигнал, но всего их 32, каждый из которых соответствует возможному индексу 0..31.

ARM7 PIO IO Line Control Logic fig27 3

Рис. 27-3. I/O Line Control Logic.

Управление верхним нагрузочным резистором (pull-up). Каждый сигнал I/O разработан со встроенным pull-up резистором. Этот резистор можно разрешить (подключить) или запретить (отключить) путем записи в разряды соответствующих регистров PIO_PUER (Pull-up Enable Register) и PIO_PUDR (Pull-up Disable Resistor). Запись в эти регистры отражается установкой или очисткой соответствующих бит в регистре PIO_PUSR (Pull-up Status Register). Прочитанная лог. 1 в разряде регистра PIO_PUSR означает, что pull-up на этой ножке запрещен, и прочитанный лог. 0 означает, что pull-up разрешен.

Управление pull-up резистором возможно в любом случае, независимо от конфигурации сигнала ввода вывода (т. е. независимо от того, как она настроена - или как вывод периферийного устройства, или как порт GPIO).

После сброса все резисторы pull-up по умолчанию разрешены, т. е. в регистр PIO_PUSR сбрасывается в значение 0x0.

Ножка GPIO или ножка для периферийного устройства. Когда вывод мультиплексирован с одним или двумя функциями встроенных в кристалл периферийных устройств, выбор управляется регистрами PIO_PER (PIO Enable Register) и PIO_PDR (PIO Disable Register). Регистр PIO_PSR (PIO Status Register) показывает результат записи в эти регистры, и показывают, управляется ли вывод соответствующим периферийным устройством или контроллером PIO. Значение 0 показывает, что вывод управляется соответствующим встроенным в кристалл периферийным устройством, выбранным регистром PIO_ABSR (AB Select Status Register). Значение 1 показывает, что вывод управляется контроллером PIO.

Если ножка используется как порт GPIO (т. е. она не мультиплексирована со встроенным в кристалл микроконтроллера периферийным устройством), регистры PIO_PER и PIO_PDR не оказывают никакого эффекта, и чтение PIO_PSR возвратит 1 для соответствующего бита.

После сброса обычно сигналы I/O по умолчанию управляются контроллером PIO, например PIO_PSR сбрасывается в 1. Однако для некоторых случаев важно управлять сигналами PIO со стороны периферийного устройства (как это необходимо для сигналов выборки микросхем памяти, которые должны быть неактивны после сброса или сигналов адреса, которые должны быть переведены в 0 для загрузки из внешней памяти). Таким образом, значение сброса для регистра PIO_PSR определяется маркой микроконтроллера, в зависимости от мультиплексирования функциональных возможностей выводов.

Выбор Peripheral A или B. Контроллер PIO предоставляет мультиплексирование до 2 периферийных функций на одном выводе порта. Выбор выполняется записью в регистр PIO_ASR (A Select Register) и PIO_BSR (Select B Register). PIO_ABSR (AB Select Status Register) показывает, какой сигнал периферийного устройства в настоящий момент выбран. Для каждого вывода соответствующий бит в состоянии лог. 0 показывает, что выбрана функция peripheral A, в то время как соответствующий бит в состоянии лог. 1 показывает, что выбрана функция peripheral B.

Обратите внимание, что мультиплексирование сигналов peripheral A и B влияет только на выходные сигналы. Периферийные входные сигналы всегда подключены к выводу входа.

После сброса PIO_ABSR находится в состоянии лог. 0, и это показывает, что все сигналы PIO сконфигурированы для функций peripheral A. Однако peripheral A обычно не управляют выводом, поскольку контроллер PIO сбрасывается в режим сигнала ввода/вывода (GPIO).

Запись в PIO_ASR и PIO_BSR управляет состоянием PIO_ABSR независимо от конфигурации вывода. Однако назначение для вывода функции периферийного устройства требует записи в соответствующий регистр выбора периферийного устройства (PIO_ASR или PIO_BSR) в дополнение к записи в PIO_PDR.

Управление выходом. Когда сигнал I/0 назначен под функцию периферийного устройства, например когда соответствующий бит в регистре PIO_PSR находится в состоянии лог. 0, управление сигналом I/O осуществляется встроенным периферийным устройством микроконтроллера. Peripheral A или B, в зависимости от значения в регистре PIO_ABSR, определяет, работает ли вывод как выход, или нет.

Когда сигнал I/O управляется контроллером PIO, вывод может быть сконфигурирован как выход. Это осуществляется записью в регистры PIO_OER (Output Enable Register) и PIO_ODR (Output Disable Register). Результат этих операций записи отображается в регистре PIO_OSR (Output Status Register). Когда бит в этом регистре читается как 0, то соответствующий сигнал I/O используется только как вход. Когда бит читается как 1, то соответствующий сигнал I/O работает как выход и управляется программированием контроллера PIO.

Уровень, который выставлен на выходе, определяется записью в регистры PIO_SODR (Set Output Data Register) и PIO_CODR (Clear Output Data Register). Результат этих операций записи отображается в регистре PIO_ODSR (Output Data Status Register), который показывает логические уровни на выходных линиях I/O. Запись в PIO_OER и PIO_ODR управляет состоянием PIO_OSR независимо от того, как управляется вывод - или от контроллера PIO, или от периферийного устройства. Эта позволяет конфигурировать сигнал I/O перед установкой его под управление контроллера PIO.

Подобным образом запись в регистры PIO_SODR и PIO_CODR влияет на содержимое регистра PIO_ODSR. Это важно, поскольку определяет первый уровень, который выдается на выходной сигнал I/O.

Синхронный вывод данных. Управление параллельными шинами с использованием нескольких контроллеров PIO требует двух последовательных операций записи в регистры PIO_SODR и PIO_CODR соответствующих контроллеров PIO. Это может привести к нежелательным переходным значениям на параллельной шине. Контроллер PIO предоставляет прямое управление выходами PIO за один доступ на запись в регистр PIO_ODSR (Output Data Status Register). Будут записаны только биты, демаскированные регистром PIO_OWSR (Output Write Status Register). Биты маски в регистре PIO_OWSR устанавливаются записью в регистр PIO_OWER (Output Write Enable Register), и очищаются записью в регистр PIO_OWDR (Output Write Disable Register).

После сброса синхронный вывод данных для всех сигналов I/O запрещен, поскольку состояние по умолчанию регистра PIO_OWSR сбрасывается в значение 0x0.

Совмещенное управление выходом (открытый сток). Каждая ножка I/O может быть запрограммирована независимо от других для работы как выход с открытым стоком (Open Drain), это так называемая функция совмещенного управления выходом (Multi Drive). Эта функция позволяет параллельно соединить друг с другом несколько выходов I/O, которые могут переводиться в состояние лог. 0 каждым из подключенных на этот сигнал устройств (так называемая монтажная функция ИЛИ-НЕ). Обычно для такого функционала требуется подключение внешнего верхнего нагрузочного резистора pull-up (или подключения внутреннего резистора pull-up) это обычно требуется для гарантии формирования на полученном сигнале уровня лог. 1.

Эта функция Multi Drive управляется регистрами PIO_MDER (Multi-driver Enable Register) и PIO_MDDR (Multi-driver Disable Register). Multi Drive может быть выбрано независимо от того, управляется ли сигнал I/O контроллером PIO, либо функцией периферийного устройства. Регистр PIO_MDSR (Multi-driver Status Register) показывает, как сконфигурирован вывод для поддержки внешних драйверов.

После сброса функция Multi Drive для всех выводов запрещена, т. е. PIO_MDSR сбрасывается в значение 0x0.

Параметры времени для изменения состояния выхода. На рис. 27-4 показано, как выходы управляются записью либо в регистр PIO_SODR, либо в регистр PIO_CODR, либо прямой записью в регистр PIO_ODSR. Этот последний случай разрешен только тогда, когда установлен соответствующий бит в регистре PIO_OWSR. Рис. 27-4 также показывает, когда доступна обратная связь в регистре PIO_PDSR.

ARM7 PIO Output Line Timings fig27 4

Рис. 27-4. Диаграммы времени управления выходом.

Входы. Логический уровень на каждом из сигналов I/O может быть прочитан через регистр PIO_PDSR (Pin Data Status Register). Этот регистр показывает уровень на ножке I/O независимо от её конфигурации, т. е. независимо от того, работает ли ножка уникально как вход, либо управляется контроллером PIO, либо управляется встроенным периферийным устройством микроконтроллера.

Чтение уровней I/O требует наличия разрешенного тактирования контроллера PIO, иначе чтения PIO_PDSR будет возвращать уровни на сигналах I/O в тот момент времени, когда такты PIO были запрещены.

Фильтрация иголок на входе (Input Glitch Filtering). На каждом выводе порта I/O присутствует фильтр помех по входу, программируемый независимо от других выводов портов I/O, это так называемый glitch filter. Когда этот фильтр разрешен, импульсные выбросы на входе с длительностью меньше чем 1/2 периода главной тактовой частоты (Master Clock, MCK) будут автоматически отбрасываться, и не будут проходить в аппаратуру микроконтроллера, в то время импульсы с длительностью 1 такт MCK или более длинные будут восприняты. Импульсы с длительностями между 1/2 периода MCK и 1 периодом MCK могут случайным образом восприняты или нет, в зависимости от того, в какой момент времени эти импульсы появились. Таким образом, чтобы импульс был гарантированно воспринят, его длительность должна превышать 1 такт MCK, в то время как для гарантированной фильтрации входных помех требуется, чтобы их длительность была не больше 1/2 такта MCK. Этот фильтр, если он разрешен, вносит дополнительную задержку входного сигнала на 1 такт MCK, если изменение сигнала на входе произошло перед фронтом нарастания. Однако эта задержка не наблюдается, если изменение сигнала на входе произошло перед спадом уровня на входе. Это показано на рис. 27-5.

ARM7 PIO Input Glitch Filter Timing fig27 5

Рис. 27-5. Интервалы времени работы фильтра входных помех.

Фильтры помех управляются настройкой регистров PIO_IFER (Input Filter Enable Register), PIO_IFDR (Input Filter Disable Register), и состояние активности фильтра можно отследить в регистре PIO_IFSR (Input Filter Status Register). Запись в PIO_IFER и PIO_IFDR соответственно устанавливает и очищает биты в регистре PIO_IFSR. Состояние регистра PIO_IFSR определяет, разрешен или запрещен входной фильтр на каждом разряде порта I/O.

Когда фильтр помех разрешен, это не влияет на поведение входов периферийных устройств. Фильтр влияет только на значения, которые читаются в регистре PIO_PDSR, и также фильтр влияет на детектирование прерывания по изменению уровня входного сигнала. Фильтры помех требуют, чтобы было разрешено тактирование контроллера PIO.

Прерывание по изменению уровня на входе (Input Change Interrupt). Контроллер PIO может быть запрограммирован для генерации прерывания, когда обнаружено изменение входа сигнала I/O. Прерывание Input Change управляется записью в регистр PIO_IER (Interrupt Enable Register) и PIO_IDR (Interrupt Disable Register), которые соответственно разрешают и запрещают прерывание по изменению входа, что отражается в установке и очистке бит регистра PIO_IMR (Interrupt Mask Register). Детектирование изменения сигнала на входе возможно только путем сравнения двух следующих друг за другом по времени выборок входного уровня на входе, при этом должно быть разрешено тактирование контроллера PIO. Прерывание Input Change доступно независимо от конфигурации порта ввода вывода, т. е. он может быть сконфигурирован только как вход, управляться контроллером PIO как выход или назначен на управление функцией периферийного устройства микроконтроллера.

Когда было детектировано изменение уровня на ножке порта I/O, будет установлен соответствующий бит в регистре PIO_ISR (Interrupt Status Register). Если установлен соответствующий бит регистра PIO_IMR, то будет выставлено прерывание контроллера PIO. Сигналы прерывания от 32 каналов суммируются функцией ИЛИ друг с другом для генерации одного сигнала прерывания для контроллера прерываний AIC (Advanced Interrupt Controller).

Когда программа читает PIO_ISR, все прерывания автоматически очищаются. Это означает, что все ожидающие прерывания, которые обозначены состоянием регистра PIO_ISR, должны быть обработаны после единственной операции чтения регистра PIO_ISR.

ARM7 PIO Input Change Interrupt Timings fig27 6

Рис. 27-6. Интервалы времени прерывания по изменению входа (Input Change Interrupt).

[Пример программирования I/O]

Пример программирования, показанный в таблице 27-1, используется для определения следующей конфигурации:

• 4-разрядный выходной порт для сигналов I/O с номерами бит 0 .. 3 (это должно быть сконфигурировано одной операцией записи), с открытым стоком, с разрешенным внутренним pull-up резистором.
• 4 выходных сигнала на портах с номерами разрядов 4 .. 7 (например, для управления светодиодами), которые можно переключать как в лог. 1, так и в лог. 0, использование внутреннего pull-up резистора отключено.
• 4 входных сигнала на разрядах 8 .. 11 (чтобы можно было, к примеру, читать состояние кнопок), с разрешенными внутренними pull-up резисторами, включенными фильтрами помех и разрешенными прерываниями по изменению уровня на входе.
• 4 входных сигнала с номерами разрядов 12 .. 15, чтобы с помощью опроса читать состояние внешнего устройства (т. е. прерывание по изменению уровне не используется), без использования подключения внутреннего pull-up резистора и без фильтра помех.
• Сигналы I/O с номерами разрядов 16 .. 19, которым назначены функции peripheral A, с включенными pull-up резисторами.
• Сигналы I/O с номерами разрядов 20 .. 23, которым назначены функции peripheral B, с выключенными pull-up резисторами.
• Сигналы I/O с номерами разрядов 24 .. 27, которым назначены функции peripheral A, с включенным прерыванием по изменению входного сигнала (Input Change Interrupt) и включенными pull-up резисторами.

Таблица 27-1. Пример программирования ножек микроконтроллера.

Регистр (мнемоника)
Записываемое значение
PIO_PER 0x0000 FFFF
PIO_PDR 0x0FFF 0000
PIO_OER 0x0000 00FF
PIO_ODR 0x0FFF FF00
PIO_IFER 0x0000 0F00
PIO_IFDR 0x0FFF F0FF
PIO_SODR 0x0000 0000
PIO_CODR 0x0FFF FFFF
PIO_IER 0x0F00 0F00
PIO_IDR 0x00FF F0FF
PIO_MDER 0x0000 000F
PIO_MDDR 0x0FFF FFF0
PIO_PUDR 0x00F0 00F0
PIO_PUER 0x0F0F FF0F
PIO_ASR 0x0F0F 0000
PIO_BSR 0x00F0 0000
PIO_OWER 0x0000 000F
PIO_OWDR 0x0FFF FFF0

// Пример управления портом для включения/выключения светодиода.
// Светодиод подключен к 21-му разряду порта PIOB.
#include "AT91SAM7X256.h"
 
// Вывод порта светодиода:
#define LED_PIN (1<<21)
// Макрос для переключения вывода в лог. 0:
#define LED0() (AT91C_BASE_PIOB->PIO_CODR = LED_PIN)
// Макрос для переключения вывода в лог. 1:
#define LED1() (AT91C_BASE_PIOB->PIO_SODR = LED_PIN)
// Макрос для переключения вывода в противоположное состояние:
#define LEDCHANGE() {(AT91C_BASE_PIOB->PIO_ODSR & LED_PIN)?LED0():LED1();}
 
//*----------------------------------------------------------------------------
//* Функция разрешает тактирование периферйного устройства
//*----------------------------------------------------------------------------
__inline void AT91F_PMC_EnablePeriphClock (
   AT91PS_PMC pPMC,           // указатель на контроллер PMC
   unsigned int periphIds)    // идентификаторы периферийных устройств
                              // в виде OR-маски
{
   pPMC->PMC_PCER = periphIds;
}
 
//*----------------------------------------------------------------------------
//* Функция разрешает PIO в режиме выхода output mode
//*----------------------------------------------------------------------------
__inline void AT91F_PIO_CfgOutput(
   AT91PS_PIO pPio,           // указатель на контроллер PIO
   unsigned int pioEnable)    // OR-маска вывода, который должен быть разрешен
{
   pPio->PIO_PER = pioEnable; // переключение вывода в режим GPIO
   pPio->PIO_OER = pioEnable; // конфигурирование порта как выхода
}
 
// Разрешение тактирования PIOB:
AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOB );
// Конфигурация вывода порта для светодиода в режиме выхода:
AT91F_PIO_CfgOutput(AT91C_BASE_PIOB, LED_PIN);
 
// Вывод лог. 0:
LED0();
// Вывод лог. 1:
LED0();
// Переключение в противоположное состояние:
LEDCHANGE();

// Пример определения лог. уровня на входе с целью узнать, установлена ли
// карта памяти в слот, или нет. На вход подается сигнал с контакта установки
// в слот карты памяти SD. Этот сигнал подключен к 26-му биту порта PIOB.
 
// Маска для ножки порта:
#define CARD_SENSE_SW   (1<<26)
 
//*----------------------------------------------------------------------------
//* Функция разрешает PIO в режиме входа
//*----------------------------------------------------------------------------
__inline void AT91F_PIO_CfgInput(
   AT91PS_PIO pPio,             // указатель на контроллер PIO
   unsigned int inputEnable)    // OR-маска выводов
{
   // Запрет работы порта в режиме выхода:
   pPio->PIO_ODR  = inputEnable;
   // Разрешение работы порта:
   pPio->PIO_PER  = inputEnable;
}
 
// Разрешение тактирования PIOB:
AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOB );
// Конфигурация ножки карточки (0: карта SD вставлена, 1: нет)
AT91F_PIO_CfgInput(AT91C_BASE_PIOB, CARD_SENSE_SW);
 
//*----------------------------------------------------------------------------
//* Функция определяет, установлена ли карта SD в слот. Если карта установлена,
//* то будет возвращено значение true, иначе будет возвращено false.
//*----------------------------------------------------------------------------
boolean isCardInSlot (void)
{
   if (CARD_SENSE_SW & AT91F_PIO_GetInput(AT91C_BASE_PIOB))
      return false;
   else
      return true;
}

[Интерфейс программирования PIO]

Каждая ножка I/O управляется контроллером PIO Controller связанным с ней битом в каждом из регистров интерфейса программирования контроллера PIO. Каждый регистр размером в 32 бита. Если параллельный сигнал I/O не определен, то запись в соответствующий бит не даст никакого эффекта. Неопределенные биты будут прочитаны как 0. Если сигнал I/O не мультиплексируется с каким-либо периферийным устройством, то эта линия I/O управляется контроллером PIO, и бит в в регистре PIO_PSR систематически будет читаться как лог. 1.

В микроконтроллере ARM7 обычно имеется несколько контроллеров PIO, каждый из которых отвечает за определенную группу из 32 выводов, выведенных из корпуса микроконтроллера. Количество контроллеров PIO зависит от марки микроконтроллера, обратитесь за информацией к даташиту. Таблица 27-2 в первом столбце показывает смещения от начального базового адреса, который назначен контроллеру PIO (адрес указан в даташите на микроконтроллер). Например, у микроконтроллеров AT91SAM7X128, AT91SAM7X256, AT91SAM7X512 имеется 2 контроллера PIO: PIOA (базовый адрес 0xFFFFF400) и PIOB (базовый адрес 0xFFFFF600).

Таблица 27-2. Регистры PIO.

Смещение Регистр Имя Доступ Сброс
0x0000 PIO Enable Register (регистр разрешения) PIO_PER W -
0x0004 PIO Disable Register (регистр запрещения) PIO_PDR W -
0x0008 PIO Status Register (регистр состояния) PIO_PSR R (1)
0x000C Зарезервировано - - -
0x0010 Output Enable Register (регистр разрешения выхода) PIO_OER W -
0x0014 Output Disable Register (регистр запрещения выхода) PIO_ODR W -
0x0018 Output Status Register (регистр состояния выхода) PIO_OSR R 0x00000000
0x001C Зарезервировано - - -
0x0020 Glitch Input Filter Enable Register (регистр разрешения входного фильтра помех) PIO_IFER W -
0x0024 Glitch Input Filter Disable Register (регистр запрещения входного фильтра помех) PIO_IFDR W -
0x0028 Glitch Input Filter Status Register (регистр состояния входного фильтра помех) PIO_IFSR R 0x00000000
0x002C Зарезервировано - - -
0x0030 Set Output Data Register (регистр установки выхода) PIO_SODR W -
0x0034 Clear Output Data Register (регистр сброса выхода) PIO_CODR W -
0x0038 Output Data Status Register (регистр состояния выхода) PIO_ODSR R или R/W(2) -
0x003C Pin Data Status Register (регистр состояния вывода) PIO_PDSR R (3)
0x0040 Interrupt Enable Register (регистр разрешения прерываний) PIO_IER W -
0x0044 Interrupt Disable Register (регистр запрета прерываний) PIO_IDR W -
0x0048 Interrupt Mask Register (регистр маски прерываний) PIO_IMR R 0x00000000
0x004C Interrupt Status Register(4) (регистр состояния прерываний) PIO_ISR R 0x00000000
0x0050 Multi-driver Enable Register (регистр разрешения выходов с открытым стоком) PIO_MDER W -
0x0054 Multi-driver Disable Register (регистр запрещения выходов с открытым стоком) PIO_MDDR W -
0x0058 Multi-driver Status Register (регистр состояния выходов с открытым стоком) PIO_MDSR R 0x00000000
0x005C Зарезервировано - - -
0x0060 Pull-up Disable Register (регистр запрещения внутренних верхних подтягивающих резисторов) PIO_PUDR W -
0x0064 Pull-up Enable Register (регистр разрешения внутренних верхних подтягивающих резисторов) PIO_PUER W -
0x0068 Pad Pull-up Status Register (регистр состояния внутренних верхних подтягивающих резисторов) PIO_PUSR R 0x00000000
0x006C Зарезервировано - - -
0x0070 Peripheral A Select Register(5) (регистр выбора периферийных устройств группы A) PIO_ASR W -
0x0074 Peripheral B Select Register(5) (регистр выбора периферийных устройств группы B) PIO_BSR W -
0x0078 AB Status Register(5) (регистр состояния выбора периферии группы A или B) PIO_ABSR R 0x00000000
0x007C...0x009C Зарезервировано - - -
0x00A0 Output Write Enable (регистр разрешения синхронной установки выходов) PIO_OWER W -
0x00A4 Output Write Disable (регистр запрета синхронной установки выходов) PIO_OWDR W -
0x00A8 Output Write Status Register (регистр состояния синхронной установки выходов) PIO_OWSR R 0x00000000
0x00AC Зарезервировано - - -

Примечания:

(1). Значение при сбросе PIO_PSR зависит от марки микроконтроллера.
(2). PIO_ODSR работает только на запись (R) или на чтение-запись (R/W) в зависимости от настроек в регистре PIO_OWSR.
(3). Значение при сбросе в регистре PIO_PDSR зависит от уровней на выводах портов. Чтение уровней на выводах требует разрешение тактирования контроллера PIO, иначе регистр PIO_PDSR будет читаться со значениями, которые были на выводах в момент запрета тактирования контроллера PIO.
(4). Значения после сброса в регистре PIO_ISR равны 0x0. Однако первое чтение регистра может показать другие значения, поскольку могли произойти изменения сигналов на выводах.
(5). Только этот набор регистров очищает свое состояние путем записи 1 в первый регистр, и устанавливает свое состояние путем записи 1 во второй регистр.

Регистр разрешения управления выводом со стороны контроллера PIO (PIO Controller PIO Enable Register). Работает только на запись.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
P31
P30 P29 P28 P27 P26 P25 P24 P23 P22 P21 P20 P19 P18 P17
P16
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
P15
P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0

P0-P31: PIO Enable, разрешение управления выводами контроллером PIO.
0 = не оказывает эффекта.
1 = разрешает PIO для управления соответствующего вывода (запрещает управление этим выводом со стороны периферийного устройства).

Регистр запрещения управления выводом со стороны контроллера PIO (PIO Controller PIO Disable Register). Работает только на запись.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
P31
P30 P29 P28 P27 P26 P25 P24 P23 P22 P21 P20 P19 P18 P17
P16
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
P15
P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0

P0-P31: PIO Disable, запрет управления выводами контроллером PIO.
0 = не оказывает эффекта.
1 = запрещает PIO для управления соответствующего вывода (разрешает управление этим выводом со стороны периферийного устройства).

Регистр состояния управления выводом со стороны контроллера PIO (PIO Controller PIO Status Register). Работает только на чтение.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
P31
P30 P29 P28 P27 P26 P25 P24 P23 P22 P21 P20 P19 P18 P17
P16
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
P15
P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0

P0-P31: PIO Status, состояние настройки управления выводом.
0 = управление выводом для PIO не активно (этим выводом управляет встроенное периферийное устройство).
1 = управление выводом для PIO активно (управление со стороны встроенного периферийного устройства не активно).

Регистр разрешения выхода (PIO Controller Output Enable Register). Работает только на запись.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
P31
P30 P29 P28 P27 P26 P25 P24 P23 P22 P21 P20 P19 P18 P17
P16
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
P15
P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0

P0-P31: Output Enable, разрешение работы вывода в режиме выхода.
0 = не оказывает эффекта.
1 = разрешает работу выхода на этом выводе порта.

Регистр запрета выхода (PIO Controller Output Disable Register). Работает только на запись.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
P31
P30 P29 P28 P27 P26 P25 P24 P23 P22 P21 P20 P19 P18 P17
P16
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
P15
P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0

P0-P31: Output Disable, запрет работы вывода в режиме выхода.
0 = не оказывает эффекта.
1 = запрещает работу выхода на этом выводе порта.

Регистр состояния выхода (PIO Controller Output Status Register). Работает только на чтение.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
P31
P30 P29 P28 P27 P26 P25 P24 P23 P22 P21 P20 P19 P18 P17
P16
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
P15
P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0

P0-P31: Output Status, состояние работы вывода.
0 = этот вывод работает полностью на вход.
1 = этому выводу разрешено работать как выход.

Регистр разрешения работы фильтра помех на входе (PIO Controller Input Filter Enable Register). Работает только на запись.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
P31
P30 P29 P28 P27 P26 P25 P24 P23 P22 P21 P20 P19 P18 P17
P16
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
P15
P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0

P0-P31: Input Filter Enable, разрешение входного фильтра.
0 = не оказывает эффекта.
1 = разрешает работу glitch filter на этом выводе порта.

Регистр запрета работы фильтра помех на входе (PIO Controller Input Filter Disable Register). Работает только на запись.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
P31
P30 P29 P28 P27 P26 P25 P24 P23 P22 P21 P20 P19 P18 P17
P16
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
P15
P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0

P0-P31: Input Filter Disable, запрет входного фильтра.
0 = не оказывает эффекта.
1 = запрещает работу glitch filter на этом выводе порта.

Регистр состояния входного фильтра (PIO Controller Input Filter Status Register). Работает только на чтение.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
P31
P30 P29 P28 P27 P26 P25 P24 P23 P22 P21 P20 P19 P18 P17
P16
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
P15
P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0

P0-P31: Input Filer Status, состояние работы входного фильтра помех.
0 = на этом выводе запрещена работа входного фильтра.
1 = на этом выводе работает входной фильтр.

Регистр установки данных на выходе (PIO Controller Set Output Data Register). Работает только на запись.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
P31
P30 P29 P28 P27 P26 P25 P24 P23 P22 P21 P20 P19 P18 P17
P16
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
P15
P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0

P0-P31: Set Output Data, запись в эти биты позволяет установить на выводах выхода лог. 1.
0 = не оказывает никакого эффекта.
1 = на этом выводе порта на выходе будет установлена лог. 1.

Регистр сброса данных на выходе (PIO Controller Clear Output Data Register). Работает только на запись.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
P31
P30 P29 P28 P27 P26 P25 P24 P23 P22 P21 P20 P19 P18 P17
P16
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
P15
P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0

P0-P31: Clear Output Data, запись в эти биты позволяет установить на выводах выхода лог. 0.
0 = не оказывает никакого эффекта.
1 = на этом выводе порта на выходе будет установлен лог. 0.

Регистр состояния данных на выходе (PIO Controller Output Data Status Register). Работает либо только на чтение, либо на чтение и запись.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
P31
P30 P29 P28 P27 P26 P25 P24 P23 P22 P21 P20 P19 P18 P17
P16
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
P15
P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0

P0-P31: Output Data Status, показывает логический уровень, который выводится на выходы.
0 = на выходе установлен уровень лог. 0.
1 = на выходе установлен уровень лог. 1.

Регистр состояния данных на выводе порта (PIO Controller Pin Data Status Register). Работает либо только на чтение.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
P31
P30 P29 P28 P27 P26 P25 P24 P23 P22 P21 P20 P19 P18 P17
P16
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
P15
P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0

P0-P31: Pad Data Status, показывает логический уровень, который установлен выводится на выводе порта.
0 = на выводе порта уровень лог. 0.
1 = на выводе порта уровень лог. 1.

Регистр разрешения прерывания по изменению уровня на выводе порта (PIO Controller Interrupt Enable Register). Работает только на запись.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
P31
P30 P29 P28 P27 P26 P25 P24 P23 P22 P21 P20 P19 P18 P17
P16
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
P15
P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0

P0-P31: Input Change Interrupt Enable, разрешение прерывания по изменению уровня на этом выводе порта.
0 = не оказывает эффекта.
1 = разрешает прерывание по событию изменения уровня на этом выводе порта.

Регистр запрета прерывания по изменению уровня на выводе порта (PIO Controller Interrupt Disable Register). Работает только на запись.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
P31
P30 P29 P28 P27 P26 P25 P24 P23 P22 P21 P20 P19 P18 P17
P16
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
P15
P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0

P0-P31: Input Change Interrupt Disable, разрешение прерывания по изменению уровня на этом выводе порта.
0 = не оказывает эффекта.
1 = запрещает прерывание по событию изменения уровня на этом выводе порта.

Регистр маски прерывания по изменению уровня на выводе порта (PIO Controller Interrupt Mask Register). Работает только на чтение.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
P31
P30 P29 P28 P27 P26 P25 P24 P23 P22 P21 P20 P19 P18 P17
P16
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
P15
P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0

P0-P31: Input Change Interrupt Mask, состояние разрешения прерывания по изменению уровня на этом выводе порта.
0 = на этом выводе запрещено прерывание по событию изменения уровня.
1 = на этом выводе разрешено прерывание по событию изменения уровня.

Регистр состояния прерывания по изменению уровня на выводе порта (PIO Controller Interrupt Status Register). Работает только на чтение.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
P31
P30 P29 P28 P27 P26 P25 P24 P23 P22 P21 P20 P19 P18 P17
P16
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
P15
P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0

P0-P31: Input Change Interrupt Status, состояние прерывания по изменению уровня на этом выводе порта.
0 = на этом выводе не было детектировано изменение уровня.
1 = на этом выводе было детектировано изменение уровня.

Регистр разрешения работы выводов в режиме выхода с открытым стоком (PIO Multi-driver Enable Register). Работает только на запись.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
P31
P30 P29 P28 P27 P26 P25 P24 P23 P22 P21 P20 P19 P18 P17
P16
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
P15
P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0

P0-P31: Multi Drive Enable, разрешает работу выходного драйвера в режиме открытого стока.
0 = не оказывает никакого эффекта.
1 = на этом выводе будет разрешена работа выходного драйвера в режиме открытого стока.

Регистр запрета работы выводов в режиме выхода с открытым стоком (PIO Multi-driver Disable Register). Работает только на запись.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
P31
P30 P29 P28 P27 P26 P25 P24 P23 P22 P21 P20 P19 P18 P17
P16
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
P15
P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0

P0-P31: Multi Drive Disable, запрещает работу выходного драйвера в режиме открытого стока.
0 = не оказывает никакого эффекта.
1 = на этом выводе будет запрещена работа выходного драйвера в режиме открытого стока.

Регистр состояния работы выводов в режиме выхода с открытым стоком (PIO Multi-driver Status Register). Работает только на чтение.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
P31
P30 P29 P28 P27 P26 P25 P24 P23 P22 P21 P20 P19 P18 P17
P16
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
P15
P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0

P0-P31: Multi Drive Status, состояние работы выходного драйвера в режиме открытого стока.
0 = на этом выводе запрещена работа выходного драйвера в режиме открытого стока.
1 = на этом выводе разрешена работа выходного драйвера в режиме открытого стока.

Регистр запрета подключения внутренних верхних нагрузочных резисторов (PIO Pull Up Disable Register). Работает только на запись.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
P31
P30 P29 P28 P27 P26 P25 P24 P23 P22 P21 P20 P19 P18 P17
P16
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
P15
P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0

P0-P31: Pull Up Disable, запрещает подключение внутренних верхних нагрузочных резисторов (pull-up).
0 = не оказывает никакого эффекта.
1 = на этом выводе будут отключены нагрузочные резисторы.

Регистр разрешения подключения внутренних верхних нагрузочных резисторов (PIO Pull Up Disable Register). Работает только на запись.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
P31
P30 P29 P28 P27 P26 P25 P24 P23 P22 P21 P20 P19 P18 P17
P16
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
P15
P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0

P0-P31: Pull Up Enable, разрешает подключение внутренних верхних нагрузочных резисторов (pull-up).
0 = не оказывает никакого эффекта.
1 = на этом выводе будут подключены нагрузочные резисторы.

Регистр состояния подключения верхних внутренних нагрузочных резисторов (PIO Pull Up Status Register). Работает только на чтение.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
P31
P30 P29 P28 P27 P26 P25 P24 P23 P22 P21 P20 P19 P18 P17
P16
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
P15
P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0

P0-P31: Pull Up Status, состояние подключения нагрузочных резисторов.
0 = на этом выводе подключены внутренние нагрузочные резисторы.
1 = на этом выводе отключены внутренние нагрузочные резисторы.

Регистр выбора периферийных устройств A (Peripheral A Select Register). Работает только на запись.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
P31
P30 P29 P28 P27 P26 P25 P24 P23 P22 P21 P20 P19 P18 P17
P16
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
P15
P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0

P0-P31: Peripheral A Select, выбор для вывода периферийных устройств группы A.
0 = не оказывает никакого эффекта.
1 = назначает на этом выводе функцию Peripheral A.

Регистр выбора периферийных устройств B (Peripheral B Select Register). Работает только на запись.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
P31
P30 P29 P28 P27 P26 P25 P24 P23 P22 P21 P20 P19 P18 P17
P16
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
P15
P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0

P0-P31: Peripheral B Select, выбор для вывода периферийных устройств группы B.
0 = не оказывает никакого эффекта.
1 = назначает на этом выводе функцию Peripheral B.

Регистр состояния выбора периферийных устройств A или B (PIO Peripheral A B Status Register). Работает только на чтение.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
P31
P30 P29 P28 P27 P26 P25 P24 P23 P22 P21 P20 P19 P18 P17
P16
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
P15
P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0

P0-P31: Peripheral A B Status, показывает выбор периферийной функции на выводе порта.
0 = на этом выводе порта назначена функция Peripheral A.
1 = на этом выводе порта назначена функция Peripheral B.

Регистр разрешения синхронной записи в выходы портов (PIO Output Write Enable Register). Работает только на запись.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
P31
P30 P29 P28 P27 P26 P25 P24 P23 P22 P21 P20 P19 P18 P17
P16
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
P15
P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0

P0-P31: Output Write Enable, разрешает запись в регистр PIO_ODSR для синхронного управления выходами.
0 = не оказывает никакого эффекта.
1 = разрешает запись в регистр PIO_ODSR для управления выходами.

Регистр запрета синхронной записи в выходы портов (PIO Output Write Disable Register). Работает только на запись.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
P31
P30 P29 P28 P27 P26 P25 P24 P23 P22 P21 P20 P19 P18 P17
P16
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
P15
P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0

P0-P31: Output Write Disable, запрещает запись в регистр PIO_ODSR для синхронного управления выходами.
0 = не оказывает никакого эффекта.
1 = запрещает запись в регистр PIO_ODSR для управления выходами.

Регистр состояния синхронной записи для управления выходами (PIO Output Write Status Register). Работает только на чтение.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
P31
P30 P29 P28 P27 P26 P25 P24 P23 P22 P21 P20 P19 P18 P17
P16
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
P15
P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0

P0-P31: Output Write Status, состояние разрешения синхронного управления выходами.
0 = на этом выводе порта запись в регистр PIO_ODSR не влияет на изменение выходного уровня.
1 = на этом выводе порта запись в регистр PIO_ODSR вызывает изменение выходного уровня.

[Ссылки]

1. SAM7X512 / SAM7X256 / SAM7X128 DATASHEET site:atmel.com.
2. Power Management Controller микроконтроллера AT91SAM7X.

 

Добавить комментарий


Защитный код
Обновить

Top of Page