CUSTOMELECTRONICS.RU
Информационно-учебный блог о разработке электроники
Эл. почта: info@customelectronics.ru

STM32. Первый проект

В этой статье мы решим самую первую классическую задачу — мигание светодиодом. Это позволит нам пройти всю процедуру от задумки до конечного результата.
Напомним, что для программирования мы будем использовать CubeMX и Keil uVision, а также плату Nucleo-64 STM32F030. ПО должно быть установлено, как описано в предыдущей статье, а плата подключена к компьютеру.

Nucleo-64 STM32F030

Nucleo-64 STM32F030

Подготовка проекта в CubeMX

Начнем с запуска генератора инициализационного кода CubeMX. При ее запуске выбор небольшой. Нам нужен пункт меню New Project.
1
Обычно разработка электронных устройств предполагает то, что вы сами подбираете контроллер, готовите плату для устройства и т.д. На вкладке MCU Selector есть возможность найти выбранный ранее контроллер, либо при помощи параметрического поиска подобрать именно тот, который оптимально подойдет под ваши задачи, но у нас готовая отладочная плата от производителя, поэтому надо перейти на вкладку Board Selector.
Если вы используете ту же плату что и мы, то необходимо выбрать те же пункты, что указаны на картинке.
2
После этого вам откроется окно на вкладке Pinout, в котором очень удобно при помощи графического интерфейса настраивается периферия контроллера.
На основном экране показан условно сам контроллер. При нажатии мышкой на каждый из выводов контроллера выпадает меню, в котором перечислены все функции, которые он может выполнять (вход, выход, прерывания, АЦП и и.д.)
В левой части список основных настроек периферийных модулей контроллера. Например, если вы в этом списке раскроете пункт меню USART2 и поставите в нем галочку, то увидите сразу как на контроллере соответствующие выводы изменят свое состояние.
Но нам пока ничего здесь не надо менять. То есть мы работаем с заготовкой, которая уже настроена на нашу плату. В ней уже настроен UART, светодиод, кнопка и некоторые дополнительные функции, которые уже есть на плате.
3
Далее переходим на вкладку Clock Configuration. STM32 имеют очень сложную систему тактирования, которая позволяет замедлять работу отдельных функций на аппаратном уровне или полностью отключать отдельные модули, что в свою очередь дает дополнительные возможности по экономии энергии.
Опять же нам тут трогать ничего не надо, но ознакомиться с ней стоит.
4
На вкладке Configuration вам предоставляется дополнительные возможности по настройке подключенной к проекту периферии, которая для нашего случая уже заранее настроена.
5
Нажмите на кнопку GPIO (General Purpose Input/Output, порты ввода/вывода общего назначения).
У нас выбрано два вывода. К выводу PA5 мы еще на первой вкладке подключили светодиод, а к выводу PC13 кнопку. Здесь они настроены на выход и вход соответственно, а в этом меню можно произвести их более тонкую настройку.
6
Вкладку Power Consumption мы пока трогать не будем. Пока настройки и расчет потребляемой мощности нас не интересует.
7
На этом настройка завершена и мы готовы к тому, чтобы сгенерировать проект для дальнейшей работы в Keil.
Во вкладке Project выбираем пункт Generate Project. На этом шаге среда уже не знает что мы собираемся делать далее и тут уже придется что-то делать.
Задайте проекту имя и укажите директорию для его хранения (желательно без кириллических символов). Toolchain/IDE (инструментарий, Integrated Development Environment – интегрированная среда разработки) – в этом пункте необходимо выбрать MDK-ARM V5.
8
После нажатия кнопки Ok утилита начнет скачивание необходимых файлов и подготовит структуру проекты.
По окончании ее работы вы сможете найти файл проекта для Keil uVision.
9
CubeMX сразу предложит вам открыть сгенерированный проект. Сделайте это и Keil uVision откроется автоматически. В проводнике слева найдите файл main.c и откройте его.

Работа с проектом в Keil uVision

