HAL GPIO Generic Driver. Функции управления портами ввода-вывода.

 


 

Функции управляют портами ввода вывода: задают конфигурацию, считывают и устанавливают состояния выводов.

Перед вызовом функций необходимо включить тактирование нужных портов командой __HAL_RCC_GPIOx_CLK_ENABLE().

__HAL_RCC_GPIOB_CLK_ENABLE(); // включение порта В

 

HAL_GPIO_Init

void HAL_GPIO_Init (GPIO_TypeDef * GPIOx, GPIO_InitTypeDef * GPIO_Init)

Инициализация портов ввода-вывода.

  • GPIOx – выбор порта (GPIOA, GPIOB, GPIOC … ).
  • GPIO_Init – указатель на структуру параметров инициализации типа GPIO_InitTypeDef.

Возвращаемого значения нет.

Структура инициализации.

typedef struct
{
  uint32_t Pin;       // номер вывода
  uint32_t Mode;      // режим
  uint32_t Pull;      // режим подтягивающего резистора
  uint32_t Speed;     // скорость переключение выходного сигнала
} GPIO_InitTypeDef;

  • Pin – номер вывода. Может принимать значения:
    •  GPIO_PIN_0
    • . . . . . . . . . . . .
    • GPIO_PIN_15
    • GPIO_PIN_All
    • GPIO_PIN_MASK

Можно использовать маску битов ( например: GPIO_PIN_1 | GPIO_PIN_8 | GPIO_PIN_14) или все выводы сразу GPIO_PIN_MASK.

  • Mode – режим вывода.
    • GPIO_MODE_INPUT – свободный вход, брошенный в воздухе.
    • GPIO_MODE_OUTPUT_PP – активный выход (Push Pull).
    • GPIO_MODE_OUTPUT_OD – выход с общим стоком.
    • GPIO_MODE_AF_PP – активный выход альтернативной функции.
    • GPIO_MODE_AF_OD – выход с общим стоком альтернативной функции.
    • GPIO_MODE_AF_INPUT – вход альтернативной функции.
    • GPIO_MODE_ANALOG – аналоговый вход.
    • GPIO_MODE_IT_RISING – внешнее прерывание по положительному фронту.
    • GPIO_MODE_IT_FALLING – внешнее прерывание по отрицательному фронту.
    • GPIO_MODE_IT_RISING_FALLING – внешнее прерывание по положительному/отрицательному фронту.
    • GPIO_MODE_EVT_RISING – внешнее событие по положительному фронту.
    • GPIO_MODE_EVT_FALLING – внешнее событие по отрицательному фронту.
    • GPIO_MODE_EVT_RISING_FALLING -внешнее событие по положительному/отрицательному фронту.
  • Pull – режим подтягивающего резистора.
    • GPIO_NOPULL – резистор отключен.
    • GPIO_PULLUP – резистор подключен к шине питания.
    • GPIO_PULLDOWN – резистор подключен к земле.
  • Speed – максимальное быстродействие переключения выходного сигнала.
    • GPIO_SPEED_FREQ_LOW – низкая.
    • GPIO_SPEED_FREQ_MEDIUM – средняя.
    • GPIO_SPEED_FREQ_HIGH  - высокая.

Пример инициализации вывода.

GPIO_InitTypeDef GPIO_InitStruct = {0};

/* конфигурация вывода PC13 на активный выход */
GPIO_InitStruct.Pin = GPIO_PIN_13; // вывод
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // режим - выход
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM; // средняя скорость
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

 

HAL_GPIO_DeInit

void HAL_GPIO_DeInit (GPIO_TypeDef * GPIOx, uint32_t GPIO_Pin)

Функция деинициализации вывода. Устанавливает конфигурацию вывода, как при сбросе микроконтроллера.

  • GPIOx – выбор порта (GPIOA, GPIOB, GPIOC … ).
  • Pin – номер вывода (GPIO_PIN_0 … GPIO_PIN_15).

Возвращаемого значения нет.

Пример.

HAL_GPIO_DeInit(GPIOC, GPIO_PIN_13); // сброс конфигурации PC13

 

HAL_GPIO_ReadPin

GPIO_PinState HAL_GPIO_ReadPin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin)

Читает состояние вывода.

  • GPIOx – выбор порта (GPIOA, GPIOB, GPIOC … ).
  • Pin – номер вывода (GPIO_PIN_0 … GPIO_PIN_15).

Возвращает значение вывода:

  • GPIO_PIN_SET – высокий уровень на выводе;
  • GPIO_PIN_RESET – низкий уровень на выводе.

Пример чтения состояния порта.

if( HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_10) == GPIO_PIN_SET ) {
    // на выводе PC10 высокий уровень
}
else {
    // на выводе PC10 низкий уровень     
}

 

HAL_GPIO_WritePin

void HAL_GPIO_WritePin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)

Устанавливает состояние вывода.

  • GPIOx – выбор порта (GPIOA, GPIOB, GPIOC … ).
  • Pin – номер вывода (GPIO_PIN_0 … GPIO_PIN_15).
  • PinState – состояние  вывода:
    • GPIO_PIN_SET – высокий уровень;
    • GPIO_PIN_RESET - низкий уровень.

Функция работает с регистрами битовых операций портов. Нет опасности, что прерывание может вклиниться в момент выполнения операции. Как это может случиться при использовании регистра вывода данных в режиме чтение, модификация, запись.

Пример.

HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET); // сброс вывода PC13

HAL_GPIO_WritePin(GPIOC, GPIO_PIN_10 | GPIO_PIN_12, GPIO_PIN_RESET); // сброс выводов PC10 и PC12

 

HAL_GPIO_TogglePin

void HAL_GPIO_TogglePin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin)

Инвертирует состояние вывода.

  • GPIOx – выбор порта (GPIOA, GPIOB, GPIOC … ).
  • Pin – номер вывода (GPIO_PIN_0 … GPIO_PIN_15).

Возвращаемого параметра нет.

Пример.

HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); // инверсия вывода PC13

HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_3 | GPIO_PIN_5 | GPIO_PIN_10); // инверсия выводов PB3, PB5 и PB10

 

HAL_GPIO_LockPin

HAL_StatusTypeDef HAL_GPIO_LockPin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin)

Блокировка (защита от изменения) регистров конфигурации портов.

  • GPIOx – выбор порта (GPIOA, GPIOB, GPIOC … ).
  • Pin – номер вывода (GPIO_PIN_0 … GPIO_PIN_15).

Возвращаемого параметра нет.

Пример.

HAL_GPIO_LockPin(GPIOC, GPIO_PIN_13); // блокировка конфигурации вывода PC13