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

en

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

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

В связи с некоторыми изменениями между рассмотренной ранее и текущей версией CubeMX, переделал инструкцию.{ .bg-info .text-white }

Если у Вас это не работает или найдёте ошибку, пишите в комментариях.{ .bg-warning .text-dark }

На видео приведён весь процесс установки и настройки. Операционная система Windows 10 Home.

Загрузка

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

Установка

Eclipse IDE for C/C++ Developers

Скачиваем установщик Eclipse и устанавливаем Eclipse IDE for C/C++ Developers.

Java Virtual Machine

Если установщик Eclipse не найдёт Java SE Runtime Environment подходящей версии, он предложит его скачать. Скачиваем и устанавливаем.

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

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

Если вылетела ошибка Handshake_failure, читаем статью GNU ARM Eclipse plug-ins: Received fatal alert: handshake_failure. Вкратце: повысили настройки безопасности у репозитория плагинов Eclipse, а в некоторых версиях JRE библиотеки содержат экспортные ограничения на функции шифрования. Вот их надо заменить на полные.

STM32CubeMX Eclipse plug in

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

STM32CubeF1

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

Далее можно скачать пакет из сети, выбрав галочку и нажав Install Now. Либо установить из скачанного вручную архива, нажав кнопку From Local... и выбрав скачанный ранее архив STM32CubeF1.ZIP.

J-Link

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

Настройка

Создание проекта в 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, создаём новый проект. В списке микроконтроллеров выбираем нужный (здесь STM32F103RET6 для примера). Настраиваем как нужно. Запускаем генерацию кода из меню. Указываем имя проекта как было в Eclipse выше. Указываем Project Location на каталог workspace, где лежит тот проект. Меняем Toolchain/IDE на SW4STM32. Снимаем галочку Generate Under Root. Запускаем. Исходные коды проекта будут созданысгенерированы поверх уже существующего проекта. Закрываем STM32CubeMX.

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

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

.include "../Drivers/CMSIS/Device/ST/STM32F1xx/Source/Templates/gcc/startup_stm32f103xe.s"

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

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

Далее, надо перенести настройки проекта из сгенерированного в существующий.

Открываем проект в Eclipse. Заходим в свойства проекта - C/C++ General - Path and Symbols. Добавляем там легко опознаваемые строки-маркеры в разделы Includes и Symbols.

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

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))" />
        ...

Ищем во втором файле ноды XML с соответствующими маркерами и заменяем их. Список примерно следующий:

__weak="__attribute__((weak))"
__packed="__attribute__((__packed__))"
USE_HAL_DRIVER
STM32F103RE
ARM_MATH_CM3

Последнего в XML файле нет, но без него библиотеки не соберутся.
Кавычек у __weak и __packed тоже нет. Их надо добавить в виде " :

__weak="__attribute__((weak))"

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 CDT. Ищем ранее добавленные маркеры. Копируем соответствующие ноды XML из первого файла во второй. Попутно заменяя относительные пути:

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

на

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

ARM family

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

Linker script

Копируем скрипт линкера из ./SW4STM32//STM32F103RETx_FLASH.ld в Scripts/STM32F103RETx_FLASH.ld.
Открываем свойства проекта в Eclipse, идём в C/C++ Build -> Settings -> Tool Settings -> Cross ARM C Linker -> General. Добавляем в список Scripts files (-T) путь к файлу скрипта.

Сборка.

Собираем проект. Для ускорения сборки можно включить параллельную работу в свойствах проекта 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 (ссылка на список поддерживаемых устройств там есть справа), например STM32F103RE. Выбираем подключение Connection и интерфейс Interface, если требуется. На вкладке Common ставим галочку на Debug в списке Display in favorites menu для упрощения перехода в режим отладки. Далее окно настроек можно закрыть и запустить отладку через меню Debug. Бинарник должен прошиться в память программ и начаться отладка, с остановкой в начале функции main.

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

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

На этом пока всё.