Конвертация в формат Eclipse STM32 проектов от ST и из CubeMX

Так получилось, что сейчас использую Eclipse. Да и с ARM и STM32 познакомился совсем недавно. В этот момент и выяснилось, что STMicroelectronics — бесплатный софт не любит. Поиск на сайте ST.com показал, что никаких примеров и проектов «от производителя» для бесплатных сред разработки, типа Eclipse, нет. Зато для Keil, IAR и TrueSTUDIO — примеров кода, проектов и всяких примочек — много. Самым близким к Eclipse является TrueSTUDIO, т.к. сделан на основе Eclipse. Решение напрашивалось само собой — использовать в Eclipse весь спектр проектов, разработанных STMicroelectronics под среду TrueSTUDIO. Но форматы проектов оказались разные, и конвертора TrueSTUDIO -> Eclipse тоже нет.

Долго копал интернет на предмет готового решения — его не было. Зато часто попадался вопрос — как это сделать. В процессе поиска нашел статью, на немецком, с решением проблемы. Всё работало. На радостях, аж перевод на русский сделал. Но при попытке портирования чуть более серьезного проекта — возникло такое количество ошибок и предупреждений, что их устранение граничило с непониманием происходящего.
При этом что-то внутри подсказывало, что решение должно быть. В итоге проблему — решил, и этим решением делюсь с Вами.

Предисловие
Особенностью проектов от ST является использование в дереве файлов самого проекта виртуальных папок и ссылок в этих папках на настоящие, реальные файлы. При попытках сделать это вручную естественно встал вопрос об источнике, где этот самый список хранится. И тут оказалось, что в примерах для TrueSTUDIO формат хранения данной информации совпадает с форматом оригинального Eclipse, на базе которого TrueSTUDIO и сделана. Однако экспорт-импорт данной информации средствами TrueSTUDIO и Eclipse мне осуществить не удалось (если кто знает — напишите в комментариях, добавлю), копирование данной информации в файл настроек проекта Eclipse и последующее открытие проекта в Eclipse тоже терпело фиаско. Но как то случайно это копирование было сделано средствами самого Eclipse и при открытом проекте, настройки которого я изменял. Бинго. Слева, в дереве проекта появились желаемые виртуальные папки и файлы в них. Как «допилить» остальное уже было известно и проект «заработал».

Для повторения написанного мною далее надо установить и настроить Eclipse так, как описано в предыдущей статье:
http://we.easyelectronics.ru/STM32/stm32cubemx-start-code-eclipse-bystryy-start-otladka-v-eclipse-cherez-st-link-discovery.html

После написания статьи сменил комп и сейчас у меня другие пути к рабочему каталогу Eclipse, по умолчанию. Кроме того разработчики GNU ARM Eclipse Plug-ins работают, допиливают свой продукт и выпустили, помимо обновления плагина, свою сборку Build Tools(make и т.д), сейчас пользуюсь ей. Настоятельно рекомендую посетить их страничку и ВСЮ прочитать, включая все вкладки в меню. Там есть и рекомендуемая настройка Eclipse и настройка отладки и ответы на большинство вопросов, относительно их плагина. Если плохо с английским (учим обязательно, что тогда Вы тут делаете?), то Google Chrome, кнопка перевод и читаем, читаем и читаем.

Что нам предлагает производитель

Для начала посмотрим, как «усроен» внутри пакет драйверов HAL, который успешно Вами распакован в удобное Вам место. Внутри видим следующее (здесь и далее пакет для STM32F1xx — STM32Cube_FW_F1_V1.0.0):



Интересующие нас папки:
«Drivers» — тут находятся драйвера HAL, BSP и CMSIS (v4.2)
«Middlewares» — тут STemWin, библиотеки USB, FatFs, FreeRTOS и LwIP — всё уже адаптировано для совместной работы, а мануалы как пользоваться выложены на сайте ST.
«Projects» — проекты — примеры от ST для выпускаемых им плат.
С остальными папками и так всё понятно.
Для примера я взял проект для STM32VL-Discovery «GPIO_IOToggle» — поморгать светодиодом на довольно распостраненой платке.

Начинаем

