Всем нам известная фирма ST Microelectronics выпустила и активно развивает абсолютно новый продукт под названием STM32CubeMx, и я не мог обойти это вниманием 🙂 Сегодня разберемся, что это вообще такое и для чего это нужно.
Итак…
STM32CubeMx – абсолютно новый программный продукт, позволяющий легко и непринужденно при помощи достаточно понятного графического интерфейса произвести настройку любой имеющейся на борту микроконтроллера периферии. Предыстория создания CubeMx такова – ST имеют очень разнообразную линейку микроконтроллеров, тут вам и Cortex-M0, и Cortex-M0+, и Cortex-M3, и Cortex-M4. Соответственно, встает вопрос о каком-то едином наборе библиотек и едином инструменте для настройки и конфигурирования всего этого многообразия. Вот для решения этих целей и был выпущен STM32CubeMx.
Работает все это так – создаем проект, выбираем микроконтроллер и нам сразу же предлагается большая схема со всеми выводами выбранного нами контроллера. Нажимая на выводы и заходя в разнообразные меню, мы легко настраиваем как периферию, так и режимы работы каждого конкретного вывода. Сразу же очевидные плюсы – можно наглядно увидеть, какие выводы уже заняты, а какие еще свободны (в крупных проектах – более чем полезная фишка). Как все это работает мы еще увидим на примере, а пока обсудим в общих чертах 🙂
Итак, мы выбрали все нужные нам выводы, ввели все настройки периферии (например, частоты тактирования, режимы работы таймеров….), и STM32CubeMx дает нам возможность сгенерировать соответствующий код. То есть в итоге мы получаем готовый проект, с уже прописанными настройками, с подключенными библиотеками и с готовой инициализацией всей выбранной периферии. Базой для всего этого являются библиотеки CMSIS и HAL. С CMSIS мы уже давно знакомы, а вот вторая библиотека – это что-то новое.
Библиотека STM32 HAL Driver пришла (пока еще не окончательно) на смену всем хорошо известной библиотеке Standard Peripheral Library (SPL). В принципе, и структура и функции этих библиотек очень схожи, но HAL более заточена под принцип “вызвал функцию и сразу заработало”. Для тех, кому не особо хочется возиться с какими-то низкоуровневыми настройками периферии – то что надо 🙂 Естественно, на данный момент библиотека еще “сыровата”, есть некоторые недоработки, но с каждым новым релизом ситуация все лучше и лучше.
Перейдем к практике. И тут я решил остановить свой выбор на семействе STM32F4, хотя это не имеет особого значения, поскольку мы всего лишь хотим ознакомиться с функционалом и принципом работы STM32CubeMx. Итак ST предлагают нам во-первых, собственно, сам STM32CubeMx (в скачанном архиве будет .exe файл для установки программы), а также набор библиотек STM32Cube FirmWare F4. Несмотря на почти одинаковые названия архивов на сайте ST – это абсолютно разные вещи. CubeMx – готовый софт для конфигурирования периферии, Cube FW – набор множества библиотек.
И для начала рассмотрим, что же за библиотеки нам предлагаются. Распаковываем архив и начинаем ковырять:
Идем в папку Drivers – и там находим следующие библиотеки:
- BSP – папка с драйверами для конкретных отладочных плат на базе STM32F4. Например, для STM32F4Discovery там можно найти файлы с уже готовой реализацией обмена данными с акселерометром. Само собой светодиодами там тоже можно помигать 🙂
- Кроме того, в папке Drivers лежит библиотека CMSIS и STM32F4xx_HAL_Driver, которую мы уже обсудили.
- Папка Middlewares содержит содержит вещи посерьезней – библиотеки для работы с аудио, USB, а также библиотеки FatFs, FreeRTOS и другие, адаптированные под использование совместно с STM32F4xx HAL Driver.
- В папке Projects – огромное количество готовых примеров на любой случай жизни и для всех основных отладочных плат.
В общем практически все, что может понадобиться, собрано в одном месте. Переходим к STM32CubeMx. И для начала устанавливаем программу. А потом и запускаем:

Выбираем новый проект. Сразу же открывается окно с огромным количеством настроек, в котором нам необходимо выбрать микроконтроллер, который мы собираемся использовать в нашем проекте. Я выбрал STM32F407VGTx. Появляется новое окно:

И тут мы уже видим в правой части изображение нашего контроллера со всеми выводами, а слева список всей доступной периферии. Также в левой части окна можно выбрать будет ли использоваться, например, FreeRTOS в нашем проекте.
Если мы зайдем сверху в меню Project и выберем там Settings, то Cube предложит нам выбрать для какой IDE произвести генерацию кода. Я оставлю без изменений – IAR v6.70.Также в этом окне надо ввести название проекта и выбрать путь для его сохранения.

Давайте для примера выберем что-нибудь. Пусть будет задействован первый канал АЦП и три вывода, работающих в режиме выхода.
- кроме того, если планируется использовать отладчик, необходимо в пункте SYS выбрать отладочный интерфейс. Например, для отладчика ST-Link настройки будут выглядеть так:
Готово! теперь нажимаем на кнопку Generate Source Code, и Cube предложит нам скачать необходимые библиотеки (как раз те, которые мы обсудили в начале проекта). Пусть скачиваются, просто ждем.
После окончания генерации открываем папку с нашим проектом и видим, что там появились новые файлы и папки. В папке Drivers содержатся все необходимые библиотеки, а в папках src и inc, соответственно, сами файлы с кодом нашей инициализации. Откроем, например, файл main.c:
/***************************************************************************************/ 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(); /* System interrupt init*/ /* Sets the priority grouping field */ HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_0); HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_ADC1_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ /* USER CODE BEGIN 3 */ /* Infinite loop */ while (1) { } /* USER CODE END 3 */ } /***************************************************************************************/
В функции main() вызываются MX_GPIO_Init() и MX_ADC1_Init(), которые определены в этом же файле – main.c. Собственно, в этих функциях и содержится инициализация и настройка всей периферии, которую мы выбрали при создании проекта в STM32CubeMx. Как видите, все работает!
В общем, пожалуй, на сегодня это все 🙂 Разобрались в общих чертах с новыми библиотеками и с созданием тестового проекта при помощи STM32CubeMx, так что до скорых встреч на нашем сайте!