Здесь описываю настройку среды разработки для микроконтроллеров 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
- Java Virtual Machine
- GCC ARM Embedded Windows Installer
- How to install the Windows Build Tools?
- The GNU ARM Eclipse plug-ins
- How to install the GNU ARM Eclipse plug-ins? (скачивается из самого Eclipse)
- STM32CubeMX STM32Cube initialization code generator
- Jlink - Software and documentation pack for Windows
Установка
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/
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/
Открываем свойства проекта в 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, сохранённый в каталоге проекта при генерации кода). Меняем необходимые настройки, отключаем или подключаем модули. Потом запускаем генерацию кода и файла описания. Файлы перезаписываются поверх существующего проекта, сохраняя упомянутые выше участки пользовательского кода.
На этом пока всё.