Папку «GPIO_IOToggle» проводником Windows (или не знаю что у Вас, всё должно работать и на других платформах) целиком копируем в рабочий каталог Eclipse. В эту папку (в «GPIO_IOToggle») — копируем папки «Drivers» и «Middlewares». Возможен вариант скопировать всю папку «STM32Cube_FW_F1_V1.0.0» в рабочий каталог и использовать в каждом проекте, но мне удобнее так — нет вероятности, что изменю какой — либо файл в одном проекте, он окажется из «общей библиотеки» и это повлияет на работу других проектов — потом можно долго искать баги. Если Вас смущает размер скопированных папок «Drivers» и «Middlewares»(они самые увесистые в пакете HAL) — впоследствии неиспользуемые библиотеки — просто удалите.
Далее в скопированной папке «GPIO_IOToggle» создаем папку «Eclipse», а в ней — «Eclipse_settings». В папке «Eclipse_settings» будут находиться настройки проекта, который создадим чуть позже в Eclipse.
Из папки «TrueSTUDIO» в папку «Eclipse» копируем файл «startup_stm32f100xb.s» и обязательно меняем последнюю букву на «S».
Из папки «TrueSTUDIO\STM32VL-Discovery» в папку «Eclipse\Eclipse_settings» копируем файл «STM32F100VB_FLASH.ld»

Теперь необходимо собрать в одном месте настройки из проекта, сделанного ST (или Вами при помощи Куба) для TrueSTUDIO.
Создаем в папке «Eclipse» текстовый файл, например с именем «Settings.txt» — потом будет удобнее копипастить, не закрывая окно настроек в Eclipse.
В Eclipse открываем файл «TrueSTUDIO\STM32VL-Discovery\.project», идем в конец файла и копируем всё, что расположено между тэгами
<linkedResources> и </linkedResources>

включая сами тэги. Это список файлов, используемых в проекте. Вставляем скопированное в предварительно открытый, в текстовом редакторе (не Eclipse) файл «Settings.txt», жмем сохранить в текстовом редакторе а ".project" в Eclipse — закрываем.

В Eclipse — открываем файл «TrueSTUDIO\STM32VL-Discovery\.cproject» и ищем в нем «Include path» и «Defined symbols». Копируем все записи типа "..\..\..\..\..\..\..\..\Drivers\CMSIS\Device\ST\STM32F1xx\Include" и «USE_HAL_DRIVER» в текстовый файл «Settings.txt» и сохраняем. В зависимости от портируемого Вами проекта этих записей может быть много или мало, располагаются в файле иногда как-то причудливо, но всегда «кучками». Легко отыскиваются поиском по волшебному слову «HAL».
Закрываем в Eclipse ".cproject".

Теперь необходимо подправить относительные пути к используемым в проекте файлам (в случае с проектом из Куба — пути будут уже правильные).
В записях «Include path» удаляем лишние"..\", сравнивая ссылку на файл и его реальное расположение.

Далее — просматриваем все записи, находящиеся между тэгами
<linkedResources> и </linkedResources>

Тут " «вверх» по «дереву папок» " обозначается записями типа «PARENT-7-PROJECT_LOC». Изменяем число посередине таким образом, чтоб ссылка соответствовала действительному расположению файлов в Вашем проекте, отталкиваясь от «определения» в предыдущем абзаце. В данном случае — поменял все 7 на 2.

Не забываем, что у нас переименованный файл «startup_stm32f100xb.S», поэтому между тэгами так же меняем расширение с «s» на «S», при обоих упоминаниях файла. Сохраняемся.

После проделанных действий внутри файла «Settings.txt» должен получиться текст, аналогичный этому:

