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