Skip to main content

GPIO

Интерфейс ввода/вывода общего назначения для связи между компонентами микроконтроллера и различными периферийными устройствами.

Общая информация

Мультиплексор GPIO_MUX для каждого вывода микроконтроллера позволяет либо соединить его с портом P процессора (использовать как вывод общего назначения), либо соединить его с одним из периферийных устройств (использовать альтернативную функцию порта). Выбор альтернативной функции осуществляется записью в регистры GPIO_ALTF0 и GPIO_ALTF1.

Если вывод используется как вывод общего назначения, то блок GPIO позволяет настроить его на вход или на выход. Выбор направления для порта осуществляется записью в регистры GPIO_DIR_SET/GPIO_DIR_CLR.

Когда порт настроен как выход общего назначения, то передаваемое во вне значение определяется значением порта P процессора. Когда порт настроен как вход общего назначения, то считать значение порта можно также через порт P процессора. Порты процессора соединены с блоками GPIO следующим образом:

  • Порт P0 соединен с GPIOA;
  • Порт P2 соединен с GPIOB;
  • Порт P3 соединен с GPIOC.

Блок GPIO может сформировать прерывание при определенном уровне или изменении уровня на порту микроконтроллера.

Блок GPIO может зафиксировать фронт сигнала на выводе микроконтроллера, даже когда система находится в режиме «Глубокого сна» (c помощью асинхронного детектора фронта), и вывести систему из режима «SLEEP».

Структурная схема

Структурная схема GPIO для одного из выводов микроконтроллера
Структурная схема GPIO для одного из выводов микроконтроллера

GPIO_MUX соединяет PAD (вывод микроконтроллера) либо с портом P процессора (CPU_PORT_P), либо с одной из альтернативных функций этого вывода. GPIO_MUX управляется регистрами ALTF. Если вывод соединен с портом процессора, то направление (вход/выход) определяется регистром DIR. Если вывод соединен с альтернативной функцией, то направление (вход/выход) определяется этой альтернативной функцией (периферийным устройством DEVICEx).

В блоке GPIO присутствуют два детектора, способных формировать прерывания - синхронный (SYNCH_EDGE_DETECTOR) и асинхронный (ASYNCH_EDGE_DETECTOR). Работа детекторов управляются регистрами INTEN, INTPOL и INTTYPE. Статус прерываний сохраняется в регистре INT.

Статусы и прерывания

GPIO поддерживает два режима регистрации событий - синхронный и асинхронный. Синхронный детектор работает в рабочем режиме и в режиме «Сон процессора», но не работает в режиме «Глубокий сон». Асинхронный детектор, наоборот работает только в режиме «Глубокий сон» и предназначен для вывода системы из него по внешнему сигналу.

Прерывание для каждого из выводов разрешается и запрещается записью в регистры GPIO_INTEN_SET/ GPIO_INTEN_CLR.

Синхронное прерывание может быть сформировано как по фронту сигнала, так и по уровню, выбор типа прерывания осуществляется записью в регистры GPIO_INTTYPE_SET/GPIO_INTTYPE_CLR. Регистры GPIO_INTPOL_SET/GPIO_INTPOL_CLR определяют, какой уровень (низкий/высокий) или какой фронт (возрастающий/спадающий) вызовет прерывание.

Асинхронный детектор не использует системную частоту, поэтому может работать в режиме «Глубокого сна» микроконтроллера. Асинхронное прерывание выводит микроконтроллер из режима «SLEEP», таким образом блок GPIO можно использовать, чтобы выйти из режима «Глубокого сна» по внешнему событию. Асинхронный детектор фронта работает с несинхронизированным на системную частоту входным сигналом, поэтому даже короткий глитч входного сигнала будет гарантированно зарегистрирован как фронт.

Асинхронное прерывание может быть сформировано только по фронту. При переходе в режим «Глубокого сна» (где работает асинхронный детектор) значение в регистрах GPIO_INTTYPE_SET/ GPIO_INTTYPE_CLR игнорируется, прерывание срабатывает по фронту сигнала (возрастающему или спадающему, в зависимости от GPIO_INTPOL_SET/GPIO_INTPOL_CLR).

