STM32CubeMX start code -> Eclipse быстрый старт -> отладка в Eclipse через ST-Link Discovery
Наверное в инете есть сотни статей с подобной темой. Но, так как тема относится к опенсорсу, — никто не гарантирует результат. Результат-то как правило бывает, но обычно, вначале, лишь частичный. Что-то, как правило, не работает нормально. Глючит. Пугает кучей ошибок и варнингов. Основная тема, лейтмотив опенсорса, — поиск ответа на вопрос «почему не так работает?». В этот момент начинаешь понимать, почему за готовую к работе, из коробки, IDE — просят денюшку, и немаленькую.
Когда начинал знакомится с микроконтроллерами, ограничение кода в 32 кБ казались такими недосягаемыми, а в современное время одно подключение какой-либо библиотеки может съесть значительную часть лимита кода, а ещё хочется и ВЭБ интерфейс к соей домашней поделке приделать, а недавно решил «пощупать» библиотеку libMAD, так код вообще сразу выскочил за 120 кБ…
Основная задача — допилить Eclipse до такого состояния, когда внутри будет весь цикл, от написания кода до отладки. Для генерации начального кода очень хотелось использовать STM32CubeMX, так как кроме свежих библиотек HAL имеется поддержка современной версии CMSIS, уже интегрированная FreeRTOS (в составе куба идет порт FreeRTOS, сделанный по правилам нового CMSIS v3.20), и много других «вкусняшек», а используемая среда Eclipse, не накладывает ограничения на размер кода, да и просто имхо удобней.
У меня получилось. Конечно есть в отладчике Keil’a фишки, которые больше нигде не повторяются. Да и в используемом отладчике OpenOCD реализованы не все функции, которыми может похвастаться Eclipse, но это плата за простоту установки и настройки. Полученным результатом оказался доволен. Во время поиска приемлемого варианта установки, подбора плагинов и других компонентов возникла необходимость сохранить результаты проделанной работы. В основном — что бы не забыть.
Условно всю работу можно разбить на 3 части:
- Установка и настройка Eclipse.
- Генерация начального кода проекта в STM32CubeMX и адаптация проекта для использования в Eclipse.
- Настройка отладки и отладка созданного проекта в Eclipse.
Если Вам интересно — читаем дальше.
Хочется сказать особое спасибо автору следующего блога: klaus4.blogspot.ru/2014/05/stm32f4-discovery-mit-opensource.html, это послужило толчком, «лед тронулся». Логика и последовательность действий взяты именно там. Однако прочтенное не совсем совпадало с моими взглядами, поэтому написанное мной, отчасти, может считаться вольным переводом первоисточника.
Теперь по поводу самой инструкции. Eclipse — плод коллективного труда. Сама программа написана на Java и имеет внутри много-много других компонентов, чаще всего оформленных как плагины. Система чувствительна к версиям устанавливаемых Вами плагинов. Самое правильное — перед установкой какого — либо плагина найти в интернете страничку автора(ов) плагина и внимательно прочитать. Как правило там будет и инструкция по использованию, установке и указания на проверенные совместимые версии Eclipse. Стараемся не ставить лишних плагинов — особенно тех, что ругаются на непроверенную совместимость — можно получить эффект глюка и неправильной работы того, что без проблем раньше хорошо работало, причем без явного проявления причинно-следственной связи.
Тут небольшое лирическое отступление. Часть используемых программ будет «с возрастом», и написанны довольно давно. Поэтому для стабильной работы рекомендуется устанавливать весь софт с соблюдением правила — имя папки и файла длинной не более 8-ми символов. Рекомендуемые мною пути установки не являются парадигмой и служат лишь для удобства написания данной статьи.
- Java JDK
Скачиваем последнюю доступную версию Java JDK, причем если у Вас система 64 бита — то ставим именно х64. Далее подразумевается, что если есть доступная версия x64, то используем именно её:
www.oracle.com/technetwork/java/javase/downloads/index.html
у меня: «jdk-8u25-windows-x64.exe»
Удаляем все другие версии Java(возможно и не надо), установленные ранее и устанавливаем в пути по умолчанию.
- Eclipse
Скачиваем последнюю стабильную версию Eclipse IDE for C/C++ Developers:
www.eclipse.org/downloads/
у меня: «eclipse-cpp-luna-SR1-win32-x86_64.zip»
Eclipse поставляется в виде архива и устанавливается распаковкой в рабочий каталог.
Распаковываем в папку «C:\eclipse», причем исполняемый файл должен быть в этой папке. Отправляем ярлык для «eclipse.exe» на рабочий стол, не запускаем!
Проверяем настройку языковых параметров, у Вас должен стоять английский по умолчанию. Т.е. при запуске программ язык ввода должен быть обязательно английский. Если стоит язык, отличный от английского и вы В ПЕРВЫЙ раз запускаете Eclipse, то в дальнейшем будете в консоли любоваться на кракозябрики и искать вариант борьбы с кодировками…
Идем в панель управления Windows и устанавливаем первым языком английский, перезагружаем компьютер. Если Вы уже запускали Eclipse с языком ввода по умолчанию, отличным от английского — удаляем всё из папок «C:\eclipse» и папки рабочего каталога «C:\stm32prg» и продолжаем.
Запускаем Eclipse. Вначале программа спросит расположение рабочего каталога — вводим «C:\stm32prg», ставим галочку запомнить и подтверждаем свой выбор:
видим запущенный Eclipse:
и пока закрываем — необходимо установить остальные компоненты.
- GNU Tools for ARM Embedded Processor
Далее посещаем страничку launchpad.net/gcc-arm-embedded и скачиваем установщик (.exe) gcc-arm-none-eabi последней версии. Этот комплект программ будет из текста на Си делать исполняемый файл для микроконтроллера.
Мой выбор именно этого пакета: — он поддерживается сотрудниками ARM. Остальные доступные компиляторы в большинстве случаев сделаны на основе исходников этого. Почитайте на страничке.
у меня: «gcc-arm-none-eabi-4_8-2014q3-20140805-win32.exe»
Создаем на диске«C:» папку с именем «ToolsARM», в ней подпапку «gcc_arm» и устанавливаем в папку «C:\ToolsARM\gcc_arm», папка «bin» должна оказаться тут. Важное замечание: на последней странице установщика снимаем все галочки, чтоб путь нигде в системе не прописывался.
Данный пакет не содержит утилит типа «Make.exe», их придется поставить отдельно, устанавливать их будем в папку «C:\ToolsARM\».
Такой выбор, в отличие от первоисточника в начале статьи, основан на опыте первоначального использования Eclipse. Мне пришлось несколько раз его переустанавливать. При создании подпапок в папке Eclipse их можно случайно удалить, что не есть гуд.
- Make и CoreUtils for Windows
На странице gnuwin32.sourceforge.net/packages/make.htm скачиваем Make for Windows, по ссылке, рядом с которой указано «• Complete package, except sources».
На странице gnuwin32.sourceforge.net/packages/coreutils.htm скачиваем CoreUtils for Windows по ссылке, рядом с которой указано «• Complete package, except sources».
В моем случае «make-3.81.exe» и «coreutils-5.3.0.exe».
В папке «C:\ToolsARM» создаем подпапку «GnuWin32» и устанавливаем оба комплекта программ в папку «C:\ToolsARM\GnuWin32» (можно при установке утилит просто указать папку «C:\ToolsARM», а «GnuWin32» — родная папка утилит — создастся при установке).
www.st.com/web/en/catalog/tools/PF258168 скачиваем внизу страницы через кнопку «Download», распаковываем скачанный архив и устанавливаем в пути установки, предложенные программой по умолчанию. В случае нерабочей ссылки ищем в инете «STM32 ST-LINK utility» на сайте «www.st.com/», ссылка может измениться при изменении версии выложенной версии утилиты.
В моем случае «STM32 ST-LINK Utility_v3.5.exe».
При помощи этой утилиты можно читать-записывать STM-овские микроконтроллеры и много чего ещё. Эта утилита, кроме всего прочего, устанавливает драйвер для ST-link на плате Discovery. Понадобится при отладке.
- STM32CubeMX
www.st.com/web/en/catalog/tools/PF259242 скачиваем внизу страницы через кнопку «Download», распаковываем скачанный архив и устанавливаем в пути установки, предложенные программой по умолчанию. Выше кнопки «Download» есть ссылка на плагин для Eclipse, но этот плагин у меня почему-то не заработал…
В моем случае «SetupSTM32CubeMX-4.5.0.exe».
Для меня Куб — самая прикольная программа в пакете…
Запускаем STM32CubeMX.exe(в дальнейшем — просто Куб) и через меню «Help->Install New Libraries» запускаем обновление библиотек. Выбираем необходимые библиотеки и жмем «Install Now». У меня сейчас имеется только Discovery c STM32F051R8, поэтому я выбрал библиотеки для STM32F0 и STM32F4, опишу оба варианта. (судя по тому, что в Кубе нет библиотек HAL для семейства STM32F1 думается, что ST сворачивает поддержку данной линейки,… логичная замена, по-моему, — это линейка STM32F2… а где Discovery с STM32F2 на борту?). Пока библиотеки обновляются продолжаем. После обновления — Куб пока закрываем.
- OpenOCD
OpenOCD — программное обеспечение для отладки и прошивки микроконтроллеров с ядром ARM, в том числе и STM32.
На сайте «openocd.sourceforge.net/» ищем ссылку на последнюю версию OpenOCD, скомпилированную под Windows. В моем случае — на странице «www.freddiechopin.info/en/download/category/4-openocd» ссылка на «OpenOCD 0.8.0», скачался архив «openocd-0.8.0.7z».
Скачанный 7z архив распаковываем и копируем папу «openocd-0.8.0»(в которой папка «bin») в «C:\ToolsARM». После копирования — переименовываем папку «openocd-0.8.0» в «openocd», сам исполняемый файл в папке «bin» — тоже переименовываем в «openocd.exe».
В результате в папке «C:\ToolsARM» должна сформироваться следующая структура папок:
- Установка плагинов и настройка Eclipse
Запускаем Eclipse и устанавливаем несколько плагинов, необходимых для работы с микроконтроллерами.
- GNU ARM Eclipse Plug-ins
Это «центровой» плагин, позволяющий среде Eclipse работать с микроконтроллерами ARM.
Страничка плагина gnuarmeclipse.livius.net/blog/ — там можно почитать про использование данного плагина, и последние новости разработчиков. Например там написано, что на Eclipse luna первых релизов данный плагин может работать нестабильно…
Адрес для установки плагина: «gnuarmeclipse.sourceforge.net/updates»
Плагины устанавливаются через меню «Help ->Install new software». В открывшемся окне в верхнюю строчку или вводим (копипастим) адрес сервера обновлений, или через кнопку «Add» указываем на папку с распакованным плагином, или указываем на архив с плагином.
В нашем случае — в верхнюю строчку вводим адрес плагина и жмем клавишу «Enter» на клавиатуре компьютера для обновления информации из источника. Видим информацию о списке устанавливаемых компонентов:
Далее кнопка «Next» и видим список тех компонентов, что были подобраны к установке по взаимным зависимостям, то есть когда один компонент требует наличия другого из пакета:
Опять «Next», видим окно с лицензионным соглашением, выбираем принять и жмем «Finish»
(без картинки) и наблюдаем за полоской установки плагина. В случае, если данный плагин может вызвать нестабильную работу системы — выскакивает окно:
Соглашаемся, что мы в курсе возможных предстоящих проблем — «OK», после этого выскакивает окно с предложением перезапустить Eclipse — жмем «OK», Eclipse перезапускается. Всё, плагин установлен.
Данный плагин позволяет добавить в отладчик просмотр регистров периферии микроконтроллера. Очень полезная штука, приближающая отладчик Eclipse к профессиональным IDE.
Устанавливаем аналогично предыдущему плагину.
Процедура установки на этом может считаться законченной. Дальше предстоит настроить Eclipse для использования GNU_ARMEclipse плагина. Мы не будем использовать возможность данного плагина генерировать начальный код, а вот возможность отладки через OpenOCD — пригодится полностью.
- Настройка Eclipse
В меню выбираем Windows ->Preferences, в открывшемся окне настроек C/C++ ->Build ->Environment. При помощи кнопки «Add» добавляем переменную «PATH», имеющую значение «C:\ToolsARM\GnuWin32\bin» — в этой папке лежат утилиты «make.exe», «rm.exe» и «echoexe», мы указываем где их искать. В дальнейшем придется указать пути и до остальных утилит в папке «C:\ToolsARM», это будет ниже.
Начальная настройка закончена, Eclipse готов к работе. Только если сейчас открыть проект, созданный ранее, как сделал я на этом шаге — он не соберется с ошибкой, что не может найти компилятор C++. Если открываете проект, созданный в другой системе (у меня проект был сделан на другом компьютере), то следует в настройках проекта «C/C++_Build ->Setting» вкладка «Toolchains» в переменную «Global path» записать «C:\ToolsARM\gcc-arm\bin».
- Начальный код в STM32CubeMX для Eclipse
К этому времени у Вас уже должны обновиться библиотеки под используемый контроллер (в Кубе). В главном окне Куба выбираем «New Project», щелкаем по вкладке «Board Selector», в левом списке выбираем «Discovery», в правой таблице выбираем ту плату, для которой будем генерировать начальный код. У меня сейчас под рукой — STM32F0DISCOVERY, поэтому картинки под неё, Вы выбираете свою плату, принцип будет один и тот же:
Нажимаем «OK» и видим окно конфигурации ввода-вывода по «ножкам» микроконтроллера:
В этом окне ничего не трогаем, щелкаем по вкладке «Clock Configuration» и проверяем настройку — у меня по умолчанию она не была дефолтной, ставим как должно быть:
В меню выбираем «Project -> Settings . », из списка «Toolchain / IDE» выбираем «TrueSTUDIO», в верхнее окно вводим название проекта (у меня — «DiscoF0»), через кнопку «Browse» указываем на папку рабочего каталога Eclipse — «C:\stm32prg»:
Проверяем, чтоб на второй закладке всё было настроено по умолчанию:
Подтверждаем, что всё верно — «OK».
В меню выбираем «Project ->Generate Code», ждем окончания генерации кода и в окне:
Выбираем «Close», закрываем сам Куб — он своё дело сделал.
В проводнике Windows открываем папку рабочего каталога Eclipse и, среди прочих, видим папку с тем именем проекта, что задавали в настройках Куба (у меня — «DiscoF0»). Открываем её, и в этой папке (в «DiscoF0») создаем папку «System». Далее — из папки «DiscoF0\Projects\TrueSTUDIO\DiscoF0 Configuration» копируем в папку «System» файлы: линкера «STM32F051R8_FLASH.ld» и «.cproject». На других платах — будет файл с наименованием Вашего контроллера и расширением «.ld». Из второго файла — возьмем настройки путей и define. После этого папку «Projects» можно удалить.
Аналогично удалил в папке «DiscoF0» созданные Кубом файлы «.mxproject», «DiscoF0.ioc». Будете Вы их удалять или нет — решать Вам.
В папке «DiscoF0\Drivers\CMSIS\Device\ST\STM32F0xx\Include» удаляем все «.h» файлы, не имеющие отношение к микроконтроллеру на Вашей плате:
В папке «DiscoF0\Drivers\CMSIS\Device\ST\STM32F0xx\Source\Templates\gcc» меняем расширение у файла для Вашего микроконтроллера с «.s» на «.asm», так как используемый нами пакет утилит не понимает расширение «.s»:
Подготовка закончена, теперь создаем проект в Eclipse.
- Создание проекта в Eclipse
В основном окне Eclipse в меню выбираем «File ->New ->C Project» в открывшемся окне в вернее окно вводим имя созданного в Кубе проекта, остальное должно быть по умолчанию. Обращаем внимание на желтый треугольник, так и должно быть, если его нет — неправильно указан рабочий каталог или имя проекта:
Жмем «Next», на странице «Select Configurations» — ничего не трогаем, жмем опять «Next».
На странице «Gross GNU ARM Toolchain» в окне «Toolchain path» указываем на «C:\ToolsARM\gcc-arm\bin» и жмем «Finish»:
Между этими окнами при первом запуске создания проекта будет ещё одно окно с опциями (ключами) — его не трогаем, тоже жмем «Next»(а может это будет «Finish»), при создании проекта второй раз — это окно не появляется.
- Настройка проекта в Eclipse
Теперь предстоит настроить пути к файлам и define, специфичные для нашего проекта, используемых библиотек и микроконтроллера. Можно подсмотреть эти настройки в аналогичном проекте, только созданном для IDE, в котором Вы можете их увидеть. Я смотрел их бесплатной версией Keil.
А можно — поискать поиском в файле «.cproject», что сохранили в «system». Ключевые слова «definedSymbols» и «includePath». Рядом будут необходимые данные, только из путей убираем точки и косые черточки — у нас настройки идут от корня папки.
Для моей STM32F0DISCOVERY пути и define будут следующие:
Name=«USE_HAL_DRIVER» без параметров
Name= «STM32F051x8» без параметров
$
$
$
$
Name=«USE_HAL_DRIVER» без параметров
Name= «STM32F407xx» без параметров
$
$
$
$
Запускаем Eclipse, выбираем перспективу «C/C++»:
Заходим в свойства созданного проекта — щелчок правой кнопкой мыши на папке проекта и пункт выпадающего меню «Properties». В левом списке выбираем«C/C++ General -> Path and Symbols», на вкладке «Includes» нажимаем кнопку «Add» и добавляем последовательно все пути, необходимые для сборки проекта. При добавлении обязательно отмечаем галочки «Добавить во все конфигурации» и «Добавить для всех языков»:
Должно получиться так:
Переходим на вкладку «Symbols» и аналогичным образом добавляем define:
После этого идем в «C/C++ Build ->Settings» в верхнем меню выбираем «для всех конфигураций», и настраиваем параметры для целевого микроконтроллера:
а для STM32F4DISCOVERY:
Щелкаем по вкладке «General» линкера и нажимаем на кнопку папки с плюсом, в открывшемся окне — кнопку «Workspace» и добавляем ссылку на файл линкера в папке «system»:
Нажимаем на кнопки «Apply» и «OK».
В дереве проекта открываем файл «main.c» и нажимаем на иконку с молоточком. Проект должен без ошибок собраться как в режиме «Debug» так и в режиме «Release». У меня, например, выдало ошибку на двойное объявление функций в файлах «stm32f0xx_hal_msp_template.c» и «stm32f0xx_hal_msp.c». Я открыл свойства файла «stm32f0xx_hal_msp_template.c» и поставил галочку вот тут:
тем самым исключив файл из сборки проекта, и пришлось удалить папку «DSP_Lib» — ругалось на что-то внутри, не успел разобраться, а использовать DSP библиотеку пока не собирался.
Касперский почему-то иногда начал блокировать нормальную работу «make.exe» и в окне консоли было непонятно что со ссылкой, что ждет ответа от make .
В этом месте у Вас должен получиться проект — заготовка. Именно то, что выдал Куб. Ни ошибок ни варнингов быть не должно, а в консоль должна выдать параметры распределения памяти в микроконтроллере:
Через меню проекта закрываем его, идем проводником Windows в рабочий каталог Eclipse и архивируем результат своей работы. У нас получился проект — заготовка и дальше с ним можно делать что угодно — например — поморгать светодиодом и посмотреть на это в отладчике.
- Добавляем свой код
Теперь надо по традиции сделать микроконтроллерный «Hello World», поморгать светодиодом. Делать это будем через библиотеку HAL таким образом, что бы написанный код подошел к любому из двух описываемых в статье микроконтроллеров.
В файле «main.c» в начале файла, добавляем код, что бы получилось как ниже:
Бесконечный цикл в функции main изменяем следующим образом:
Нажимаем на кнопку с молоточком, и если нет ошибок — смотрим как работает в отладчике.
- Настройка отладки
Первым делом настроим плагин EmbSys Register Vievev.
Открываем меню «Window ->Preferencec» далее «C/C ++ ->Debug -> EmbSys Register Vievev» и согласно рисунка настраиваем под свою плату, у меня:
Вы — настраиваете под свой микроконтроллер и плату, потом — «OK».
Открываем меню «Window -> Show View -> Debug» — открываем перспективу отладки. Щелкаем по нижней части окна, перебираем вкладки рядом с «Console», можно и её щелкнуть — так указывается место, куда вставим окно плагина. Открываем меню «Window -> Show View ->Other» и далее «Debug ->EmbSys Register» жмем кнопку «OK» — и окно с регистрами периферии вставляется куда указали. У Вас может быть другое место — кому как нравится.
Теперь предстоит настроить плагин OpenOCD для корректной работы отладки. Для представления, как это правильно делается в «оригинале», заглядываем к разработчикам:
gnuarmeclipse.livius.net/blog/openocd-debugging/, откуда узнаем что первым делом надо переименовать файл в папке установки «C:\ToolsARM\openocd\bin» так, чтоб исполняемый файл имел имя «openocd.exe» — переименовываем.
Открываем меню «Window ->Preferencec» далее «Run/Dedug ->String Substitution» и изменяем настройку переменных согласно рисунку:
Переключаемся на перспективу «C/C++» и открываем файл «main.c» того проекта, для которого будем настраивать отладку — обязательно надо иметь фокус на необходимом проекте.
Открываем меню «Run ->Debug Configurations», выбираем «GDB OpenOCD Debugging» и через правую кнопку мыши выбираем «New»:
Проверяем соответствие рисунку и щелкаем следующую вкладку:
Если надо — корректируем путь к исполняемому файлу «openocd» и в нижнем окне прописываем имя скрипта к своей плате, имя скрипта находим в папке «C:\ToolsARM\openocd\scripts\board».
Проверяем последнюю вкладку:
Тут необходимо переключить, где отмечено и выбрать папку проекта. После этого нажимаем кнопку «Apply».
Подключаем плату к компьютеру и нажимаем кнопку «Debug». Если проблем нет — то увидим моргание светодиода отладчика на плате и кнопки для шагов по программе в верхней части окна перспективы Debug:
В настройках отладчика по умолчанию задано несколько точек остановки, поэтому несколько раз нажимаем на кнопку «плей» и видим моргающий светодиод на плате.
Жмем красный стоп. Пока всё в порядке, если кнопок не увидели — то следуем по цепочке — обновляем драйвера -> проверяем настройки OpenOCD. Именно по этой инструкции без проблем запустилась отладка в Win 7 x86, Win 7 x64, и Win 8.1 x64.