stm32工程改造成cmake管理的工程

一、keil5工程介绍

1、工程创建

使用keil5创建stm32工程这种界面化的方式对于初学者来说比较友好,创建步骤网上已经有很多了,主要是选择芯片型号、勾选外设库、工程下载配置、创建自己的代码等;
使用keil创建工程隐藏了一些细节,比如链接文件的生成是由工程配置自动生成的,启动脚本也是根据选择的芯片型号自动选择的;
最新的工具可以生成更多的初始化代码使开发更加便捷;

2、工程组成

芯片启动文件、芯片寄存器头文件、芯片内核文件core_xxx.h 、外设库文件、自己开发的项目代码文件、不易看到的文件(链接文件由工程配置后产生、编译控制文件集成开发环境自己控制编译)

二、cmake管理的工程介绍

1、cmake工程组成

在这里插入图片描述

2、安装工具

已经安装好ubuntu环境;
cmake安装:sudo apt-get install cmake;
编译工具链安装:
下载gcc-arm-none-eabi-9-2019-q4-major-x86_64-linux.tar.bz2;
配置/etc/profile中添加
export ARM_GCC_HOME=/usr/gcc-arm-none-eabi-9-2019-q4-major
PATH=/usr/gcc-arm-none-eabi-9-2019-q4-major/bin:$PATH

3、cmake编译文本编写

以下实例包含CMakelist.txt,对于自己的项目可以根据自己的代码添加源文件、头文件、根据平台更换启动文件,链接文件,库文件源码即可

4、cmake实例工程

源码: 见压缩包资源 stm32工程改造成cmake的工程demo.tar.gz
工程使用方法:
解压后mkdir build ,cd build ,cmake . . ,make 即可生成执行文件;
CMakelist.txt文件内容:

# CMake minimum version
cmake_minimum_required (VERSION 2.8.7)

function(redefine_file_macro targetname)
    get_target_property(source_files "${targetname}" SOURCES)
    foreach(sourcefile ${source_files})
        get_property(defs SOURCE "${sourcefile}"
            PROPERTY COMPILE_DEFINITIONS)
        get_filename_component(filepath "${sourcefile}" ABSOLUTE)
        string(REPLACE ${PROJECT_SOURCE_DIR}/ "" relpath ${filepath})
        list(APPEND defs "__FILE__=\"${relpath}\"")
        set_property(
            SOURCE "${sourcefile}"
            PROPERTY COMPILE_DEFINITIONS ${defs}
            )
    endforeach()
endfunction()

# Project Infomation  根据项目情况修改生成的执行文件的名字
project( App )
enable_language(ASM)
enable_language(C)

add_definitions(-Wno-builtin-macro-redefined)
# Reset output path
set (EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin)
set (LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/lib)

# STDLIB
set (CMAKE_SHARED_LIBRARY_LINK_C_FLAGS)

# Set include path  根据自己的项目修改此部分源文件目录
include_directories (./Libraries/CMSIS/CM3/CoreSupport)
include_directories (./Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x)
include_directories (./Libraries/STM32F10x_StdPeriph_Driver/inc)
include_directories (./ProjectCode)

# The need build source path and build all files 根据自己的项目修改此部分头文件目录
aux_source_directory (./Libraries/CMSIS/CM3/CoreSupport SRC_CM3)
aux_source_directory (./Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x SRC_STDEV)
aux_source_directory (./Libraries/STM32F10x_StdPeriph_Driver/src SRC_STDLIB)
aux_source_directory (./ProjectCode SRC_PRO)
set (SRC_STARTUP   ./Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/TrueSTUDIO/startup_stm32f10x_hd.s)  #g 根据项目情况修改此部分启动文件
set_source_files_properties(./Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/TrueSTUDIO/startup_stm32f10x_hd.s PROPERTIES COMPILE_FLAGS "-x assembler-with-cpp")
set(SRC_LIST
        ${SRC_CM3}
        ${SRC_STDEV}
        ${SRC_STDLIB}
        ${SRC_PRO}
        ${SRC_STARTUP}
        )

set(CROSS_TARGET_TRIPLET "arm-none-eabi-")

# CC AR LD AS
set(CMAKE_C_COMPILER "${CROSS_TARGET_TRIPLET}gcc")
set(CMAKE_ASM_COMPILER "${CROSS_TARGET_TRIPLET}gcc")

# CFLAGS
set (CMAKE_C_FLAGS " -g -Os -Wall -fdata-sections -ffunction-sections --specs=nosys.specs --specs=nano.specs -mthumb -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp" CACHE INTERNAL "c compiler flags")
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS}  -D USE_STDPERIPH_DRIVER  -D STM32F10X_HD  -D APP  -D DEBUG ")

