GPIO в CMSIS

Разберем тему по работе GPIO в CMSIS. Разберем как настраивать порты ввода-вывода без использования HAL. CMSIS гораздо быстрее библиотеки HAL, а это бывает очень полезным. Да и знание регистров для управления той или иной перифирией тоже необходимо, для полного понимания как программировать по микроконтроллеры STP32.

GPIO CMSIS: регистры управления

Начнем наше ознакомления с портами ввода вывода в CMSIS, с полного описания регистров портов.

Регистр конфигурации GPIOx_CRL

С помощью данного регистра настраивается режим выхода порта и скорость переключения. Данный регистр конфигурирует порты с номером от 0-го до 7-го.

Регистр конфигурации GPIOx_CRL

Регистр содержит следующие настройки по 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_CRH

Регистр входных данных GPIOx_IDR

Регистр GPIO_IDR

Данный регистр содержит информацию о входном сигнале на соответствующих номеру пинах.

Регистр выходных данных GPIOx_ODR

Регистр GPIOx_ODR

Данный регистр содержит информацию о выходном сигнале на соответствующих номеру пинах.

Регистр установки битов GPIOx_BRR

Регистр установки 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

Регистр сброса GPIOx_BRR

У данного регистра только одна функция, сбросить выбранный бит ODRx в 0. Сброс также производится без обращения к операциям чтения, модификации, записи.

Регистр блокировки GPIOx_LCKR

Регистр блокировки 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.

Таблица тактирования шины 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
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии