STM32F101-107 HAL GPIO настройка и использование выводов портов контроллера.
STM32F101-107 GPIO(главные пины вывода и ввода) являются нервными окончаниями контролера с помощь которых можно контролировать те или иные внешние события, используются как входы так, выходы и для работы периферии контроллера.
Схема выводов.
Функции настройки и работы с GPIO.
GPIO_InitTypeDef- объявление структуры для настройки вывода.
HAL_GPIO_Init( GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)- функция настройки вывода.
HAL_GPIO_DeInit( GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin)- удаление настройки вывода.
__HAL_RCC_GPIOx_CLK_ENABLE()- функции для управления тактирование порта.
HAL_GPIO_ReadPin( GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)- функция чтения вывода.
HAL_GPIO_WritePin( GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)- функция изменения состояние вывода.
HAL_GPIO_TogglePin( GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)- функция меняет состояние вывода на противоположное.
HAL_GPIO_LockPin( GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)- функция блокирует изменение настроек вывода.
Настраивается вывод следующей структурой.
GPIO_InitTypeDef;
Настраиваемые параметры структуры:
/*Выбор вывода*/
.Pin =
GPIO_PIN_0
GPIO_PIN_1
GPIO_PIN_2
GPIO_PIN_3
GPIO_PIN_4
GPIO_PIN_5
GPIO_PIN_6
GPIO_PIN_7
GPIO_PIN_8
GPIO_PIN_9
GPIO_PIN_10
GPIO_PIN_11
GPIO_PIN_12
GPIO_PIN_13
GPIO_PIN_14
GPIO_PIN_15
GPIO_PIN_All
/*Как будет работать вывод*/
.Mode =
GPIO_MODE_INPUT как вход
GPIO_MODE_OUTPUT_PP как выход, подключается к питанию и к земле
GPIO_MODE_OUTPUT_OD как выход, подключается только к земле
GPIO_MODE_AF_PP альтернативная функция, подключается к питанию и к земле
GPIO_MODE_AF_OD альтернативная функция, подключается только к земле
GPIO_MODE_AF_INPUT альтернативная функция, работает на вход
/*Если вывод работает на вход*/
.Pull =
GPIO_NOPULL подтягивающие резисторы отключены
GPIO_PULLUP подтягивающий резистор подключен к питанию
GPIO_PULLDOWN подтягивающий резистор подключен к земле
/*Выбор скорости переключения вывода*/
.Speed =
GPIO_SPEED_FREQ_LOW вывод работает до 2 MHz
GPIO_SPEED_FREQ_MEDIUM вывод работает до 10 MHz
GPIO_SPEED_FREQ_HIGH вывод работает до 50 MHz
/*Пример настройки*/
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
Функция настраивает вывод.
HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init);
/*Принимают название порта пина *GPIOx*/
GPIOA
GPIOB
GPIOC
GPIOD
GPIOE
/*и адрес структуры настройки *GPIO_Init*/
/*Пример*/
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
Функция сбрасывает настройки вывода, возвращает в начальное состояние.
HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin); функция принимает те же параметры, что и HAL_GPIO_Init
/*Пример*/
HAL_GPIO_DeInit(GPIOC, GPIO_PIN_13);
Для активации работы порта нужного вывода необходимо включить его тактирование следующей функцией.
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOE_CLK_ENABLE();
Функции для управления выводом.
Следующими функциями вы сможете читать состояние вывода если он работает как вход и изменять его состояние если настроен как выход а также блокировка вывода.
Функции для чтения состояния
HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
принимает название порта и вывода
/*Пример проверки на отключенное состояние*/
if(HAL_GPIO_ReadPin( GPIOA, GPIO_PIN_0)==GPIO_PIN_RESET){ }
/*Пример проверки на включенное состояние*/
if(HAL_GPIO_ReadPin( GPIOA, GPIO_PIN_0)==GPIO_PIN_SET){ }
Функция меняет состояние вывода
HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
Принимает название порта, название вывода устанавливаемое состояние
Это GPIO_PIN_RESET если отключаем вывод или GPIO_PIN_SET включаем
/*Пример для включения вывода*/
HAL_GPIO_WritePin( GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
/*Пример для отключения вывода*/
HAL_GPIO_WritePin( GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
Функция меняет состояние вывода на противоположное
HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
Функция принимает название порта и вывода
/*Пример*/
HAL_GPIO_TogglePin( GPIOC, GPIO_PIN_13);
Функция блокирует изменение настроек вывода, изменить будет можно только после сброса контроллера.
HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin); функция принимает название порта и вывода
/*Пример*/
HAL_GPIO_LockPin(GPIOC, GPIO_PIN_13);
Пример программы.
В программе настраиваем выводы для мигания светодиода и для сканирования состояния вывода.
/*ProgCont.ru*/
#include "main.h"
int main(void)
{
HAL_Init();
__HAL_RCC_GPIOC_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
while (1)
{
if(HAL_GPIO_ReadPin( GPIOA, GPIO_PIN_0)==GPIO_PIN_RESET){
HAL_Delay(100);
HAL_GPIO_TogglePin( GPIOC, GPIO_PIN_13);
}else{HAL_GPIO_WritePin( GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);}
}
}
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t *file, uint32_t line)
{
}
#endif /* USE_FULL_ASSERT */
Настройка вывода в STM32CubeIDE используя STM32CubeMX.
Если вы используете STM32CubeIDE то можно использовать графический редактор STM32CubeMX, для этого открываем файл проекта как на рисунке
Теперь выбираем нужный вывод
Выбираем функцию вывода
Настраиваем вывод жмём на System Core(с лева) и выбираем нужную конфигурацию вывода