Установка и настройка Eclipse, STM32CubeMX под Windows

Здесь описываю настройку среды разработки для микроконтроллеров STM32, с использованием Eclipse, STM32CubeMX, GNU ARM Embedded, GNU ARM Eclipse Plugins. На примере микроконтроллера STM32F030F4P6.

Видео: Настройка Eclipse и STM32CubeMX под Windows

На видео приведён весь процесс установки и настройки. Операционная система Windows 10, взята с сайта Microsoft: Download virtual machines. Образы выложены там для тестирования софта под различными браузерами.

Описываемая последовательность не обязана работать на Вашем ПК, т.к. правильность настроек может зависеть от текущего окружения операционной системы. Если у Вас это не работает или найдёте ошибку, пишите в комментариях.

Загрузка

Список ПО, которое понадобится:

Установка

Java Virtual Machine

Далее, далее, ... тут всё понятно.

Eclipse IDE for C/C++ Developers

Распаковываем архив с IDE куда-нибудь.

Windows Build Tools

Установка описана в руководстве. Ничего необычного.

GCC ARM Embedded

При завершения установки снимаем галочки с Launch gccvar.bat и Add path to enviroment variable. Чтобы можно было установить несколько компиляторов.

GNU ARM Eclipse plug-ins

Установка описана в руководстве. В меню Eclipse выбираем Help -> Install New Software.... Добавляем сайт

  • name: GNU ARM Eclipse Plug-ins
  • URL: http://gnuarmeclipse.sourceforge.net/updates

И устанавливаем всё.

STM32CubeMX Eclipse plug in

Запускаем Eclipse. Через меню Help -> Install New Software... устанавливаем плагин из архива STSW-STM32095.zip. Перезапускаем Eclipse.

STM32CubeF0

Запускаем Eclipse. Открываем STM32CubeMX через меню Window -> Show View -> Other.... Там в дереве, в ветке Other, будет STM32CubeMX. В меню STM32CubeMX выбираем Help -> Install New Libraries, открывается окно установки пакетов под серии микроконтролллеров. Нажимаем кнопку From Local... и выбираем скачанный ранее архив STM32CubeF0.ZIP.

Jlink

Всё как обычно.

Настройка

Создание проекта в Eclipse

В мастере создания нового проекта выбираем C/C++ -> C Project. Далее указываем имя проекта и тип Hello World ARM C Project, Toolchain Cross ARM GCC. Далее меняем каталог исходников Source с src на Src. В Linker semi-hosting options стираем всё и пишем

--specs=nosys.specs

Пробуем собрать проект.

Создание проекта в STM32CubeMX

Генерация кода

Запускаем STM32CubeMX, создаём новый проект. В списке микроконтроллеров выбираем нужный (здесь STM32F030F4P6 для примера). Настраиваем как нужно. Запускаем генерацию кода из меню. Указываем имя проекта как было в Eclipse выше. Указываем Project Location на каталог workspace, где лежит тот проект. Меняем Toolchain/IDE на SW4STM32. Запускаем. Исходные коды проекта будут созданысгенерированы поверх уже существующего проекта. Закрываем STM32CubeMX.

Обновляем дерево проекта в Eclipse. Появляются новые каталоги, Driver и Inc. Сгенерированный Src совпал с уже сушествующим. Новые каталоги исключены из сборки, поэтому включаем их через свойства в контекстном меню. При необходимости, меняем в свойствах проект кодировку исходников на UTF-8.

Создаём в каталоге Src файл startup.asm. Прописывываем в нём путь к стартовому файлу на ассемблере:

.include "../Drivers/CMSIS/Device/ST/STM32F0xx/Source/Templates/gcc/startup_stm32f030x6.s"

Это позволит оставить файлы .s_ на месте (они не попадают под сборку ассемблером), но в то же время включить нужный в сборку через файл _.asm.

Ищем файл ../Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_msp_template.c и исключаем его из сборки, через свойства файла.

Перенос настроек

Далее, надо перенести настройки проекта из сгенерированного в существующий. Открываем XML файл сгенерированного проекта в ./SW4STM32/ Configuration/.cproject. Делаем его текст более читаемым через любое средство форматирования XML, позволяющее разнести атрибуты по строкам.

Include

Ищем в XML файле пути для Include, в ноде, подобной следующей:

