GPIO
Общая информация
Мультиплексор GPIO_MUX для каждого вывода микроконтроллера позволяет либо соединить его с портом P процессора (использовать как вывод общего назначения), либо соединить его с одним из периферийных устройств (использовать альтернативную функцию порта). Выбор альтернативной функции осуществляется записью в регистр GPIO_ALTFL.
Если вывод используется как вывод общего назначения, то блок GPIO позволяет настроить его на вход или на выход. Выбор направления для порта осуществляется записью в регистры GPIO_DIR_SET / GPIO_DIR_CLR.
Когда порт настроен как выход общего назначения, то передаваемое во вне значение определяется значением порта P процессора. Когда порт настроен как вход общего назначения, то считать значение порта можно также через порт P процессора. Порт P0 процессора соединён с блоками GPIO.
Блок GPIO может сформировать прерывание при определенном уровне или изменении уровня на порту микроконтроллера.
Блок GPIO может зафиксировать фронт сигнала на выводе микроконтроллера, даже когда система находится в режиме «Глубокого сна» (c помощью асинхронного детектора фронта), и вывести систему из режима «SLEEP».
Аналогичным и единственным способом вывода системы из режима «COLD_SLEEP» является подача положительного фронта на вход любого GPIO. Через такт системной частоты система продолжит работать с той инструкцией, на которой остановилась.
Структурная схема
GPIO_MUX соединяет PAD (вывод микроконтроллера) всегда соединенный с портом P процессора (CPU_PORT_P), с одной из альтернативных функций этого вывода. GPIO_MUX управляется регистрами GPIO_ALTFL. Если вывод соединен с портом процессора, то направление (вход/выход) определяется регистром GPIO_DIR_SET / GPIO_DIR_CLR. Если вывод соединен с альтернативной функцией, то направление (вход/выход) определяется этой альтернативной функцией (периферийным устройством DEVICEx).
В блоке GPIO присутствуют два детектора, способных формировать прерывания – синхронный (SYNCH_EDGE_DETECTOR) и асинхронный (ASYNCH_EDGE_DETECTOR). Работа детекторов управляются регистрами GPIO_INTEN_SET / GPIO_INTEN_CLR, GPIO_INTTYPE_SET / GPIO_INTTYPE_CLR и GPIO_INTPOL_SET / GPIO_INTPOL_CLR. Статус прерываний сохраняется в регистре GPIO_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
№ | Аббревиатура | Доступ | Описание |
---|---|---|---|
2300h | GPIO_DIR_SET | RW | Установка режима работы выходного буфера |
2301h | GPIO_DIR_CLR | RW | |
2304h | GPIO_ALTFL | RW | Выбор альтернативной функции |
2305h | GPIO_INTEN_SET | RW | Разрешение прерываний |
2306h | GPIO_INTEN_CLR | RW | |
2307h | GPIO_INTTYPE_SET | RW | Выбор типа прерывания (фронт/уровень) |
2308h | GPIO_INTTYPE_CLR | RW | |
2309h | GPIO_INTPOL_SET | RW | Выбор полярности входного сигнала, при которой формируются прерывания |
230Ah | GPIO_INTPOL_CLR | RW | |
230Bh | GPIO_INT | R | Статус прерываний |
GPIO_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 – выходной буфер выключен.
GPIO_ALTFL
Бит | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Назначение | IO7_ALTF | IO6_ALTF | IO5_ALTF | IO4_ALTF | IO3_ALTF | IO2_ALTF | IO1_ALTF | IO0_ALTF |
Назначение | IO3_ALTF | IO2_ALTF | IO1_ALTF | IO0_ALTF | ||||
Начальное значение | 0 |
IOx_ALTF – альтернативная функция:
- 1 – включена альтернативная функция ALTFL;
- 0 – альтернативные функции выключены, выходным буфером управляет GPIO.
GPIO_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 – запрещена генерация прерывания по событиям на данном входе.
GPIO_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 – генерация прерывания осуществляется по уровню.
GPIO_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 – генерация прерывания осуществляется по отрицательному фронту или низкому уровню.
GPIO_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 – фронт или уровень не был зафиксирован.