VSCode Cmake GCC STM32开发环境搭建(寄存器版本程序移植)

VSCode Cmake GCC STM32开发环境搭建(寄存器版本程序移植) 一、插件安装目前安装的插件可能有重复功能插件需自行判断STM32CubeIDE for Visual Studio Code安装后会将涉及的插件均安装Chinese (Simplified) (简体中文) Language Pack for Visual Studio Code中文包CMake ToolsCmake编译工具STM32CubeIDE插件安装后也会有Cmake插件可不安装C/CC语言插件Cortex-Debug调试插件MemoryView内存查看插件Peripheral Viewer通过SVD插件查看寄存器内容Memory Inspector内存查看Hex Editor十六进制显示编辑debug-tracker-vscode调试跟踪MASM汇编查看二、工程生成使用 STM32Cube 插件生成空项目输入工程名称选择从芯片新建选择芯片保存路径生成后的目录三、工程配置CMakeLists.txt配置1、修改工程名称随文件夹名称变动# Core project settings #project(STM32F103VCT6)#enable_language(C CXX ASM)get_filename_component(PROJECT_DIR_NAME ${CMAKE_CURRENT_SOURCE_DIR}NAME)set(CMAKE_PROJECT_NAME ${PROJECT_DIR_NAME})2、修改实际源文件及对应头文件目录# Sourcesset(sources_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/Src/main.c ${CMAKE_CURRENT_SOURCE_DIR}/Src/system/gpio.c ${CMAKE_CURRENT_SOURCE_DIR}/Src/system/iic1.c)# Include directoriesforall compilersset(include_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/Inc)3、定义链接目录和链接名称主要修改链接库需要带参数 m# Link directories and names of librariesset(link_DIRS)set(link_LIBS m)4、定义输出文件名为项目名称# Add supportforblank char as part of project nameset_target_properties(${CMAKE_PROJECT_NAME}PROPERTIES OUTPUT_NAME ${CMAKE_PROJECT_NAME})5、增加系统默认宏定义STM32F103XX# Add project symbols(macros)target_compile_definitions(${CMAKE_PROJECT_NAME}PRIVATE ${symbols_SYMB}$$COMPILE_LANGUAGE:C:${symbols_c_SYMB}$$COMPILE_LANGUAGE:CXX:${symbols_cxx_SYMB}$$COMPILE_LANGUAGE:ASM:${symbols_asm_SYMB}# Configuration specific $$CONFIG:Debug:DEBUG$$CONFIG:Release:STM32F103XX)6、修改编译选项和链接选项已经过多次尝试优化编译文件尺寸已和keil接近感兴趣的可自行研究# Compiler optionstarget_compile_options(${CMAKE_PROJECT_NAME}PRIVATE ${cpu_PARAMS}${compiler_OPTS}#-Wall #-Wextra #-Wpedantic #-Wno-unused-parameter $$COMPILE_LANGUAGE:C:-Wall-fdata-sections-ffunction-sections$$COMPILE_LANGUAGE:CXX:#-Wno-volatile #-Wold-style-cast #-Wuseless-cast #-Wsuggest-override-fno-rtti-fno-exceptions-fno-threadsafe-statics$$COMPILE_LANGUAGE:ASM:-x assembler-with-cpp-MMD-MP$$CONFIG:Debug:-O0-g3-ggdb$$CONFIG:Release:-Os)# Linker optionstarget_link_options(${CMAKE_PROJECT_NAME}PRIVATE-T${linker_script_SRC}${cpu_PARAMS}${linker_OPTS}-Wl,-Map${CMAKE_PROJECT_NAME}.map #-u _printf_float # STDIO float formatting support(removeifnot used)#--specsnosys.specs--specsnano.specs # #-Wl,--start-group #-lc-lm #-lstdc#-lsupc#-Wl,--end-group #-Wl,-z,max-page-size8# Allow good software remapping across address space(with proper GCC section making)-Wl,--print-memory-usage)gnu-tools-for-stm32.cmake一般不要修改vscode_generated.cmake配置链接文件和头文件等文件变化时才需要修改# Linker scriptset(linker_script_SRC ${linker_script_SRC}${CMAKE_CURRENT_SOURCE_DIR}/stm32f103xc_flash.ld)# Sourcesset(sources_SRCS ${sources_SRCS}${CMAKE_CURRENT_SOURCE_DIR}/Src/syscall.c ${CMAKE_CURRENT_SOURCE_DIR}/Src/sysmem.c ${CMAKE_CURRENT_SOURCE_DIR}/Src/startup_stm32f103xx.S)CMakePresets.json修改配置1、一般不要修改如果不想新建工程文件只是芯片改了记得来这里修改芯片型号否则调试会报错CMSIS_Dname:STM32F103VBT6,编译1、工程项目一定设置为debug模式release模式编译出来的文件有问题2、windows系统下新建clean_build.bat批处理文件清除编译缓存代码内容如下del/q/f/s build\*rmdir/s/q build\Debug3、通过cmake编译生成执行文件调试1、点击调试自动生成或者使用配置好的文件直接复制过来配置调试文件2、launch.json需要注意以下几个地方{version:0.2.0,configurations:[//cortex-debuge内的jlink{cwd:${workspaceFolder},executable:./build/Debug/${workspaceRootFolderName}.elf,name:JLink6.20,request:launch,type:cortex-debug,device:STM32F103VCT6,//芯片型号必须和Jlink软件中的型号一致runToEntryPoint:main,showDevDebugOutput:raw,servertype:jlink,serverpath:C:/Program Files (x86)/SEGGER/JLink_V620/JLinkGDBServerCL.exe,//JLinkGDBServerCL.exe自定义路径svdFile:${workspaceRoot}/STM32F103xx.svd,//指定SVD文件路径查看寄存器内容liveWatch:{enabled:true,//使能实时查看变量功能samplesPerSecond:2//2秒采集一次数据}},{//stm for vscode 内的stlinktype:stlinkgdbtarget,request:launch,name:STM32Cube: STM32 Launch ST-Link GDB Server,origin:snippet,cwd:${workspaceFolder},preBuild:${command:st-stm32-ide-debug-launch.build},runEntry:main,imagesAndSymbols:[{imageFileName:${command:st-stm32-ide-debug-launch.get-projects-binary-from-context1}}]}]}2、settings.json需要注意以下几个地方{cmake.cmakePath:cube-cmake,cmake.configureArgs:[-DCMAKE_COMMANDcube-cmake],cmake.preferredGenerators:[Ninja],stm32cube-ide-clangd.path:cube,stm32cube-ide-clangd.arguments:[starm-clangd,--query-driver${env:CUBE_BUNDLE_PATH}/gnu-tools-for-stm32/13.3.1st.9/bin/arm-none-eabi-gcc.exe,--query-driver${env:CUBE_BUNDLE_PATH}/gnu-tools-for-stm32/13.3.1st.9/bin/arm-none-eabi-g.exe],files.encoding:gb2312}3、SVD文件需要去自行下载下载后放到主目录svd可以去官方给的驱动包文件中找4、调试时通过.launch文件使能live watch功能可实时查看变量值。四、代码移植.ld链接文件修改1、主要修改配置RAM和FLASH起始地址及大小/* Memories definition */MEMORY{RAM(xrw):ORIGIN0x20000000,LENGTH48K-1FLASH(rx):ORIGIN0x8000000,LENGTH20K}2、涉及特殊FLASH和RAM配置的需单独配置比如需要实现远程IAP更新在写自身flash时需要将flash写函数搬运到RAM中需要上电后把写flash函数和变量搬运到RAM中需要单独定义FLASH和RAM空间以便写flash时自身代码和变量存储区域丢失也不影响函数功能.s启动文件修改1、注释掉通过库函数初始化函数启动直接通过主函数启动/* Call the clock system initialization function.*/;bl SystemInit2、配套上面描述的IAP更新需要在启动main函数前搬运程序源文件及头文件复制1、可以按照原来的目录格式直接复制过来但要记得在Cmake文件中添加对应的源文件及目录部分截图2、如果是ARMCC编译器移植过来的代码注意ARMCC和GCC有语法区别目前涉及到的有以下几个内联汇编写法不一样gcc写法voidWFI_SET(void){__asm__volatile(WFI);}armcc写法__asmvoidWFI_SET(void){WFI;}__packed支持不一样gcc写法typedefunion__attribute__((aligned(2),packed)){uint8_tv[6];struct__attribute__((packed)){//注意此处arm-gcc编译器与armcc编译器对__packed的支持不一样uint16_tByteCount;}armcc写法typedefunion__attribute__((aligned(2),packed)){uint8_tv[6];__packedstruct{uint16_tByteCount;}五、其他注意事项vscode使用技巧1、可以针对不同的开发环境配置不同的插件2、AI代码补全插件下载这个插件很好用