15/07/2019

STM32 (2): удобная среда разработки — SES + CubeMX: методика ускорения разработки (часть 1)


STM32 (2): удобная среда разработки 
— SES + CubeMX: методика ускорения разработки (часть 1)

В предыдущей статье мы рассмотрели и настроили среду разработки на основе
Segger Embedded Studio (SES).
В этой статье я опишу методику ускорения разработки ПО под STM32 путём подключения HAL (Hardware Abstraction Level, библиотека абстракции от аппаратуры) от ST.
В прошлый раз мы упоминали пакет CMSIS (Cortex-M Software Interface Standard) — это набор общих для всех Cortex-M контроллеров дефайнов (#define). Эта, условно говоря, библиотека разработана для стандартизации процесса разработки и повышения переносимости кода между всеми Cortex-M контроллерами. У неё есть очевидное положительное качество — её легковесность, так как дефайны, раскрываясь при компиляции, не занимают места. И, да — она облегчает работу на Cortex-M (в том числе и на STM32). Но если вы будете писать код с использованием лишь CMSIS, вам придётся заполнять все структуры (множество структур) самостоятельно. И, более того, о, ужас, писать непонятные вещи, подобные этому:
GPIOA->ODR &= ~GPIO_ODR_ODR0;

Компания STMicroelectronics пошла дальше и разработала продукт называемый STM32CubeMX (CubeMX). CubeMX — свободный, кроссплатформенный пакет для настройки HAL от ST в графической среде. Процесс работы с использованием CubeMX выглядит примерно так: выбираем тип контроллера, настраиваем его интерфейсы, выбираем IDE, под которую нужно создать проект, нажимаем «Сгенерировать проект», открываем проект в выбранной IDE, работаем над функционалом. К сожалению CubeMX не поддерживает SES. Как это компенсировать я и расскажу на простом примере.

Для начала работы, скачайте CubeMX:
https://www.st.com/en/development-tools/stm32cubemx.html
Нужно нажать Get Software и, к сожалению без регистрации/авторизации скачать не получится.

Устанавливаем, запускаем, создаём проект (New Project > ACCESS TO MCU SELECTOR):

В открывшемся окне (загружается из базы продуктов ST) выберите свой контроллер — либо в списке, либо введите часть его названия в поле поиска слева вверху. По идее на генерацию кода это не должно влиять, но так как CubeMX у ST выполняет частично и функции продажи, придётся выбрать даже тип корпуса. В прочем, если вам придётся реально отлаживать комплекс на уровне железа (осциллограф, анализатор, тестер) — будет ещё удобнее видеть где какие конкретные выводы находятся. Ведь CubeMX нарисует вам выбранный контроллер в выбранном корпусе с реальным расположением и названиями ног и выводов!


Вверху вы увидите три вкладки — Pinout & Configuration, Clock Configuration и Project Manager.
Начнём с самого основного — настройки частоты на которой будет работать наш контроллер. Перейдите на вкладку Clock Configuration. Вы увидите следующее (картина будет отличаться в зависимости от выбранного контроллера, я для примера рассматриваю один из самых простых — STM32L011):


Видите как много параметров в настройке частоты? А теперь введите в поле HCLK (MHz) (обычно чуть выше и правее середины схемы) значение. CubeMX даже подскажет вам максимальную частоту, которую вы можете себе «позволить» на выбранном контроллере.


После нажатия Enter, CubeMX сам рассчитает всю цепь, а в случае некорректного значения сообщит об ошибке.

Далее во вкладке Project Manager введите название проекта, пути и прочее. В поле Toolchain / IDE выберите MDK-ARM V5. Последнее важно для импортирования проекта в SES. Теперь нажмите «GENERATE CODE» (находится справа вверху). CubeMX создаст проект, скопирует HAL под нужный контроллер и, что самое главное — сгенерирует высокоуровневый код (с использованием HAL'а), который выполнит инициализацию всего того, что мы настроили в графической среде.

Как я уже писал — под SES CubeMX не умеет делать проекты. Сейчас мы будем это исправлять. Открываем SES и создаём проект, выбираем тот же контроллер, что и в CubeMX. Здесь не повторяюсь — этот процесс описан в предыдущей статье.

Открываем оба каталога — с проектом CubeMX и с проектом SES. Далее будем копировать файлы из каталога с проектом CubeMX в корень каталога проекта SES (себе). Я буду показывать процесс на примере проекта под STM32L0xx. В случае использования другого контроллера, имена каталогов изменятся соответственно.
1. Удаляем из проекта SES файл main.c (нажать на нём правой кнопкой и выбрать «X Delete»).
2. Копируем себе каталоги Src и Inc.
3. Перемещаем файл Src/system_stm32l0xx.c в каталог STM32L0xx/CMSIS/Device/Source (с замещением).
4. Копируем каталог STM32L0xx_HAL_Driver (у CubeMX находится в каталоге Drivers). Я обычно копирую его в каталог STM32L0xx, который SES создаёт в корне проекта.
5. Добавляем новые файлы исходного кода: жмём правой кнопкой мыши по Source Files, выбираем Add Existing File... и указываем все файлы из каталога Src.
6. Повторяем эту процедуру, указывая все файлы из каталога STM32L0xx/STM32L0xx_HAL_Driver/Src
7. Открываем свойства проекта (правая кнопка на проекте —> Options...), ищем User Include Directories и указываем:
.
./Inc
STM32L0xx/STM32L0xx_HAL_Driver/Inc



На этом самая сложная часть импорта ST HAL'а в проект завершилась. На данном этапе ваш проект должен компилироваться, собираться, загружаться и работать.
Для проверки правильно ли выставилась частота контроллера, добавим в наш main следующий функционал. Найдите вызов функции SystemClock_Config() и добавьте до и после неё соответствующий вывод:

printf ("Unset clock speed is: %dMHz ", HAL_RCC_GetSysClockFreq () / (1000 * 1000));
SystemClock_Config(); printf ("Clock speed is set to: %dMHz ", HAL_RCC_GetSysClockFreq () / (1000 * 1000));

У меня выводит следующее:
Unset clock speed is: 2MHz Clock speed is set to: 32MHz

Завершающее эту статью замечание. В коде, созданном в CubeMX вы увидите множество комментариев, в том числе и вида
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */

По задумке разработчиков из ST CubeMX должен по этим меткам определять, где пользовательский код и при последующих изменениях настройки контроллера сохранять эти изменения. Так как с SES CubeMX не работает, эти комментарии нам уже не понадобятся. Лично я их удаляю все и сразу. Вы можете абсолютно без риска поступить так же.
Разумеется выставить частоту контроллера не единственная задача на наших проектах, поэтому в следующей статье я покажу что ещё можно делать в CubeMX и как добавлять в свой проект дальнейшие изменения если вы удалили комментарии USER CODE BEGIN/END.