Настройка Ide Clion И Cmake Для Работы С Stm32 И C++

Перед примером моей установки немного лирики.

Я давно хотел попробовать свои силы в микроконтроллерах, точнее, у меня были идеи с их использованием, которые мне очень хотелось реализовать.

Сначала я начал с PIC32 — контроллеров пожарной безопасности.

Так получилось, что я сначала закоротил их порты и завысил питание - они были неубиваемые (не совсем, конечно, один раз порт действительно сгорел, но сам контроллер продолжал работать).

IDE MplabX неплохая, меня привлек графический блок с отображением занятой RAM/Flash на выбранном МК - удобно, но сам NetBeans как IDE жестковат, ну не удобно ни разу после Idea. Но проблема была не в этом — как выяснилось позже, ПИК трудно достать, их мало кто носит, а если и носят, то по сравнительно высокой цене.

Дальше я решил покопаться в STM32 — они есть в большом количестве, за базовую периферию многого не просят, но главное — доступность.

(Но генератор кода у STM хуже, чем у Microchip - весь файл загажен комментариями и функциями, это, конечно, очень разочаровало.

У Microchip все сгенерированные функции в отдельных файлах и main.c почти чистый - прелесть).

(UPD: признаю, что был не прав, спасибо гольф2109 , он предложил избавиться от перегруженности комментариями и функциями файла main.c, просто включив в настройках опцию выносить сгенерированный код в отдельные файлы, но я до сих пор в недоумении, почему этого нет настройка по умолчанию, это кажется логичным) Теперь об IDE для STM32. Попробовал хваленый Кейл - он конечно лучше блокнота, но жутко неудобен (ни нормальных подсказок, ни нормального форматирования, после Идеи вообще не то пальто, тем более я так и не понял как создавать пакеты, зачем можно а не просто указать в окошке создать пакет и продолжить - хочется ругаться).

Потом попробовал CooCox - интерфейс намного лучше и приятнее, форматирование хорошо настраивается (очень порадовала настройка передачи параметров в методах, да и другие настройки очень пригодились), но опять же не хватает многих вкусностей от Idea и снова возникли проблемы с организацией пакетов.

Clion - это почти та же идея, только для C/C++ и мне сразу захотелось ее установить, но как оказалось это довольно проблематично (особенно для человека, который не очень разбирается в плюсах, особенно со всякими ассемблерами и компиляторами , пара сотен вариантов компиляции).

Начал с блога JetBrains .

Описано довольно подробно, но это для предыдущих версий STM32CubeMX; в новой немного изменилась структура каталогов, в результате чего я некоторое время не понимал, почему она не компилируется.

Потом разобрался - поменял пути, а для cortex-m3 убрал параметры -mfpu. Но опять не скомпилировалось.

Потом оказалось, что я установил не тот компилятор, точнее я просто скачал его, но не указал путь к нему в файле сборки (ну немного сложно об этом думать поздно вечером).

Главное в Clion - поставить галочку в настройках "Автоматически перезагружать проект Cmake при редактировании" (Настройки -> Сборка, Выполнение, Развертывание -> Cmake), тогда после правок не нужно ничего очищать вручную.

Еще одно изменение — упомянутый в блоге отладчик переименован в Ozone, я его еще не тестировал, напишу об этом позже.

И последняя проблема, которая сверлила мне мозг.

Очень хотелось ООП, но проект не компилировался, если я добавлял C++ файл, было много ошибок с не найденными функциями (например, _exit, _sbrk и т.п.

).

Здесь было 2 проблемы:

  • в файле CMakeLists.txt в блоге JetBrains в директиве проекта не установлен флаг CXX (необходим для файлов C++)
  • Для исправления ошибок в файле из блога не хватило опций -specs=nosys.specs -specs=nano.specs после опции -gc-sections. Они просто создают эти прототипы или наоборот игнорируют эти методы (точно сказать не могу)
После этого проект начал нормально компилироваться и его размер стал в пределах нормы (без опции -specs=nano.specs размер был в 10 раз больше для пустого проекта, примерно 110 кб, с опцией - 18 кб.

) Итак, что я сделал:

  1. установить Клион
  2. зайдите в настройки (Настройки -> Сборка, Выполнение, Развертывание -> Cmake) и установите флажок «Автоматически перезагружать проект Cmake при редактировании».

  3. здесь мы вводим параметр в поле параметров Cmake -DCMAKE_TOOLCHAIN_FILE=STM32L1xx.cmake И в поле Путь создания поместите сборку (если вы его измените, то в файлах CMakeLists.txt и STM32L1xx.cmake его тоже нужно будет изменить)
  4. установите компилятор ARM ( получил это здесь )
  5. импортируйте проект (который ранее был создан в STM32CubeMx), скажите, что вы можете создать CMakeLists.txt
  6. отсюда или отсюда мой репозиторий скопируйте содержимое CMakeLists.txt в созданный в Clion и добавьте файл STM32L1xx.cmake (вы можете называть его как угодно)
  7. в STM32L1xx.cmake редактируем имя проекта в директиве проекта и можно убрать CXX, если C++ вам не нужен
  8. заменить в файле CMakeLists.txt в директиве add_definitions(-DSTM32L100xC) к вашему контроллеру
  9. для надежности вы можете сделать: Инструменты -> Cmake -> Сбросить кеш и перезагрузить проект, а затем Инструменты -> Cmake -> Перезагрузить проект Cmake.
  10. теперь ты можешь сбросить его