Какой именно вывод вызвал прерывание можно выяснить, прочитав регистр статуса прерываний GPIO_INT. Соответствующий бит в регистре GPIO_INT выставляется в «1», только если прерывание по этому выводу разрешено.

Регистры GPIO

АббревиатураДоступОписание
GIOA
2300hGPIOA_DIR_SETRWУстановка режима работы выходного буфера
2301hGPIOA_DIR_CLRRW
2304hGPIOA_ALTF0RWВыбор альтернативной функции
2305hGPIOA_ALTF1RW
2306hGPIOA_INTEN_SETRWРазрешение прерываний
2307hGPIOA_INTEN_CLRRW
2308hGPIOA_INTTYPE_SETRWВыбор типа прерывания (фронт/уровень)
2309hGPIOA_INTTYPE_CLRRW
230AhGPIOA_INTPOL_SETRWВыбор полярности входного сигнала, при которой формируются прерывания
230BhGPIOA_INTPOL_CLRRW
230ChGPIOA_INTRСтатус прерываний
GPIOB
2400hGPIOB_DIR_SETRWУстановка режима работы выходного буфера
2401hGPIOB_DIR_CLRRW
2404hGPIOB_ALTF0RWВыбор альтернативной функции
2405hGPIOB_ALTF1RW
2406hGPIOB_INTEN_SETRWРазрешение прерываний
2407hGPIOB_INTEN_CLRRW
2408hGPIOB_INTTYPE_SETRWВыбор типа прерывания (фронт/уровень)
2409hGPIOB_INTTYPE_CLRRW
240AhGPIOB_INTPOL_SETRWВыбор полярности входного сигнала, при которой формируются прерывания
240BhGPIOB_INTPOL_CLRRW
240ChGPIOB_INTRСтатус прерываний
GPIOC
2500hGPIOC_DIR_SETRWУстановка режима работы выходного буфера
2501hGPIOC_DIR_CLRRW
2504hGPIOC_ALTF0RWВыбор альтернативной функции
2505hGPIOC_ALTF1RW
2506hGPIOC_INTEN_SETRWРазрешение прерываний
2507hGPIOC_INTEN_CLRRW
2508hGPIOC_INTTYPE_SETRWВыбор типа прерывания (фронт/уровень)
2509hGPIOC_INTTYPE_CLRRW
250AhGPIOC_INTPOL_SETRWВыбор полярности входного сигнала, при которой формируются прерывания
250BhGPIOC_INTPOL_CLRRW
250ChGPIOC_INTRСтатус прерываний

GPIOx_DIR_SET/CLR

GPIO_DIR_SET/GPIO_DIR_CLR – парные регистры управления режимом работы выходных буферов порта.

Бит76543210
НазначениеIO7_DIRIO6_DIRIO5_DIRIO4_DIRIO3_DIRIO2_DIRIO1_DIRIO0_DIR
Начальное значение0

Запись в IOx_DIR регистра GPIO_DIR_SET:

  • 1 - включить выходной буфер на передачу;
  • 0 - не меняет текущую настройку.

Запись в IOx_DIR регистра GPIO_DIR_CLR:

  • 1 - выключить выходной буфер;
  • 0 - не меняет текущую настройку.

Чтение IOx_DIR регистров GPIO_DIR_SET/GPIO_DIR_CLR:

  • 1 - выходной буфер включен на передачу;
  • 0 - выходной буфер выключен.

GPIOx_ALTF0

Бит76543210
НазначениеIO3_ALTFIO2_ALTFIO1_ALTFIO0_ALTF
Начальное значение0

IOx_ALTF – альтернативная функция:

  • 11b - включена альтернативная функция ALTF2;
  • 10b - включена альтернативная функция ALTF1;
  • 01b - включена альтернативная функция ALTF0;
  • 00b - альтернативные функции выключены, выходным буфером управляет GPIO.

GPIOx_ALTF1

Бит76543210
НазначениеIO7_ALTFIO6_ALTFIO5_ALTFIO4_ALTF
Начальное значение0

