前进笔记

如何将标准库程序移植到CLion开发

  1. 打开项目文件夹,创建 CMakeLists.txt
  2. 这里直接从 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}")

  1. 从已有同一芯片的项目中,复制 .s 启动文件 和 .ld 链接文件,如果没有可以用 STM32CUBEMX 创建一个,创建时 IDE 选择 STM32CUBEIDE 或其他使用 GCC 的 IDE 即可

或者也可以从 STM32CUBEMX 的源码模板目录下复制,当然一定要选择针对 gcc 的,路径根据版本不同可能会有变化,如:
C:UsersCloverGitSTM32CubeRepositorySTM32Cube_FW_F1_V1.8.3DriversCMSISDeviceSTSTM32F1xxSourceTemplatesgcc
C:UsersCloverGitSTM32CubeRepositorySTM32Cube_FW_F1_V1.8.3DriversCMSISDeviceSTSTM32F1xxSourceTemplatesgcclinker

  1. 将上述文件分别复制到 CMakeLists.txt 指定的目录并改为相应的名称,我这里将 .ld 文件放在程序根目录,.s 文件放在 Libraries/Startup 目录(目录下原有的针对 Keil ARMCC 的 .s 文件已经不再使用了)
  2. 在运行配置中,添加新的运行配置,接着就像使用 HAL 库一样,添加 OpenOCD 运行配置文件,然后关闭,切换到新的运行配置
  3. 编译,遇到了一些问题

将根目录下的cmake-build-debug文件夹删除,然后在 CMakeLists.txt 右键重新加载,会重新生成 cmake-build-debug
如果仍不能正常编译,尝试在设置中切换项目工具链,用其他工具链编译一次(无论是否成功),再切换回原来的工具链编译

  1. 不再提示说不认编译参数了,但是又出现了新的问题,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) );

  1. 再次编译,一切搞定
  2. 注意

• 编译配置中,编译目标一定要选 .elf 后缀的,出现诸如下面这样的编译错误,大概率是编译目标没有选对
exit.c:(.text.exit+0x2c): undefined reference to `_exit'

• 没有正确添加启动文件的话,链接器会产生下面这样的警告
ld.exe: warning: cannot find entry symbol Reset_Handler; defaulting to 08000000
且编译完后的程序不但非常小还会运行不了

当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »