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_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 | |||
2300h | GPIOA_DIR_SET | RW | Установка режима работы выходного буфера |
2301h | GPIOA_DIR_CLR | RW | |
2304h | GPIOA_ALTF0 | RW | Выбор альтернативной функции |
2305h | GPIOA_ALTF1 | RW | |
2306h | GPIOA_INTEN_SET | RW | Разрешение прерываний |
2307h | GPIOA_INTEN_CLR | RW | |
2308h | GPIOA_INTTYPE_SET | RW | Выбор типа прерывания (фронт/уровень) |
2309h | GPIOA_INTTYPE_CLR | RW | |
230Ah | GPIOA_INTPOL_SET | RW | Выбор полярности входного сигнала, при которой формируются прерывания |
230Bh | GPIOA_INTPOL_CLR | RW | |
230Ch | GPIOA_INT | R | Статус прерываний |
GPIOB | |||
2400h | GPIOB_DIR_SET | RW | Установка режима работы выходного буфера |
2401h | GPIOB_DIR_CLR | RW | |
2404h | GPIOB_ALTF0 | RW | Выбор альтернативной функции |
2405h | GPIOB_ALTF1 | RW | |
2406h | GPIOB_INTEN_SET | RW | Разрешение прерываний |
2407h | GPIOB_INTEN_CLR | RW | |
2408h | GPIOB_INTTYPE_SET | RW | Выбор типа прерывания (фронт/уровень) |
2409h | GPIOB_INTTYPE_CLR | RW | |
240Ah | GPIOB_INTPOL_SET | RW | Выбор полярности входного сигнала, при которой формируются прерывания |
240Bh | GPIOB_INTPOL_CLR | RW | |
240Сh | GPIOB_INT | R | Статус прерываний |
GPIOC | |||
2500h | GPIOC_DIR_SET | RW | Установка режима работы выходного буфера |
2501h | GPIOC_DIR_CLR | RW | |
2504h | GPIOC_ALTF0 | RW | Выбор альтернативной функции |
2505h | GPIOC_ALTF1 | RW | |
2506h | GPIOC_INTEN_SET | RW | Разрешение прерываний |
2507h | GPIOC_INTEN_CLR | RW | |
2508h | GPIOC_INTTYPE_SET | RW | Выбор типа прерывания (фронт/уровень) |
2509h | GPIOC_INTTYPE_CLR | RW | |
250Ah | GPIOC_INTPOL_SET | RW | Выбор полярности входного сигнала, при которой формируются прерывания |
250Bh | GPIOC_INTPOL_CLR | RW | |
250Сh | GPIOC_INT | R | Статус прерываний |
GPIOx_DIR_SET/CLR
GPIO_DIR_SET/GPIO_DIR_CLR – парные регистры управления режимом работы выходных буферов порта.
Бит | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Назначение | IO7_DIR | IO6_DIR | IO5_DIR | IO4_DIR | IO3_DIR | IO2_DIR | IO1_DIR | IO0_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
Бит | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Назначение | IO3_ALTF | IO2_ALTF | IO1_ALTF | IO0_ALTF | ||||
Начальное значение | 0 |
IOx_ALTF – альтернативная функция:
- 11b – включена альтернативная функция ALTF2;
- 10b – включена альтернативная функция ALTF1;
- 01b – включена альтернативная функция ALTF0;
- 00b – альтернативные функции выключены, выходным буфером управляет GPIO.
GPIOx_ALTF1
Бит | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Назначение | IO7_ALTF | IO6_ALTF | IO5_ALTF | IO4_ALTF | ||||
Начальное значение | 0 |
IOx_ALTF – альтернативная функция:
- 11b – включена альтернативная функция ALTF2;
- 10b – включена альтернативная функция ALTF1;
- 01b – включена альтернативная функция ALTF0;
- 00b – альтернативные функции выключены, выходным буфером управляет GPIO.
GPIOx_INTEN_SET/CLR
GPIO_INTEN_SET/GPIO_INTEN_CLR – парные регистры установки разрешения генерации прерываний по событиям на входах GPIO.
Бит | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Назначение | IO7_IE | IO6_IE | IO5_IE | IO4_IE | IO3_IE | IO2_IE | IO1_IE | IO0_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.
Бит | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Назначение | IO7_ITYPE | IO6_ITYPE | IO5_ITYPE | IO4_ITYPE | IO3_ITYPE | IO2_ITYPE | IO1_ITYPE | IO0_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, по которому генерируется прерывание.
Бит | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Назначение | IO7_IPOL | IO6_IPOL | IO5_IPOL | IO4_IPOL | IO3_IPOL | IO2_IPOL | IO1_IPOL | IO0_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
Бит | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Назначение | IO7_INT | IO6_INT | IO5_INT | IO4_INT | IO3_INT | IO2_INT | IO1_INT | IO0_INT |
Тип статуса | EVENT | |||||||
Начальное значение | 0 |
IOx_INT – статус прерывания соответствующего вывода GPIO:
- 1 – был зафиксирован фронт или уровень (согласно заданным в регистрах GPIO_INTPOL_SET/CLR и GPIO_INTTYPE_SET/CLR условиям) на данном выводе;
- 0 – фронт или уровень не был зафиксирован.
Альтернативные функции выводов GPIO
№ | Вывод | Альтернативная функция | Пяснение | ||
---|---|---|---|---|---|
АФ1 | АФ2 | АФ3 | |||
Порт А | |||||
20 | GPIOA_0 | SPI0_MOSI | SPI1_MOSI | I_TIMER0_EXT |
|
21 | GPIOA_1 | SPI0_MISO | SPI1_MISO | I_TIMER1_EXT |
|
22 | GPIOA_2 | SPI0_SCK | SPI1_SCK | O_SLEEP |
|
23 | GPIOA_3 | SPI0_I_CS | SPI1_I_CS | SPI0_O_CS |
|
24 | GPIOA_4 | UART0_TX | UART1_TX | SPI1_O_CS |
|
25 | GPIOA_5 | UART0_RX | UART1_RX | «0» |
|
26 | GPIOA_6 | I2C_SCL | UART0_CTS | UART1_CTS |
|
27 | GPIOA_7 | I2C_SDA | UART0_RTS | UART1_RTS |
|
Порт В | |||||
44 | GPIOB_0>/H_S | SPI0_MOSI | SPI1_MOSI | I_TIMER0_EXT |
|
45 | GPIOB_1/RC_CLKOUT | SPI0_MISO | SPI1_MISO | I_TIMER2_EXT |
|
46 | GPIOB_2 | SPI0_SCK | SPI1_SCK | O_SLEEP | Во время обращения к внешним регистрам этот вывод работает как DATA_2 (направление определяется командой) |
47 | GPIOB_3 | SPI0_I_CS | SPI1_I_CS | SPI0_O_CS | Во время обращения к внешним регистрам этот вывод работает как DATA_3 (направление определяется командой) |
48 | GPIOB_4 | UART0_TX | UART1_TX | SPI1_O_CS | Во время обращения к внешним регистрам этот вывод работает как DATA_4 (направление определяется командой) |
1 | GPIOB_5 | UART0_RX | UART1_RX | «0» | Во время обращения к внешним регистрам этот вывод работает как DATA_5 (направление определяется командой) |
2 | GPIOB_6 | I2C_SCL | UART0_CTS | UART1_CTS | Во время обращения к внешним регистрам этот вывод работает как DATA_6 (направление определяется командой) |
3 | GPIOB_7 | I2C_SDA | UART0_RTS | UART1_RTS | Во время обращения к внешним регистрам этот вывод работает как DATA_7 (направление определяется командой) |
Порт С | |||||
9 | GPIOC_0/TCK | SPI0_MOSI | SPI1_MOSI | I_TIMER1_EXT |
|
10 | GPIOC_1/TMS | SPI0_MISO | SPI1_MISO | I_TIMER2_EXT |
|
11 | GPIOC_2/TDI | SPI0_SCK | SPI1_SCK | O_SLEEP |
|
12 | GPIOC_3/TDO | SPI0_I_CS | SPI1_I_CS | SPI0_O_CS |
|
13 | GPIOC_4 | UART0_TX | UART1_TX | SPI1_O_CS | Порт ввода-вывода микроконтроллера, разряд №4 группы C |
14 | GPIOC_5 | UART0_RX | UART1_RX | «0» | Порт ввода-вывода микроконтроллера, разряд №5 группы C |
15 | I2C_SCL | UART0_CTS | UART1_CTS | «0» | Во время обращения к внешним регистрам этот вывод работает как SEL_2 (выход) |
16 | GPIOC_7 | I2C_SDA | UART0_RTS | UART1_RTS | Во время обращения к внешним регистрам этот вывод работает как SEL_3 (выход) |
Порты JTAG (TCK, TDI, TMS, TDO) мультиплексированы с портами GPIOC. Выбор назначения выводов (GPIOC или JTAG) осуществляется выводом TM.
Порты интерфейсов (SPI, UART и т.д.) также мультиплексированы с портами GPIO. Выбор назначения выводов осуществляется с помощью альтернативных функций во время работы микроконтроллера.