Перед примером моей установки немного лирики.
Я давно хотел попробовать свои силы в микроконтроллерах, точнее, у меня были идеи с их использованием, которые мне очень хотелось реализовать.
Сначала я начал с 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. Они просто создают эти прототипы или наоборот игнорируют эти методы (точно сказать не могу)
) Итак, что я сделал:
- установить Клион
- зайдите в настройки (Настройки -> Сборка, Выполнение, Развертывание -> Cmake) и установите флажок «Автоматически перезагружать проект Cmake при редактировании».
- здесь мы вводим параметр в поле параметров Cmake -DCMAKE_TOOLCHAIN_FILE=STM32L1xx.cmake И в поле Путь создания поместите сборку (если вы его измените, то в файлах CMakeLists.txt и STM32L1xx.cmake его тоже нужно будет изменить)
- установите компилятор ARM ( получил это здесь )
- импортируйте проект (который ранее был создан в STM32CubeMx), скажите, что вы можете создать CMakeLists.txt
- отсюда или отсюда мой репозиторий скопируйте содержимое CMakeLists.txt в созданный в Clion и добавьте файл STM32L1xx.cmake (вы можете называть его как угодно)
- в STM32L1xx.cmake редактируем имя проекта в директиве проекта и можно убрать CXX, если C++ вам не нужен
- заменить в файле CMakeLists.txt в директиве add_definitions(-DSTM32L100xC) к вашему контроллеру
- для надежности вы можете сделать: Инструменты -> Cmake -> Сбросить кеш и перезагрузить проект, а затем Инструменты -> Cmake -> Перезагрузить проект Cmake.
- теперь ты можешь сбросить его
Файл STM32L1xx.cmake: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}")
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 #Программирование микроконтроллеров
-
Sols - Сервис По 3D Печати Стелек
19 Oct, 24 -
Урок 1. Знакомство С Ext.net
19 Oct, 24 -
Прокси Только На Место
19 Oct, 24