Разберем тему по работе GPIO в CMSIS. Разберем как настраивать порты ввода-вывода без использования HAL. CMSIS гораздо быстрее библиотеки HAL, а это бывает очень полезным. Да и знание регистров для управления той или иной перифирией тоже необходимо, для полного понимания как программировать по микроконтроллеры STP32.
GPIO CMSIS: регистры управления
Начнем наше ознакомления с портами ввода вывода в CMSIS, с полного описания регистров портов.
Регистр конфигурации GPIOx_CRL
С помощью данного регистра настраивается режим выхода порта и скорость переключения. Данный регистр конфигурирует порты с номером от 0-го до 7-го.
Регистр содержит следующие настройки по 2 бита каждая:
- MODEx – устанавливает ножку на вход или выход. Так же выбирается скорость переключения, если ножка настроена на выход.
- CNFx – настройка режима работы порта.
MODEx
- 00: Порт в режиме “Вход”. После ресета все порты устанавливаются в этот режим.
- 01: Порт в режиме “Выход”, с максимальной частотой переключения 10 MHz.
- 10: Порт в режиме “Выход”, с максимальной частотой переключения 2 MHz.
- 11: Порт в режиме “Выход”, с максимальной частотой переключения 50 MHz.
CNFx
Если MODEx настроен на “Вход” (MODEx[1:0]=00)
- 00: Режим аналогового входа. Подключается или ЦАП или АЦП.
- 01: Режим входа без подтягивающего резистора. Это значение устанавливается после ресета.
- 10: Вход с подтяжкой вверх (pull-up ).
- 01: Вход с подтяжкой вниз (pull-down).
- 11: Зарезервировано, не используется.
Если MODEx настроен на “Выход” (MODEx[1:0] > 00)
- 00: Выход в режиме Push-pull (тяни/толкай). Когда записываем единицу, на выходе лог. единица. Если записываем ноль на выходе лог. ноль.
- 01: Выход с открытым коллектором (Open-drain). Когда записываем единицу, выход переходит в высокоимпедансное состояние. Когда записали ноль, выход прижат внутренним транзистором к земле.
- 10: Выход используется альтернативной функцией в режиме Push-pull.
- 11: Выход используется альтернативной функцией в режиме Open-drain.
Регистр конфигурации GPIOx_CRH
Данный регистр, аналогичен предыдущему регистру GPIOx_CRL, за одним исключением. С помощью этого регистра настраиваются порты с номером 8 – 15.
Регистр входных данных GPIOx_IDR
Данный регистр содержит информацию о входном сигнале на соответствующих номеру пинах.
Регистр выходных данных GPIOx_ODR
Данный регистр содержит информацию о выходном сигнале на соответствующих номеру пинах.
Регистр установки битов GPIOx_BRR
Данный регистр дает возможность установить значение выходного регистра ODR не используя такие операции как чтение, модификация, запись. Т.е. можно установить значение вывода в 1 или 0 быстрее, если это делать через ODR.
BRx
Сбрасывает в 0 бит регистра ODR порта ввода-вывода (x= 0 .. 15)
- 0: Игнорируется, бит ODRx не изменяется.
- 1: Выбранный бит ODRx сбрасывается в 0.
BSx
Устанавливает в 1 бит регистра ODR порта ввода-вывода (x= 0 .. 15)
- 0: Игнорируется, бит ODRx не изменяется.
- 1: Выбранный бит ODRx устанавливается в 1.
Регистр сброса GPIOx_BRR
У данного регистра только одна функция, сбросить выбранный бит ODRx в 0. Сброс также производится без обращения к операциям чтения, модификации, записи.
Регистр блокировки GPIOx_LCKR
С помощью регистра GPIOx_LCKR мы можем заблокировать доступ к регистрам конфигурации порта. Для этого необходимо записать в LCKx единицу, x – номер порта для блокировки. Затем записать последовательность нулей и единиц в бит LCKK:
- Запись LCKK = 1
- Запись LCKK = 0
- Запись LCKK = 1
- Чтение LCKK = 0
- Чтение LCKK = 1 На последнем шаге мы убеждаемся, что в LCKK точно записалась единица.
ВАЖНО! Во время записи последовательность нельзя менять биты LCKx, так как блокировка не сработает.
Если блокировка прошла успешно, мы не сможем записать данные в регистры GPIOx_CRH и GPIOx_CRL.
Шина тактирования GPIO
По умолчанию на всех микроконтроллерах от STM тактирование портов GPIO отключено. Из даташита на микроконтроллер есть таблица, какая перифирия к какой шине относится.
Например для микроконтроллера STM32F474VET это шина AHB2.
Что бы включить тактирование порта ввода вывода, необходимо установить соответсвующий бит в регистре RCC_AHB2ENR
CMSIS мигаем светодиодом
Светодиод подключим на ножку PC5.
// Выставляем тактирование в AHB2 RCC->AHB2ENR |= RCC_AHB2ENR_GPIOEEN; // Конфигурируем CRL регистры. GPIOC->CRL &= ~GPIO_CRL_CNF5; // Сбрасываем биты CNF для бита 5. Режим 00 - Push-Pull GPIOC->CRL |= GPIO_CRL_MODE5_0; // Выставляем бит MODE0 для пятого пина. Режим MODE01 = Max Speed 10MHz GPIOC->BSRR = GPIO_BSRR_BR5; // Сбросили бит. GPIOC->BSRR = GPIO_BSRR_BS5; // Установили бит. Сброс и запись мы делаем через один и тот же регистр BSRR. А записываем в него разное число. GPIO_BSRR_BR5 = 0x00200000 GPIO_BSRR_BS5 = 0x00000020