<linkedResources>
		<link>
			<name/>
			<type/>
			<locationURI/>
		</link>
	<link>
			<name>Doc</name>
			<type>2</type>
			<locationURI>virtual:/virtual</locationURI>
		</link><link>
			<name>Drivers/BSP/STM32VL-Discovery</name>
			<type>2</type>
			<locationURI>virtual:/virtual</locationURI>
		</link><link>
			<name>Drivers/BSP</name>
			<type>2</type>
			<locationURI>virtual:/virtual</locationURI>
		</link><link>
			<name>Drivers/CMSIS</name>
			<type>2</type>
			<locationURI>virtual:/virtual</locationURI>
		</link><link>
			<name>Drivers/STM32F1xx_HAL_Driver</name>
			<type>2</type>
			<locationURI>virtual:/virtual</locationURI>
		</link><link>
			<name>Drivers</name>
			<type>2</type>
			<locationURI>virtual:/virtual</locationURI>
		</link><link>
			<name>Example/TrueSTUDIO</name>
			<type>2</type>
			<locationURI>virtual:/virtual</locationURI>
		</link><link>
			<name>Example/User</name>
			<type>2</type>
			<locationURI>virtual:/virtual</locationURI>
		</link><link>
			<name>Example</name>
			<type>2</type>
			<locationURI>virtual:/virtual</locationURI>
		</link><link>
			<name>Doc/readme.txt</name>
			<type>1</type>
			<locationURI>PARENT-2-PROJECT_LOC/readme.txt</locationURI>
		</link><link>
			<name>Drivers/BSP/STM32VL-Discovery/stm32vl_discovery.c</name>
			<type>1</type>
			<locationURI>PARENT-2-PROJECT_LOC/Drivers/BSP/STM32VL-Discovery/stm32vl_discovery.c</locationURI>
		</link><link>
			<name>Drivers/CMSIS/system_stm32f1xx.c</name>
			<type>1</type>
			<locationURI>PARENT-2-PROJECT_LOC/Src/system_stm32f1xx.c</locationURI>
		</link><link>
			<name>Drivers/STM32F1xx_HAL_Driver/stm32f1xx_hal.c</name>
			<type>1</type>
			<locationURI>PARENT-2-PROJECT_LOC/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c</locationURI>
		</link><link>
			<name>Drivers/STM32F1xx_HAL_Driver/stm32f1xx_hal_cortex.c</name>
			<type>1</type>
			<locationURI>PARENT-2-PROJECT_LOC/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c</locationURI>
		</link><link>
			<name>Drivers/STM32F1xx_HAL_Driver/stm32f1xx_hal_gpio.c</name>
			<type>1</type>
			<locationURI>PARENT-2-PROJECT_LOC/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c</locationURI>
		</link><link>
			<name>Drivers/STM32F1xx_HAL_Driver/stm32f1xx_hal_rcc.c</name>
			<type>1</type>
			<locationURI>PARENT-2-PROJECT_LOC/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c</locationURI>
		</link><link>
			<name>Drivers/STM32F1xx_HAL_Driver/stm32f1xx_hal_rcc_ex.c</name>
			<type>1</type>
			<locationURI>PARENT-2-PROJECT_LOC/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c</locationURI>
		</link><link>
			<name>Example/TrueSTUDIO/startup_stm32f100xb.S</name>
			<type>1</type>
			<locationURI>PARENT-1-PROJECT_LOC/startup_stm32f100xb.S</locationURI>
		</link><link>
			<name>Example/User/main.c</name>
			<type>1</type>
			<locationURI>PARENT-2-PROJECT_LOC/Src/main.c</locationURI>
		</link><link>
			<name>Example/User/stm32f1xx_it.c</name>
			<type>1</type>
			<locationURI>PARENT-2-PROJECT_LOC/Src/stm32f1xx_it.c</locationURI>
		</link></linkedResources>

"..\..\..\Inc"
"..\..\..\Drivers\CMSIS\Device\ST\STM32F1xx\Include"
"..\..\..\Drivers\STM32F1xx_HAL_Driver\Inc"
"..\..\..\Drivers\BSP\STM32VL-Discovery"
"..\..\..\Drivers\CMSIS\Include"

"USE_HAL_DRIVER"
"STM32F100xB"
"USE_STM32VL_DISCO"


На этом нудная часть практически закончилась, у нас есть всё, что бы собрать в Eclipce нормальный, рабочий проект.

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

Нажимаем кнопку «New» на панели, и выбираем создание проекта «C Project». В открывшемся окне — обзываем наш проект «GPIO_IOToggle», снимаем галочку с «Use default location», указываем путь к папке с настройками проекта «GPIO_IOToggle\Eclipse\Eclipse_settings». Выбираем тип проекта «Empry Project» и щелкаем кнопку далее.



На странице «Select Configurations» ничего не трогаем, опять далее. На странице «Cross CNU ARM Toolchain» верхняя строчка должна совпадать с моей, а нижняя — указывать путь, куда вы этот самый Toolchain установили.



Жмем финиш. Проект создан. Теперь самое весёлое.

Настройка проекта

Добавляем в проект файлы.
Через меню «File» в Eclipse открываем файл «GPIO_IOToggle\Eclipse\Eclipse_settings\.project». Из файла «Settings.txt» копируем всё от тэга
<linkedResources> и </linkedResources>

включая сами тэги. Вставляем скопированное в конец файла, перед последним тэгом
</projectDescription>

(надо предварительно перед последним тегом сделать дополнительную пустую строку, чтоб не нарушить структуру файла — ставим курсор на строчку после тэга
"</natures>"

и нажимаем Ввод на клавиатуре).
Должно получиться похоже на то, что копировали из файла ".project" в начале. Проверяем, что открыт проект, настройки которого мы изменяем, и нажимаем кнопку сохранить (Save) на панели. Проверяем, что в обозревателе файлов проекта появились добавленные папки, и все файлы на месте.

Если что-то не правильно — исправляем ошибки в записях типа «PARENT-2-PROJECT_LOC» или ищем ошибки при копировании файлов в проект.
Закрываем файл ".project".

Настраиваем свойства проекта

Открываем свойства поекта. Тут все настройки, которые надо изменить — на одной странице. В левом окне — выбираем «C/C++ Build -> Settings», на правой стороне окна — вкладку «Tools Settings». Вверху выбираем конфигурацию — "[All configurations]".

