В этой заметке можно найти практическое применение теории, описанной в предыдущей записи, а именно, разбирается пример кода на языке Си, показывающий, как можно устанавливать и считывать значения на пинах портов GPIO, и что с этим можно делать. Для начала, техническое задание, показывающее то, что должно получиться при загрузке прошивки, собранной из приводимого ниже кода, в МК на плате STM32F4DISCOVERY.
Техническое задание
Разработать программное обеспечение на языке Си, предназначенное для загрузки в МК STM32F407VGT6, установленный на отладочной плате STM32F4DISCOVERY. ПО должно обеспечивать следующую функциональность:
- Поочерёдное включение/выключение расположенных на плате пользовательских светодиодов, как по часовой, так и против часовой стрелке.
- Изменение направления переключения светодиодов должно осуществляться при нажатии и последующем отпускании пользовательской кнопки.
Создание/получение проекта
Если Вы уже клонировали Git-репозиторий, как это было описано в заметке о настройке ПО, можете проапдейтить проект, зайдя из консоли командной строки в его корневую папку и набрав там:
git pull
если же нет, то можете клонировать его, как там описано, или же, создать проект с нуля, как описано в заметке о создании проекта CoIDE. Я решил несколько изменить структуру для размещения примеров в репозитории. Помещённый ранее пример по прежнему доступен как lab1, так как он уже упоминался в заметке о проверке конфигурации. Код для приводимого здесь примера находится в папке stm32_base/gpio/leds_button/leds_button_c/. Остальные примеры планируется размещать придерживаясь такой же структуры.
В проект должны быть включены все периферийные компоненты, которые были указаны при описании создания проекта. Если про какой-либо забудете, проект не собирётся, и компилятор в консоли CoIDE выдаст сообщение об отсутствии определения каких-либо программных сущностей.
Получение справки по используемым функциям, структурам и константам
Приводимый ниже код, на мой взгляд, достаточно подробно комментирован. Поэтому подробно разбирать отдельно я его не буду, а приведу лишь блок-схему его работы. Подробнее узнать об использованных функциях, структурах и константах можно воспользовавшись системой помощи CoIDE. Как уже было описано, на вкладке Peripherals панели Repository, которую, если она у Вас закрыта, можно вызвать через верхнее меню View->Repository при шелчке левой кнопкой мыши по названию компонента, на панели Help, которая, если закрыта, может быть отображена через View->Help, появляется краткая справка по его функциям. Имя функции представляет собой ссылку, перейдя по которой, можно получить более подробную информацию о ней, а так же о принимаемых ей в качестве параметров структурах и константах. Так же информацию о функциях, структурах и константах можно получить установив текстовый курсор на их имени в исходном коде и нажав F3, при этом в отдельной вкладке откроется место с её определением. Это же действие можно сделать через контекстное меню, появляющееся при нажатии на правую кнопку мыши. Файлы компонентов достаточно хорошо комментированы, собственно, на панели Help можно прочитать как раз информацию, из них и взятую. Так же полезно лучше понять работу используемых функций разбирая и анализируя их исходный код.
Алгоритм работы
Диаграмма алгоритма создана при помощи программы yEd
Исходный код
Следующую заметку я планирую посвятить краткому описанию архитектуры подсемейства МК STM32F407, а так же ядра Cortex-M4F, на котором данные МК базируются, а затем вернуться к приводимому в этой заметке коду, рассмотрев на его примере отладку в CoIDE.