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_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
240СhGPIOB_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
250СhGPIOC_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 – фронт или уровень не был зафиксирован.

Альтернативные функции выводов GPIO

ВыводАльтернативная функцияПяснение
АФ1АФ2АФ3
Порт А
20GPIOA_0SPI0_MOSISPI1_MOSII_TIMER0_EXT
  • SPI0/1 – MOSI (направление определяется режимом работы «ведущий»/«ведомый»)
  • TIMER0 – I_TIMER0_EXT (вход)
21GPIOA_1SPI0_MISOSPI1_MISOI_TIMER1_EXT
  • SPI0/1 – MISO (направление определяется режимом работы «ведущий»/«ведомый»);
  • TIMER1 – I_TIMER1_EXT (вход).
22GPIOA_2SPI0_SCKSPI1_SCKO_SLEEP
  • SPI0/1 – SCK (направление определяется режимом работы «ведущий»/«ведомый»);
  • режим «Глубокий сон» – O_SLEEP (выход).
23GPIOA_3SPI0_I_CSSPI1_I_CSSPI0_O_CS
  • SPI0/1 – I_CS (вход);
  • SPI0 – O_CS (выход).
24GPIOA_4UART0_TXUART1_TXSPI1_O_CS
  • UART0/1 – TX (выход);
  • SPI1 – O_CS (выход).
25GPIOA_5UART0_RXUART1_RX«0»
  • UART0/1 – RX (вход);
  • лог. «0» (выход).
26GPIOA_6I2C_SCLUART0_CTSUART1_CTS
  • I2C – SCL (направление определяется режимом работы «ведущий»/«ведомый»);
  • UART0/1 – CTS (вход).
27GPIOA_7I2C_SDAUART0_RTSUART1_RTS
  • I2C – SDA (направление определяется протоколом);
  • UART0/1 – RTS (выход).
Порт В
44GPIOB_0>/H_SSPI0_MOSISPI1_MOSII_TIMER0_EXT
  • при TM = 1 вывод принудительно работает как H/S (вход)
  • во время обращения к внешним регистрам этот вывод работает как DATA_0 (направление определяется командой)
45GPIOB_1/RC_CLKOUTSPI0_MISOSPI1_MISOI_TIMER2_EXT
  • при TM = 1 вывод принудительно работает как RC_CLKOUT (выход);
  • во время обращения к внешним регистрам этот вывод работает как DATA_1 (направление определяется командой)
46GPIOB_2SPI0_SCKSPI1_SCKO_SLEEP

Во время обращения к внешним регистрам этот вывод работает как DATA_2 (направление определяется командой)

47GPIOB_3SPI0_I_CSSPI1_I_CSSPI0_O_CS

Во время обращения к внешним регистрам этот вывод работает как DATA_3 (направление определяется командой)

48GPIOB_4UART0_TXUART1_TXSPI1_O_CS

Во время обращения к внешним регистрам этот вывод работает как DATA_4 (направление определяется командой)

1GPIOB_5UART0_RXUART1_RX«0»

Во время обращения к внешним регистрам этот вывод работает как DATA_5 (направление определяется командой)

2GPIOB_6I2C_SCLUART0_CTSUART1_CTS

Во время обращения к внешним регистрам этот вывод работает как DATA_6 (направление определяется командой)

3GPIOB_7I2C_SDAUART0_RTSUART1_RTS

Во время обращения к внешним регистрам этот вывод работает как DATA_7 (направление определяется командой)

Порт С
9GPIOC_0/TCKSPI0_MOSISPI1_MOSII_TIMER1_EXT
  • При TM = 1 вывод принудительно работает как TCK (вход) интерфейса JTAG
  • Во время обращения к внешним регистрам этот вывод работает как WR/RD (выход)
10GPIOC_1/TMSSPI0_MISOSPI1_MISOI_TIMER2_EXT
  • При TM = 1 вывод принудительно работает как TMS (вход) интерфейса JTAG
  • Во время обращения к внешним регистрам этот вывод работает как EN (выход)
11GPIOC_2/TDISPI0_SCKSPI1_SCKO_SLEEP
  • При TM = 1 вывод принудительно работает как TDI (вход) интерфейса JTAG
  • Во время обращения к внешним регистрам этот вывод работает как SEL_0 (выход)
12GPIOC_3/TDOSPI0_I_CSSPI1_I_CSSPI0_O_CS
  • При TM = 1 вывод принудительно работает как TDO (выход) интерфейса JTAG
  • Во время обращения к внешним регистрам этот вывод работает как SEL_1 (выход)
13GPIOC_4UART0_TXUART1_TXSPI1_O_CS

Порт ввода-вывода микроконтроллера, разряд №4 группы C

14GPIOC_5UART0_RXUART1_RX«0»

Порт ввода-вывода микроконтроллера, разряд №5 группы C

15I2C_SCLUART0_CTSUART1_CTS«0»

Во время обращения к внешним регистрам этот вывод работает как SEL_2 (выход)

16GPIOC_7I2C_SDAUART0_RTSUART1_RTS

Во время обращения к внешним регистрам этот вывод работает как SEL_3 (выход)

Порты JTAG (TCK, TDI, TMS, TDO) мультиплексированы с портами GPIOC. Выбор назначения выводов (GPIOC или JTAG) осуществляется выводом TM.

Порты интерфейсов (SPI, UART и т.д.) также мультиплексированы с портами GPIO. Выбор назначения выводов осуществляется с помощью альтернативных функций во время работы микроконтроллера.