«Target Processor»
В данном проекте — используется STM32F100RB, поэтому ничего не изменяем — тут всё по умолчанию, настроено под Cortex-M3. При других ядрах — необходима правильная настройка данного окна. Правильные настройки можно легко найти, если при помощи визарда выбрать создание проекта под необходимое семейство, а потом в Том проекте взять эти настройки. После изменения настроек жмем «Apply».



«Warnings»
Выбираем «Enable all common warnings»



«Cross ARM GNU Compiler»
«Pereprocessor»
В правой верней части окна через кнопку с зеленым плюсиком добавляем по очереди все дефайны из файла «Settings.txt» типа «USE_HAL_DRIVER», только без кавычек. После добавления всех дефайнов — жмем «Apply».



«Includes»
В правой верней части окна через кнопку с зеленым плюсиком добавляем по очереди все пути из файла «Settings.txt» типа "..\..\..\Drivers\STM32F1xx_HAL_Driver\Inc", с кавычками. После добавления всех путей — жмем «Apply».



«Cross ARM C Linker»
«General»
Через кнопку с зеленым плюсиком открываем окно добавления файла линкера, а в открывшемся окне — через кнопку «Workspace...» указываем расположение файла «STM32F100VB_FLASH.ld» в папке «GPIO_IOToggle». Жмем «Apply».



«Miscellaneous»
Отмечаем галочкой «Use newlib-nano». Жмем «Apply».



Жмем кнопку «OK». Проверяем, что в папке «Includes» отображаются все папки, добавленные в свойства проекта. Если что-то не так — исправляем пути добавлением-удалением "..\" и проверяем наличие файлов в папке проекта.



Нажимаем на кнопку с молотком на панели и проверяем сборку проекта в режиме отладки и релиза, должен собраться без ванингов и ошибок. Внизу, на вкладке «Console» проверяем информацию о результате проделанной работы.




На самом деле подобное «ручное» портирование после нескольких повторений занимает 5-7 минут времени. Буду рад любым предложениям по улучшению и упрощению данного процесса.
  • +1
  • 05 февраля 2015, 23:39
  • avtoneru

Комментарии (8)

RSS свернуть / развернуть
Не проще ли через makefile project работать — один раз надо шаблон проекта сделать и потом просто его копировать в отдельную папку. А то что-то многовато манипуляций у вас.
0
В данном случае не проще, т.к. задача запускать разные проекты под разные ядра, вникать как и что написано.
Манипуляций — на самом деле — многовато, но на самом деле — ничего сложного.
Для нормальной работы с makefile надо усвоить ещё определенный объем информации, пока просто лень. Хотя если припрет проектом с makefile — никуда не денешься, влюбишься и женишься…
0
не проще, т.к. задача запускать разные проекты под разные ядра
Разве ядра так сильно отличаются? Вроде бы нет. Будет что-то такое в makefile:

ifeq ($(CHIP),STM32F4XX)
	MCU			= cortex-m4
	FPU			= -mfpu=fpv4-sp-d16 -mfloat-abi=hard
else
	MCU			= cortex-m3
endif

Для нормальной работы с makefile надо усвоить ещё определенный объем информации
Всё знать необязательно — мне оказалось взять готовый проект и его использовать. В общем всё устраивало.
0
Всё знать необязательно — мне оказалось взять готовый проект и его использовать. В общем всё устраивало.

видимо в этом и причина, мне хочется уметь создавать проект с нуля.
Недавно пробовал почитать доки от GNU на тему makefile… там столько не легкоусвояемой информации было, просто жуть. Но круто. Это следует применять когда делается проект под несколько разных сред, и необходимо гибко им управлять. Мне пока не надо.
0
Оформление поста оставляет желать лучшего. Особенно раздел про настройку проекта. Используй хоть заголовки, чтоль.

Алсо, все приведенные названия тегов пожрал парсер. Исправь. Чтобы парсер не жрал тег — нужно заменить < на "& lt;" (без кавычек и пробела), а >, соответственно, "& gt;".

В записях «Include path» удаляем лишние"..\". Эта загадочная запись, в своё время, меня ставила в тупик.
Ы? Это же стандартное обозначение родительского каталога в DOS, Windows и *nix. Странно не знать его.
0
  • avatar
  • Vga
  • 06 февраля 2015, 12:50
хорошо, переработаю — сам понимаю, что что-то не так. Сам алгоритм действий отдает кривизной, но работает. Может кто-то просто лучше знает сам Eclipse и это же делается как — то проще.
0
Переоформил. Как записывать стрелки в тэгах — так и не победил. Поместил как код. Спасибо за замечания, не думал что может форматирование «съезжать»
0
Неужели зря писал?
Напишите, работает у Вас или нет, пожалуйста.
Подозреваю, что должен быть способ сделать тоже самое, только проще.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.