- 打开项目文件夹,创建 CMakeLists.txt
- 这里直接从 CLion 对 HAL 库项目生成的 CMakeLists.txt 文件里边搬,从文件开头直接粘贴即可 (部分内容可以根据需要修改):
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_VERSION 1)
cmake_minimum_required(VERSION 3.22)
# specify cross compilers and tools
set(CMAKE_C_COMPILER arm-none-eabi-gcc)
set(CMAKE_CXX_COMPILER arm-none-eabi-g++)
set(CMAKE_ASM_COMPILER arm-none-eabi-gcc)
set(CMAKE_AR arm-none-eabi-ar)
set(CMAKE_OBJCOPY arm-none-eabi-objcopy)
set(CMAKE_OBJDUMP arm-none-eabi-objdump)
set(SIZE arm-none-eabi-size)
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
# project settings
###project(<这里填项目名> C CXX ASM)
project(DCP_28 C CXX ASM)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_C_STANDARD 11)
#Uncomment for hardware floating point
#add_compile_definitions(ARM_MATH_CM4;ARM_MATH_MATRIX_CHECK;ARM_MATH_ROUNDING)
#add_compile_options(-mfloat-abi=hard -mfpu=fpv4-sp-d16)
#add_link_options(-mfloat-abi=hard -mfpu=fpv4-sp-d16)
#Uncomment for software floating point
#add_compile_options(-mfloat-abi=soft)
dd_compile_options(-mcpu=cortex-m3 -mthumb -mthumb-interwork)
add_compile_options(-ffunction-sections -fdata-sections -fno-common -fmessage-length=0)
# uncomment to mitigate c++17 absolute addresses warnings
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-register")
# Enable assembler files preprocessing
add_compile_options($<$<COMPILE_LANGUAGE:ASM>:-x$<SEMICOLON>assembler-with-cpp>)
if ("${CMAKE_BUILD_TYPE}" STREQUAL "Release")
message(STATUS "Maximum optimization for speed")
add_compile_options(-Ofast)
elseif ("${CMAKE_BUILD_TYPE}" STREQUAL "RelWithDebInfo")
message(STATUS "Maximum optimization for speed, debug info included")
add_compile_options(-Ofast -g)
elseif ("${CMAKE_BUILD_TYPE}" STREQUAL "MinSizeRel")
message(STATUS "Maximum optimization for size")
add_compile_options(-Os)
else ()
message(STATUS "Minimal optimization, debug info included")
add_compile_options(-Og -g)
endif ()
###<这里添加 include 路径,可以从 keil 中复制粘贴然后修改>
include_directories(Libraries/CMSIS)
include_directories(Libraries/Startup)
include_directories(Libraries/STM32F10x_StdPeriph_Driver/inc)
include_directories(App)
include_directories(Bsp)
###<这里添加宏定义参数,可以从 keil 中复制粘贴然后修改>
add_definitions(
-DDEBUG -DSTM32F10X_HD -DUSE_STDPERIPH_DRIVER
)
###<这里添加项目文件路径,参照下面的格式,在最后务必添加 "Libraries/Startup/startup_stm32f103zetx.s" 的语句,这是芯片的启动文件路径,可以按实际情况改变,这一步至关重要,先添加,稍后会讲在哪里能得到这个文件>
file(GLOB_RECURSE SOURCES "App/*.*" "Bsp/*.*" "Libraries/STM32F10x_StdPeriph_Driver/src/*.*" "Libraries/CMSIS/*.*" "Libraries/Startup/startup_stm32f103zetx.s")
###<这里添加 GCC 链接用的 ld文件,这里将文件放在了项目根目录(使用了环境变量),可以按实际情况改变,先添加,稍后会讲在哪里能得到这个文件>
set(LINKER_SCRIPT ${CMAKE_SOURCE_DIR}/STM32F103ZETX_FLASH.ld)
add_link_options(-Wl,-gc-sections,--print-memory-usage,-Map=${PROJECT_BINARY_DIR}/${PROJECT_NAME}.map)
add_link_options(-mcpu=cortex-m3 -mthumb -mthumb-interwork)
add_link_options(-T ${LINKER_SCRIPT})
###这下面是我的自定义参数配置,非必要参数,可以参考
# 自定义参数配置 Start
include_directories(
)
link_directories(
)
link_libraries(
)
add_definitions(
# -DUSE_FULL_ASSERT # 定义断言宏
# -DDEBUG # 定义宏 DEBUG
# -UUSE_FULL_ASSERT # 取消定义断言宏
# -UDEBUG # 取消定义宏 DEBUG
)
add_compile_options(
-fshort-enums # 使用短枚举
-funsigned-char # 将 char 定义为无符号类型 unsigned char
# -fsigned-char # 将 char 定义为有符号类型 signed char
# -fexec-charset=gbk # 指定执行字符集
# -specs=nosys.specs
# -ffreestanding
# -flto
)
add_link_options(
# -specs=nosys.specs
# -ffreestanding
# -flto
# -nostdlib
)
# 自定义参数配置 End
###下面是生成文件位置等参数,可以根据需要修改
add_executable(${PROJECT_NAME}.elf ${SOURCES} ${LINKER_SCRIPT})
set(HEX_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.hex)
set(BIN_FILE ${PROJECT_BINARY_DIR}/${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}
Building ${BIN_FILE}")
- 从已有同一芯片的项目中,复制 .s 启动文件 和 .ld 链接文件,如果没有可以用 STM32CUBEMX 创建一个,创建时 IDE 选择 STM32CUBEIDE 或其他使用 GCC 的 IDE 即可
或者也可以从 STM32CUBEMX 的源码模板目录下复制,当然一定要选择针对 gcc 的,路径根据版本不同可能会有变化,如:
C:UsersCloverGitSTM32CubeRepositorySTM32Cube_FW_F1_V1.8.3DriversCMSISDeviceSTSTM32F1xxSourceTemplatesgcc
C:UsersCloverGitSTM32CubeRepositorySTM32Cube_FW_F1_V1.8.3DriversCMSISDeviceSTSTM32F1xxSourceTemplatesgcclinker
- 将上述文件分别复制到 CMakeLists.txt 指定的目录并改为相应的名称,我这里将 .ld 文件放在程序根目录,.s 文件放在 Libraries/Startup 目录(目录下原有的针对 Keil ARMCC 的 .s 文件已经不再使用了)
- 在运行配置中,添加新的运行配置,接着就像使用 HAL 库一样,添加 OpenOCD 运行配置文件,然后关闭,切换到新的运行配置
- 编译,遇到了一些问题
将根目录下的cmake-build-debug文件夹删除,然后在 CMakeLists.txt 右键重新加载,会重新生成 cmake-build-debug
如果仍不能正常编译,尝试在设置中切换项目工具链,用其他工具链编译一次(无论是否成功),再切换回原来的工具链编译
- 不再提示说不认编译参数了,但是又出现了新的问题,Libraries/CMSIS/core_cm3.c 编译不过
针对这一问题,解决方法如下
• 打开 Libraries/CMSIS/core_cm3.c
• 找到函数
uint32_t __STREXB(uint8_t value, uint8_t *addr)
• 将
__ASM volatile ("strexb %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) );
改为
__ASM volatile ("strexb %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );
• 找到函数
uint32_t __STREXH(uint16_t value, uint16_t *addr)
• 将
__ASM volatile ("strexh %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) );
改为
__ASM volatile ("strexh %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );
- 再次编译,一切搞定
- 注意
• 编译配置中,编译目标一定要选 .elf 后缀的,出现诸如下面这样的编译错误,大概率是编译目标没有选对
exit.c:(.text.exit+0x2c): undefined reference to `_exit'
• 没有正确添加启动文件的话,链接器会产生下面这样的警告
ld.exe: warning: cannot find entry symbol Reset_Handler; defaulting to 08000000
且编译完后的程序不但非常小还会运行不了
本文由 CloverGit 发表
本站文章未注明出处均为本站原创
采用 知识共享署名-相同方式共享 4.0 (CC BY 4.0) 国际许可协议进行许可
转载时务必遵守许可协议进行署名
最后编辑于: 2023 年 5 月 7 日 03 时 17 分