Функции управляют портами ввода вывода: задают конфигурацию, считывают и устанавливают состояния выводов.
Перед вызовом функций необходимо включить тактирование нужных портов командой __HAL_RCC_GPIOx_CLK_ENABLE().
__HAL_RCC_GPIOB_CLK_ENABLE(); // включение порта В
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);
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
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 низкий уровень
}
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
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_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