Рерих, Гималаи - почему бы и нет? |
Так будут помечаться мои мысли и дополнительные разъяснения.
9.1 Описание функций GPIO.
Каждый из универсальных портов ввода/вывода (далее I/O) имеет:
- два 32 битных конфигурационных регистра (GPIOx_CRL, GPIOx_CRH),
- два 32 битных data регистра (GPIOx_IDR, GPIOx_ODR),
- 32 битный регистр сброса/установки (GPIOx_BSRR),
- 16 битный регистр сброса (GPIOx_BRR),
- 32 битный регистр блокировки (GPIOx_LCKR).
Теперь немножно более подробно:
GPIOx_CRL, GPIOx_CRH - регистры конфигурации(управления) портов, настройка режима работы порта: вход/вывод и тд...
GPIOx_IDR - регистр непосредственного чтения состояния линий порта. Регистр данных.
GPIOx_ODR - регистр конфигурации порта в режиме вывод (выход). Регистр данных.
GPIOx_BSRR - регистр атомарного сброса/установки битов для GPIOx_ODR регистра.
GPIOx_BRR - регистр атомарного сброса битов для GPIOx_ODR регистра. По сути точно такой же регистр, только без возможности установки битов.
GPIOx_LCKR - регистр блокировки изменений конфигурации порта.
В зависимости от конкретных аппаратных характеристик порта, которые можно найти в даташите, каждый вывод порта может программно настраиваться в следующие режимы:
- Плавающий вход (Input floating) - вход без резисторов подтяжки. HiZ состояние. Сопротивление входа велико. Ловит любые помехи.
- Вход с подтяжкой на плюс (Input pull-up) - вход с внутренней подтяжкой на питание "+".
- Вход с подтяжкой на минус (Input pull-down) - вход с внутренней подтяжкой на землю "-".
- Аналоговый вход (Analog) - аналоговый вход с использованием АЦП.
- Выход с открытым стоком (Output open-drain) - при логическом 0 линия подтягивается через резистор к земле, при лог. 1 линия висит в воздухе, поэтому для него требуется самостоятельно подтянуть линию через резистор к питанию и добиться двухтактной работы вывода. Т.е. можно управлять нагрузкой с большим/меньшим напряжением, чем питание МК; использовать для I2C и других аналогов.
- Двухтактный выход (Output push-pull) - при логическом 0 линия подтягивается через резистор к земле, при лог. 1 - к питанию "+". Т.е. линия выдает либо "+", либо землю.
- Выход с открытым стоком альтернативной функции (Alternate function open-drain) - тоже самое что и просто выход с открытым стоком, только для альтернативных функций вывода.
- Двухтактный выход альтернативной функции (Alternate function push-pull) - тоже самое что и просто двухтактный выход, только для альтернативных функций вывода.
Каждый вывод порта может быть отдельно запрограммирован, однако регистры I/O порта доступны только как 32 битные слова (16 битовый или байтовый доступ не доступен).
Это утверждение я понимаю следующим образом - чтобы изменить значение регистра придется подготовить и записать в него 32х битное слово за один раз.
Основное назначение GPIOx_BSRR и GPIOx_BRR регистров - это возможность для атомарного доступа чтения/изменения (чтения !? да-да в даташите так и написано) для любого GPIO регистра. Поэтому нет риска того, что может случиться IRQ (прерывание) между процессом чтения и изменения регистра.
Благодаря этим двум регистрам обеспечивается побитовое управление GPIO регистров, более подробно далее. Плюс существует защита от прерывания во время процесса чтения и изменения регистра.
Figure 13. Базовая структура стандартной линии I/O порта |
Figure 14. Базовая структура 5 Вольтовой линии I/O порта |
Table 20. Таблица конфигурации линии порта
Требуемый режим
|
CNF1
|
CNF0
|
MODE1
|
MODE0
|
PxODR регистр
|
|
В режиме выход
|
Двухтактный выход
|
0
|
0
|
01
10 11 см. табл. знач. битов MODE |
0 или 1
|
|
Выход с открытым стоком
|
1
|
0 или 1
|
||||
В режиме альтернативный выход
|
Двухтактный выход
|
1
|
0
|
Все равно
|
||
Выход с открытым стоком
|
1
|
Все равно
|
||||
В режиме вход
|
Аналоговый вход
|
0
|
0
|
00
|
Все равно
|
|
Плавающий вход
|
1
|
Все равно
|
||||
Вход с подтяжкой на минус
|
1
|
0
|
0
|
|||
Вход с подтяжкой на плюс
|
1
|
Table 21. Таблица значений битов MODE
MODE[1:0] | Смысл |
00 | Зарезервированно для режима вход |
01 | Максимальная выходная частота 10 МГц |
10 | Максимальная выходная частота 2 МГц |
11 | Максимальная выходная частота 50 МГц |
9.1.1 Порты Ввода/Вывода Общего назначения.
В течении и сразу после reset'а, альтернативные функции портов не активны и все I/O порты находятся в Режиме Плавающего Входа (CNFx[1:0]=01b, MODEx[1:0]=00b).
JTAG пины настроены на вход PU/PD после reset'a.
PA15: JTDI in PU
PA14: JTCK in PD
PA13: JTMS in PU
PB4: NJTRST in PU
Их можно сконфигурировать как выход, с помощью соответсвующей записи в Регистр Конфигурации Порта в Режиме Выход (GPIOx_ODR). А значит их можно настроить как Двухтактный Выход или как Выход с Открытым Стоком (активируется только N-MOS
при значении 0).
Регистр Непосредственного Чтения Состояния Линий Порта (GPIOx_IDR) перехватывает и отображает значения имеющиеся на I/O выводе с каждым APB2 тактом.
Все пины GPIO когда настроенны на вход имеют встроенные слабые подтяжки на питание и на землю, котороые можно активировать или отключить.
9.1.2 Атомарный сброс и установка бита.
Нет необходимости программно отключать прерывания, когда побитово изменяешь GPIOx_ODR регистр. Существует возможность изменить только один или несколько битов за один атомарный APB2 доступ записи. Этого можно достичь если запишешь 1 в Регистре Атомарного Сброса/Установки Битов (GPIOx_BSRR, или только сброс в GPIOx_BRR), в те выделенные биты которые хочешь изменить. Не выделенные биты (со значением 0) изменятся не будут.
9.1.3 Внешние линии прерывания/пробуждения.
Все порты имеют функцию внешнего прерывания. Для использования внешнего прерывания, линия должна быть настроена как вход. Для большей информации о внешних прерываниях смотри Section 10.2:External interrupt/event controller (EXTI) и Section 10.2.3: Wakeup event management.
9.1.4 Альтернативные функции
Чтобы использовать альтернативную функцию необходимо настроить Регистр Конфигурации Бита Порта.
- Для альтернативных функций использующих входной режим, порт необходимо настроить как вход (плавающий, с подтяжкой на питание или землю), а входная линия должна получать внешние сигналы.
Примечание: Так же возможно программно эмулировать сигналы на AFI входе (входе Альтернативной функции) настраивая GPIO контроллер. Для этого порт необходимо настроить как Выход Альтернативной Функции. И очевидно, что нельзя подавать внешние сигналы на этот порт т.к. он будет управляться программно с помощью GPIO контроллера.
- Для альтернативных функций использующих выходной режим, порт необходимо настроить как Выход Альтернативной Функции (двухтактный или с открытым стоком).
- Для двунапрвленных Альтернативных Функций, бит порта должен быть настроен как Выход Альтернативной Функции (двухтактный или с открытым стоком). В этом случае и входной драйвер настраивается как Плавающий Вход.
Если ты настриваешь бит порта как Выход Альтернативной Функции, это отключает его от Регистра Конфигурации Порта в Режиме выхода (GPIOx_ODR) и подключает его к выходному сигналу переферии чипа.
Если GPIO программно настроен на режим "Выход Альтернативной Функции", но переферия не активированна, то такой режим не определен.
9.1.7 Конфигурация входа
I/O вывод настроен на вход, тогда:
- Выходной буффер (ODR регистр) не используется;
- Входной триггер Шмидта включен;
- Можно подключить подтягивающие резисторы(на землю или питание) или настроить как Плавающий Вход;
- Данные на I/O выводах, отображаются в IDR регистре и обновляются с каждым тактом APB2;
- Доступ чтения регистра IDR возвращает состояние I/O выводов.
Figure 15. Конфигурация входа
VDD_FT - вход толерантный к 5В который немного отличается от VDD.
9.1.8 Конфигурация выхода
I/O вывод настроен на выход, тогда:
- Выходной Буфер (ODR регистр) настроен на следующие режимы:
- Выход с открытым стоком - при логическом 0 (в ODR регистре) линия подтягивается через резистор к земле (N-MOS состояние), при лог. 1 линия висит в воздухе (HiZ состояние). P-MOS состояние недоступно (можно самому подтянуть линию через резистор к питанию, об этом описано выше);
- Двухтактный выход - при логическом 0 (в ODR регистре) линия подтягивается через резистор к земле(N-MOS состояние), при лог. 1 - к питанию "+" (P-MOS состояние).
- Входной Триггер Шмидта включен;
- Резисторы подтяжки отключены;
- Данные на I/O выводах отображаются в IDR регистре и обновляются с каждым тактом APB2;
- Доступ чтения регистра IDR возвращает состояние I/O выводов в режиме Открытого Стока;
- Доступ чтения регистра ODR возвращает последние записанные значения В Двухтактном режиме.
Figure 16. Конфигурация выхода
VDD_FT - вход толерантный к 5В который немного отличается от VDD.
На этом пока что все, в дальнейшем я буду дополнять этот пост.
Комментариев нет:
Отправить комментарий