# CXXFLAGS
set (CMAKE_CXX_FLAGS "-g -Wextra -Wshadow -Wredundant-decls  -Weffc++ -fno-common -ffunction-sections -fdata-sections -MD -Wall -Wundef  -mthumb -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp" CACHE INTERNAL "cxx compiler flags")

# ASMFLAGS
set (CMAKE_ASM_FLAGS "-g  -mthumb -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp" CACHE INTERNAL "asm compiler flags")

# LDFLAGS
set (CMAKE_EXE_LINKER_FLAGS "-g -Wl,--gc-sections,-Map=App.map -mthumb -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp" CACHE INTERNAL "executable linker flags")
set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -T ${CMAKE_SOURCE_DIR}/STM32FLASH.ld")


# Generate the target
add_executable (${CMAKE_PROJECT_NAME}.elf  ${SRC_LIST})
redefine_file_macro(${CMAKE_PROJECT_NAME}.elf)

# Link the library to the target
target_link_libraries (${CMAKE_PROJECT_NAME}.elf -lc -lm -lnosys)

# Generate the binary file
add_custom_target (${CMAKE_PROJECT_NAME}.bin ALL arm-none-eabi-objcopy -Obinary "${EXECUTABLE_OUTPUT_PATH}/${CMAKE_PROJECT_NAME}.elf" "${EXECUTABLE_OUTPUT_PATH}/${CMAKE_PROJECT_NAME}.bin" DEPENDS ${EXECUTABLE_OUTPUT_PATH}/${CMAKE_PROJECT_NAME}.elf)

# Generate the hex file
add_custom_target (${CMAKE_PROJECT_NAME}.hex ALL arm-none-eabi-objcopy -Oihex "${EXECUTABLE_OUTPUT_PATH}/${CMAKE_PROJECT_NAME}.elf" "${EXECUTABLE_OUTPUT_PATH}/${CMAKE_PROJECT_NAME}.hex" DEPENDS ${EXECUTABLE_OUTPUT_PATH}/${CMAKE_PROJECT_NAME}.elf)

# Echo the size Infomation
add_custom_target (size ALL arm-none-eabi-size "${EXECUTABLE_OUTPUT_PATH}/${CMAKE_PROJECT_NAME}.elf" DEPENDS ${EXECUTABLE_OUTPUT_PATH}/${CMAKE_PROJECT_NAME}.elf)

# Make flash to the board by st-link
#add_custom_target (flash COMMAND st-flash write ${EXECUTABLE_OUTPUT_PATH}/${CMAKE_PROJECT_NAME}.bin 0x8000000)

# Make clean-all
add_custom_target (clean-all COMMAND rm -rf ${CMAKE_BINARY_DIR}/*)

三、两种工程优缺点

keil工程界面更好,但是由于隐藏了编译细节对于编译过程,编译原理的理解不太直接;
cmake工程虽然不是界面化的,但是更轻量,有助于理解编译过程的细节,工作几年的人一般更喜欢用命令行;

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CMake是一种跨平台的开源构建工具,用于管理软件项目的构建过程。对于STM32系列的开发,CMake可以与GCC工具链(需要具有newlib)和STM32Cube软件包一起使用。 在使用CMake构建STM32项目时,需要注意以下几点: 1. 设置调试模式为Debug:通过设置CMAKE_BUILD_TYPE为"Debug"来调试STM32。 2. 配置头文件包含路径:使用include_directories()指令来填写完整的头文件路径。 3. 打包源文件:可以使用aux_source_directory()指令将整个目录下的源文件打包为一个变量。 4. 配置链接脚本文件:需要设置链接脚本文件的位置,例如将链接脚本文件存放在CMakeLists.txt所在的目录下,并使用set(LINKER_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/STM32F427VGTx_FLASH.ld")来指定链接脚本文件的路径。 5. 在使用GCC编译器时,需要注意原先在MDK中使用的__nop()语句在GCC中不被支持。可以通过添加一个宏定义#define __nop() asm("nop")来解决这个问题。 综上所述,对于STM32开发项目,可以使用CMake与GCC工具链和STM32Cube软件包进行构建。需要注意设置调试模式、配置头文件路径、打包源文件、配置链接脚本文件以及处理GCC编译器不支持的语句等。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [stm32-cmake:用于stm32开发的CMake](https://download.csdn.net/download/weixin_42099087/18201604)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Linux下使用VSCode,GCC,OpenOCD实现STM32一键编译烧录调试(CMake篇)](https://blog.csdn.net/u010000843/article/details/114645057)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Linux下实现飞控开发:使用CMake构建STM32工程](https://blog.csdn.net/loveuav/article/details/101361408)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值