<tool
    id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.147826764"
    name="MCU GCC Compiler"
    superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler">
    <option
        id="gnu.c.compiler.option.include.paths.976375416"
        name="Include paths (-I)"
        superClass="gnu.c.compiler.option.include.paths"
        useByScannerDiscovery="false"
        valueType="includePath">
        <listOptionValue
            builtIn="false"
            value="..\..\..\Inc" />

Открываем свойства проекта в Eclipse, идём в C/C++ Build -> Settings -> Tool Settings -> Cross ARM C Compiler -> Includes. Добавляем найденные каталоги из XML файла в список Include paths (-I). Заменяем относительные пути:

../../../Inc
../../../Drivers/STM32F0xx_HAL_Driver/Inc

на

${ProjDirPath}/Inc
${ProjDirPath}/Drivers/STM32F0xx_HAL_Driver/Inc

Define

Ищем в XML файле макросы, в ноде, подобной следующей:

<tool
    id="fr.ac6.managedbuild.tool.gnu.cross.c.compiler.147826764"
    name="MCU GCC Compiler"
    superClass="fr.ac6.managedbuild.tool.gnu.cross.c.compiler">
    <option
        id="gnu.c.compiler.option.preprocessor.def.symbols.1801753735"
        name="Defined symbols (-D)"
        superClass="gnu.c.compiler.option.preprocessor.def.symbols"
        useByScannerDiscovery="false"
        valueType="definedSymbols">
        <listOptionValue
            builtIn="false"
            value="__weak=__attribute__((weak))" />

Открываем свойства проекта в Eclipse, идём в C/C++ Build -> Settings -> Tool Settings -> Cross ARM C Compiler -> Preprocessor. Добавляем найденные макросы из XML файла в список Defined symbols (-D). Список примерно следующий:

__weak="__attribute__((weak))"
__packed="__attribute__((__packed__))"
USE_HAL_DRIVER
STM32F030x6
ARM_MATH_CM0

Последнего в XML файле нет, но без него библиотеки не соберутся.

ARM family

Открываем свойства проекта в Eclipse, идём в C/C++ Build -> Settings -> Tool Settings -> Target Processor -> ARM family, выбираем cortex-m0, соответственно микроконтроллеру.

Linker script

Открываем свойства проекта в Eclipse, идём в C/C++ Build -> Settings -> Tool Settings -> Cross ARM C Linker -> General. Добавляем в список Scripts files (-T) путь к файлу скрипта, созданного при генерации проекта в STM32CubeMX. Например, ./SW4STM32/ Configuration/STM32F030F4Px_FLASH.ld. Ниже, в Miscellaneous, ставим галочку на Use newlib-nano (--specs=nano.specs).

Сборка.

Собираем проект. Для ускорения сборки можно включить параллельную работу в свойствах проекта C/C++ Build -> Behavior -> Enable parallel build.

Отладка

Проверка связи с отладчиком и микроконтроллером через J-Flash.

Запускаем J-Flash. Создаём новый проект. В свойствах проекта выбираем свой отладчик, Target Interface, CPU -> Device. Выполняем подключение Target -> Connect. Если в логах появилась запись

- Connected successfully

, то всё OK. Если нет, разбираемся с драйверами и подключением. Для дополнительной проверки можно считать память программ микроконтроллера через меню Target -> Read back -> Entire chip. Должно отобразиться содержимое памяти. Если нет - опять же разбираемся с поключением.

Настройка Eclipse

Открываем меню Debug -> Debug Configurations.... Создаём новое подключение под GDB Segger J-Link Debugging. На вкладке Debugger прописываем Device name (ссылка на список поддерживаемых устройств там есть справа), например STM32F030F4. Выбираем подключение Connection и интерфейс Interface, если требуется. На вкладке Common ставим галочку на Debug в списке Display in favorites menu для упрощения перехода в режим отладки. Далее окно настроек можно закрыть и запустить отладку через меню Debug. Бинарник должен прошиться в память программ и начаться отладка, с остановкой в начале функции main.

Обновление проекта

Данная структура проекта позволяет обновить проект черех генератор кода STM32CubeMX без особых усилий, при соблюдении рекомендаций к написанию пользовательского кода в предназначенных для того участках. Запускаем STM32CubeMX. Загружаем проект STM32CubeMX (файл *.ioc, сохранённый в каталоге проекта при генерации кода). Меняем необходимые настройки, отключаем или подключаем модули. Потом запускаем генерацию кода и файла описания. Файлы перезаписываются поверх существующего проекта, сохраняя упомянутые выше участки пользовательского кода.

На этом всё.