Файл CMakeLists.txt
  
   

project(Skeleton C CXX ASM) cmake_minimum_required(VERSION 3.5.0) add_definitions(-DSTM32L100xC) set(FREERTOS_DIR Middlewares/Third_Party/FreeRTOS/Source/) file(GLOB_RECURSE USER_SOURCES "Src/*.

c") file(GLOB_RECURSE HAL_SOURCES "Drivers/STM32L1xx_HAL_Driver/Src/*.

c") file( GLOB_RECURSE FREERTOS_SOURCES "${FREERTOS_DIR}/*.

c" "${FREERTOS_DIR}/CMSIS_RTOS/*.

c" "${FREERTOS_DIR}/portable/GCC/ARM_CM3/*.

c" ) add_library( CMSIS Src/system_stm32l1xx.c startup/startup_stm32l100xc.s ) include_directories(Inc) include_directories(Src/gps/parser/nmea) include_directories(Drivers/STM32L1xx_HAL_Driver/Inc) include_directories(Drivers/CMSIS/Include) include_directories(Drivers/CMSIS/Device/ST/STM32L1xx/Include) include_directories(${FREERTOS_DIR}) include_directories(${FREERTOS_DIR}/CMSIS_RTOS) include_directories(${FREERTOS_DIR}/include) include_directories(${FREERTOS_DIR}/portable/GCC/ARM_CM3/) include_directories(${FREERTOS_DIR}/portable/GCC/MemMang) add_executable(${PROJECT_NAME}.

elf ${USER_SOURCES} ${HAL_SOURCES} ${LINKER_SCRIPT} ${FREERTOS_SOURCES}) target_link_libraries(${PROJECT_NAME}.

elf CMSIS) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-Map=${PROJECT_SOURCE_DIR}/build/${PROJECT_NAME}.

map") set(HEX_FILE ${PROJECT_SOURCE_DIR}/build/${PROJECT_NAME}.

hex) set(BIN_FILE ${PROJECT_SOURCE_DIR}/build/${PROJECT_NAME}.

bin) add_custom_command(TARGET ${PROJECT_NAME}.

elf POST_BUILD COMMAND ${CMAKE_OBJCOPY} -Oihex $<TARGET_FILE:${PROJECT_NAME}.

elf> ${HEX_FILE} COMMAND ${CMAKE_OBJCOPY} -Obinary $<TARGET_FILE:${PROJECT_NAME}.

elf> ${BIN_FILE} COMMENT "Building ${HEX_FILE} \nBuilding ${BIN_FILE}")

Файл STM32L1xx.cmake:

INCLUDE(CMakeForceCompiler) SET(CMAKE_SYSTEM_NAME Generic) SET(CMAKE_SYSTEM_VERSION 1) # Specify the cross compiler. arm-none-eabi-gcc and arm-none-eabi-g++ are full path required CMAKE_FORCE_C_COMPILER(arm-none-eabi-gcc GNU) CMAKE_FORCE_CXX_COMPILER(arm-none-eabi-g++ GNU) SET(LINKER_SCRIPT ${PROJECT_SOURCE_DIR}/STM32L100RCTx_FLASH.ld) SET(COMMON_FLAGS "-mcpu=cortex-m3 -O2 -mthumb -ffunction-sections -fdata-sections -g -fno-common -fmessage-length=0") SET(CMAKE_CXX_FLAGS_INIT "${COMMON_FLAGS} -std=c++11") SET(CMAKE_C_FLAGS_INIT "${COMMON_FLAGS} -std=gnu99") SET(CMAKE_EXE_LINKER_FLAGS_INIT "-Wl,-gc-sections -specs=nosys.specs -specs=nano.specs -T ${LINKER_SCRIPT}")

Работать стало одно удовольствие, а пока заливаю прошивку через утилиту STM, позже попробую установить OZONE. Отвечу на вопросы (если смогу).

Теги: #clion #C++ #CMake #stm32 #Программирование микроконтроллеров

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.