10
Интерфейс среды относительно прост. Сверху панель инструментов, слева дерево файлов проекта, справа текстовый редактор, снизу выходная информация о сборке проекта.
Обратите внимание на то, сколько всего для нас сделал CubeMX. Это он собрал воедино все файлы драйверов и библиотек, которые вы видите слева. И именно он написал весь текст файла main.c. Давайте немного подробнее поговорим о структуре этого автоматически сгенерированного кода.
В нем много комментариев с подсказками и разъяснениями. Нас интересуют именно те в комментарии в которых есть слова USER CODE BEGIN и USER CODE END. Между этими комментариями можно писать свой код. Дело в том, что после того как проект сгенерирован в CubeMX и вы начали уже изменять его, у вас может возникнуть желание подключить что-то дополнительно или изменить настройки. Если вы будете писать свою программу только в этих выделенных частях, то при изменении проекта в CubeMX в ваш код будет не тронут.
int main(void) – точка входа в программу. Затем по тексту происходит инициализация HAL-драйвера (Hardware Abstraction Layer). Это важный аспект нашего курса. Мы будем использовать именно этот драйвер и мы уже подбираемся к непосредственному написанию кода.
В файлах этого драйвера содержится исчерпывающие описание всех функций работы с аппаратным обеспечением нашего контроллера. Мы планируем включить светодиод, подключенный к выводу PA5. Соответственно нас интересует файл stm32f0xx_hal_gpio.c. Найдите его в списке файлов и откройте.
11
Желательно (а рано или поздно это произойдет), изучить все что там написано, но сейчас нам важен результат. Поэтому жмем Ctrl+F и ищем в документе слова HAL_GPIO_Write
12
Находим строку 425 и копируем в буфер обмена описание функции, которая будет изменять состояние вывода.
13
Затем мы возвращаемся к файлу main.c и в нем находим место где начинается бесконечный цикл while(1). В теле этого цикла у нас и будет происходить включение/выключение светодиода.
Скопированный текст необходимо вставить дополнительной 101ой строкой. Обратите внимание, что слева появится крестик, который обозначает что этот код неправильный.
14
В этой строке необходимо удалить типы переменных, указать конкретный порт и пин, и указать его состояние (ноль или единица). Для установки низкого напряжения на выводе необходимо написать GPIO_PIN_RESET. То есть в итоге у вас должно выглядеть все как на картинке:
15
Далее, в соответствии с задачей, нам необходимо ввести задержку, переключить вывод в высокое логическое состояние и снова сделать задержку.
Функция задержки описана в HAL-драйвере как HAL_Dealy();. Время задержки в ней указывается в миллисекундах. GPIO_PIN_SET – выставить вывод в единичное состояние.
Допишите остальные функции так как показано на рисунке:
16
Далее выполните команду Project -> Build, или нажмите F7. Если все сделано верно, то в нижнем окне после компиляции вы увидите сообщение о том, что axf-файл создан без ошибок и предупреждений.
17

Прошивка контроллера

Ранее мы уже подключили плату и проверили, что STLink работает. Можно прошить плату через STLink Utility, но лучше сразу настроить Keil на работу с ним.
Откройте пункт меню Debug -> Options. На вкладке Debug у вас должен быть выбран Use ST-Link Debugger.
19
Нажмите на кнопку Settings и перед вами откроется новое окно.
20
Перейдите на вкладку Flash Download и установите галочку Reset and Run. Эта галочка нужна чтобы программа запускалась на выполнение сразу после перезагрузки.
21
Теперь нажмите на кнопку Load на панели инструментов и через мгновение вы увидите как на плате замигает светодиод. Вы можете изменить время и убедиться в том, что это действительно вы его контролируете.
Сам светодиод на плате подписан как LD2. Если он не замигал, то, возможно, плата просто не начала исполнять программу после обновления прошивки. Попробуйте перезагрузить ее при помощи черное кнопки.

Пользовательский светодиод на плате

Пользовательский светодиод на плате

Итоги

Hello world на светодиоде это огромный шаг. Если вы проделали его и до этого хорошо знали язык (применяя его на другой платформе), то вы можете уверенно говорить, что STM32 вы освоили. То есть у вас есть полный инструментарий для работы с этими контроллерами.
Кому-то все эти действия могут показаться сложными, но надо помнить, что мы настроили очень мощный инструмент, дающий огромные возможности разработчику. Если посмотреть на сам код который мы написали, то он вполне будет понятен даже тем, кто только поверхностно знаком с Arduino. Все остальное связано только с настройкой среды.
Другими словами, если надо только мигать светодиодом, то возможно, проще будет это сделать и на Arduino, но если в перспективе вы хотите использовать USB, работать с файловой системой, RTOS и т.д., то на STM32 это будет не намного сложнее чем мигать светодиодом, тогда как для Arduino это почти недоступно.

Ссылки на остальные статьи цикла можно найти здесь.
Мы будем очень рады, если вы поддержите наш ресурс и посетите магазин наших товаров shop.customelectronics.ru.

Метки: , , , , , , , , , Просмотров: 22664

File not found.