IOx_ALTF – альтернативная функция:

  • 11b – включена альтернативная функция ALTF2;
  • 10b – включена альтернативная функция ALTF1;
  • 01b – включена альтернативная функция ALTF0;
  • 00b – альтернативные функции выключены, выходным буфером управляет GPIO.

GPIOx_INTEN_SET/CLR

GPIO_INTEN_SET/GPIO_INTEN_CLR – парные регистры установки разрешения генерации прерываний по событиям на входах GPIO.

Бит76543210
НазначениеIO7_IEIO6_IEIO5_IEIO4_IEIO3_IEIO2_IEIO1_IEIO0_IE
Начальное значение0

Запись в IOx_IE регистра GPIO_INTEN_SET:

  • 1 - разрешить генерацию прерывания по событиям на данном входе;
  • 0 - не меняет текущую настройку.

Запись в IOx_IE регистра GPIO_INTEN_CLR:

  • 1 - запретить генерацию прерывания по событиям на данном входе;
  • 0 - не меняет текущую настройку.

Чтение IOx_IE регистров GPIO_INTEN_SET/GPIO_INTEN_CLR:

  • 1 - разрешена генерация прерывания по событиям на данном входе;
  • 0 - запрещена генерация прерывания по событиям на данном входе.

GPIOx_INTTYPE_SET/CLR

GPIO_INTTYPE_SET/GPIO_INTTYPE_CLR – парные регистры установки типа прерывания (по фронту/уровню) генерируемого GPIO.

Бит76543210
НазначениеIO7_ITYPEIO6_ITYPEIO5_ITYPEIO4_ITYPEIO3_ITYPEIO2_ITYPEIO1_ITYPEIO0_ITYPE
Начальное значение0

Запись в IOx_ITYPE регистра GPIO_INTTYPE_SET:

  • 1 - установить генерацию прерывания по фронту;
  • 0 - не меняет текущую настройку.

Запись в IOx_ITYPE регистра GPIO_INTTYPE_CLR:

  • 1 - установить генерацию прерывания по уровню;
  • 0 - не меняет текущую настройку.

Чтение IOx_ITYPE регистров GPIO_INTTYPE_SET/GPIO_INTTYPE_CLR:

  • 1 - генерация прерывания осуществляется по фронту;
  • 0 - генерация прерывания осуществляется по уровню.

GPIOx_INTPOL_SET/CLR

GPIO_INTPOL_SET/GPIO_INTPOL_CLR – парные регистры установки полярности события GPIO, по которому генерируется прерывание.

Бит76543210
НазначениеIO7_IPOLIO6_IPOLIO5_IPOLIO4_IPOLIO3_IPOLIO2_IPOLIO1_IPOLIO0_IPOL
Начальное значение0

Запись в IOx_IPOL регистра GPIO_INTPOL_SET:

  • 1 - установить генерацию прерывания по положительному фронту или высокому уровню (зависит от GPIO_INTTYPE_SET/CLR);
  • 0 - не меняет текущую настройку.

Запись в IOx_IPOL регистра GPIO_INTPOL_CLR:

  • 1 - установить генерацию прерывания по отрицательному фронту или низкому уровню (зависит от GPIO_INTTYPE_SET/CLR);
  • 0 - не меняет текущую настройку.

Чтение IOx_IPOL регистров GPIO_INTPOL_SET/GPIO_INTPOL_CLR:

  • 1 - генерация прерывания осуществляется по положительному фронту или высокому уровню;
  • 0 - генерация прерывания осуществляется по отрицательному фронту или низкому уровню.

GPIOx_INT

Бит76543210
НазначениеIO7_INTIO6_INTIO5_INTIO4_INTIO3_INTIO2_INTIO1_INTIO0_INT
Тип статусаEVENT
Начальное значение0

IOx_INT – статус прерывания соответствующего вывода GPIO:

  • 1 - был зафиксирован фронт или уровень (согласно заданным в регистрах GPIO_INTPOL_SET/CLR и GPIO_INTTYPE_SET/CLR условиям) на данном выводе;
  • 0 - фронт или уровень не был зафиксирован.