Поскольку инструмент под названием STM32CubeMx становится все более популярным, и интерес к нему постоянно возрастает, на нашем сайте в ближайшее время появится цикл статей, посвященных настройке разных периферийных модулей. И начнем мы с самого простого - а именно с портов ввода-вывода, так же известных как GPIO.
Не пропустите первую статью по STM32CubeMx - ссылка.
Я буду использовать отладочную плату STM32F4Discovery, ну и, соответственно, проект будет под STM32F4. В качестве среды разработки - IAR. Но на самом деле существенной разницы в использовании CubeMx при работе с STM32F4 или, например, STM32F1 нет.
Итак, сегодня у нас цель запустить GPIO при помощи кода, сгенерированного STM32CubeMx, поэтому поставим себе какую-нибудь простенькую задачу. На STM32F4Discovery у нас в наличии одна пользовательская кнопка и четыре светодиода. Давайте при нажатой кнопке будем зажигать зеленый и синий диоды, а при не нажатой - красный и оранжевый. К выводам микроконтроллера подключено все следующим образом:
Исходя из данной информации нам необходимо настроить выводы PD12, PD13, PD14 и PD15 на работу в режиме выхода, а PA0 надо настроить в качестве входа. Режим работы портов можно задавать банальнейшим образом кликая на них и выбирая необходимый пункт меню:
Пока ничего сложного. Обратите внимание, что у меня активны еще и выводы PA13 и PA14, которые используются для программатора ST-Link. Его также надо обязательно активировать в случае необходимости в соответствующем пункте:
Далее идем на вкладку "Project Manager" и там сохраняем базовые настройки проекта, а именно его имя, путь для сохранения сгенерированных файлов, а также выбираем IDE, для которой необходимо создать файлы проекта. В моем случае это IAR (EWARM):
На этом подготовительный этап заканчивается, и мы можем переходить к генерации кода. И этап этот также очень прост - нажимаем на соответствующую кнопку "Generate Code" в правом верхнем углу программы. В папке, которую мы указали в настройках проекта, теперь появились файлы с исходным кодом, а также файлы проекта. Собственно, теперь мы можем открыть и собрать сгенерированный проект в выбранной IDE.
Таким образом, CubeMx не просто сгенерировал код, также был создан проект, в котором уже прописаны все пути ко всем нужным файлам, а также выбранный способ отладки (ST-Link) и остальные сопутствующие настройки. Единственное, что в данном случае не может сделать STM32CubeMx - это за нас решить задачу с мигающими диодами. Так что сейчас мы добавим пару строк кода в файл main.c и проверим наш проект на практике.
Как вы помните, CubeMx не использует SPL, ее место заняла библиотека HAL, поэтому функции будут отличаться от тех, которые мы привыкли использовать в проектах с SPL:
int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration----------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* Configure the system clock */ SystemClock_Config(); /* Initialize all configured peripherals */ MX_GPIO_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ GPIO_PinState currentButtonState = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0); if (currentButtonState == GPIO_PIN_RESET) { HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_RESET); } else { HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_SET); } } /* USER CODE END 3 */ }
По итогу все оказывается несложно, первым делом в цикле while(1)
анализируем состояние кнопки:
GPIO_PinState currentButtonState = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);
Если кнопка нажата (currentButtonState == 0
, поскольку кнопка замыкает на землю), то гасим красный и оранжевый (PD13, PD14) и зажигаем зеленый и синий светодиоды (PD12, PD15):
if (currentButtonState == GPIO_PIN_RESET) { HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_RESET); }
В случае ненажатой кнопки все наоборот. Прошиваем программу в микроконтроллер и видим, что все работает именно так как и должно. В принципе, в такой простой задаче не особо видны преимущества использования такого мощного инструмента как STM32CubeMx, но нашей целью было, в первую очередь, сделать пример для работы с GPIO, и с этой задачей мы справились на все 100 процентов. Так что на сегодня на этом все, скоро продолжим 🤝