一、简介
用VSCODE代替KEIL,实现STM32的开发编译下载和调试。
二、工具
vscode、J-LINK、STM32CubeMX
三、步骤
1.先用一个最简单的LED工程,这里用STM32F103 库函数版本 实验1 跑马灯实验
因为我们要用VSCODE来开发,必然使用GCC来开发,故我们可以删除一些没有用的文件,这里主要删除掉OBJ文件夹,keililll.bat,CORE文件夹里面的startup_stm32f10x_hd启动文件(因为这个启动文件是用在keil里面的,不适合我们VSCODE开发),然后就是USER下面除.c,.h的文件全部删掉。
然后用VSCODE打开这个 文件,现在给大家看下整体图。
我将以上面这张图来讲解,现在我们创建一个CMakeLists.txt文件,makefile文件,这里面最重要就是CMakeLists.txt文件,通过这个来编译整个程序,这个文件内容整体代码如下所示:
#要求最低版本
cmake_minimum_required(VERSION 3.10)
include("${CMAKE_SOURCE_DIR}/script/cortex_m3.cmake")
project(led_32 LANGUAGES C ASM)
# source
file(GLOB SRC_CORE ${CMAKE_SOURCE_DIR}/CORE/*.c)
file(GLOB SRC_HALED ${CMAKE_SOURCE_DIR}/HARDWARE/LED/*.c)
file(GLOB SRC_FWLIB ${CMAKE_SOURCE_DIR}/STM32F10x_FWLib/src/*.c)
file(GLOB SRC_DELAY ${CMAKE_SOURCE_DIR}/SYSTEM/delay/*.c)
file(GLOB SRC_SYS ${CMAKE_SOURCE_DIR}/SYSTEM/sys/*.c)
file(GLOB SRC_USART ${CMAKE_SOURCE_DIR}/SYSTEM/usart/*.c)
file(GLOB SRC_USER ${CMAKE_SOURCE_DIR}/USER/*.c)
file(GLOB SRC_DRIVER ${CMAKE_SOURCE_DIR}/Drivers/src/*.c)
#添加COMMON
file(GLOB SRC_COMMON ${CMAKE_SOURCE_DIR}/common/src/*.c)
#.h
include_directories(
${CMAKE_SOURCE_DIR}/CORE
${CMAKE_SOURCE_DIR}/HARDWARE/LED
${CMAKE_SOURCE_DIR}/STM32F10x_FWLib/inc
${CMAKE_SOURCE_DIR}/SYSTEM/delay
${CMAKE_SOURCE_DIR}/SYSTEM/sys
${CMAKE_SOURCE_DIR}/SYSTEM/usart
${CMAKE_SOURCE_DIR}/USER
${CMAKE_SOURCE_DIR}/Drivers/include
${CMAKE_SOURCE_DIR}/common/inc
)
#启动汇编文件
SET(STARTUP_ASM ${CMAKE_SOURCE_DIR}/script/startup_stm32f103xe.s)
#链接器脚本(Linker Script)用于指导链接器如何将各个目标文件和库文件组合成一个可执行文件或库。
set(LINKER_SCRIPT ${CMAKE_SOURCE_DIR}/script/STM32F103ZETx_FLASH.ld)
# CFLAGS 用于向编译器添加编译定义
add_definitions(
-DUSE_STDPERIPH_DRIVER
-DSTM32F10X_HD
)
# LDFLAGS 链接器标志
set(CMAKE_EXE_LINKER_FLAGS
"${CMAKE_EXE_LINKER_FLAGS} -T ${LINKER_SCRIPT} -Wl,-Map=${PROJECT_BINARY_DIR}/${PROJECT_NAME}.map -Wl,--gc-sections,--print-memory-usage"
)
# target
add_executable(${PROJECT_NAME}.elf ${SRC_CORE} ${SRC_HALED} ${SRC_FWLIB} ${SRC_DELAY} ${SRC_SYS} ${SRC_USART}
${SRC_USER} ${STARTUP_ASM} ${SRC_DRIVER} ${SRC_COMMON})
# custom
add_custom_command(
TARGET "${PROJECT_NAME}.elf"
POST_BUILD
# Build .hex and .bin files
COMMAND ${OBJCOPY} -Obinary "${PROJECT_NAME}.elf" "${PROJECT_NAME}.bin"
COMMAND ${OBJCOPY} -Oihex "${PROJECT_NAME}.elf" "${PROJECT_NAME}.hex"
COMMENT "Building ${PROJECT_NAME}.bin and ${PROJECT_NAME}.hex"
# Display sizes
COMMAND ${SIZE} --format=berkeley "${PROJECT_NAME}.elf"
COMMENT "Invoking: Cross ARM GNU Print Size"
)
set(JFL "JFlash.exe")
add_custom_target(download
COMMAND ${JFL} -openprj"${CMAKE_SOURCE_DIR}/script/FM33LE013.jflash" -open"${PROJECT_BINARY_DIR}/${PROJECT_NAME}.hex" -auto -exit
)
这里面得启动文件.s和链接脚本文件从STM32CubeMX中获取。
然后里面的cortex_m3.cmake文件如下所示。
SET(CMAKE_SYSTEM_NAME Generic)
SET(CMAKE_SYSTEM_PROCESSOR cortex-m3)
SET(THREADX_ARCH "cortex_m3")
SET(THREADX_TOOLCHAIN "gnu")
SET(MCPU_FLAGS "-mcpu=cortex-m3 -mthumb")
SET(VFP_FLAGS "")
MESSAGE(STATUS "**** Platform: ${MCPU_FLAGS} ${VFP_FLAGS} ${FLOAT_ABI} ****")
INCLUDE(${CMAKE_CURRENT_LIST_DIR}/arm-none-eabi.cmake)
arm-none-eabi.cmake文件如下所示。
include("${CMAKE_SOURCE_DIR}/script/compile-path.cmake")
SET(CMAKE_C_COMPILER "arm-none-eabi-gcc.exe")
SET(CMAKE_CXX_COMPILER "arm-none-eabi-g++.exe")
SET(AS "arm-none-eabi-as.exe")
SET(AR "arm-none-eabi-ar.exe")
SET(OBJCOPY "arm-none-eabi-objcopy.exe")
SET(OBJDUMP "arm-none-eabi-objdump.exe")
SET(SIZE "arm-none-eabi-size.exe")
SET(CMAKE_C_STANDARD 99)
SET(CMAKE_CXX_STANDARD 11)
# 生成 compile_commands.json,可配合 clangd 实现精准的代码关联与跳转;
#SET(CMAKE_EXPORT_COMPILE_COMMANDS True)
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
SET(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
SET(CFCOMMON
"${MCPU_FLAGS} ${VFP_FLAGS} ${SYSTEM_PATH} --specs=nano.specs -specs=rdimon.specs --specs=nosys.specs -Wall -fmessage-length=0 -ffunction-sections -fdata-sections"
)
SET(CMAKE_C_FLAGS "-O0 -g ${CFCOMMON}")
SET(CMAKE_ASM_FLAGS "${MCPU_FLAGS} ${VFP_FLAGS} -x assembler-with-cpp")
compile-path.cmake文件如下所示
SET(SYSTEM_PATH "-isystem D:/gcc/gcc-arm-none-eabi-10.3-2021.10/arm-none-eabi/include")
以上就是整个CMakeLists.txt文件,然后makefile文件主要拿来在生成一些额外东西用,也可以不用这个makefile文件。
name := led_32
.PHONY: src
src:
rm -rf build/*$(name)-src.zip
7z a -tzip build/$(day).$(name).zip ../$(name) -x@.srcignore
upver:
sed -i -e "s/YEAR.*$$/YEAR ($(YEAR))/" app/version.h
sed -i -e "s/MONTH.*$$/MONTH ($(MONTH))/" app/version.h
sed -i -e "s/DAY.*$$/DAY ($(DAY))/" app/version.h
上面就是CMakeLists.txt的全部内容,当然你现在编译肯定还是编译不过,得从STM32CubeMX
里面把cmsis_compiler.h文件、cmsis_gcc.h文件、cmsis_version.h文件移过来,然后包含进去,在去编译,错误就会减少很多,不过还是有几个错误,一个是sys.c里面得ASM写法,改成gcc模式书写,然后就是2个地方_STREXH里面r前面加上&,即可。
把MSR_MSP改成gcc模式即可,如下所示:
void MSR_MSP(uint32_t addr)
{
__ASM volatile("MSR MSP, %0\n" //
"BX LR\n" //
:
: "r"(addr));
}
uint32_t __STREXH(uint16_t value, uint16_t *addr)
{
uint32_t result=0;
//__ASM volatile ("strexh %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) );
__ASM volatile ("strexh %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );
return(result);
}
总共应该就是这三个错误,主要原因是STM32库函数不是以GCC模式编译,然后有问题在解决问题,到这里应该就可以用VSCODE编译STM32程序了,并且也能够下载编译调试。
上面这张图就是整体架构图,有什么不懂欢迎call我。
具体资源等我后面上传!LED_32
然后VSCODE整体软件插件下载如下所示:
VSCODE插件等工具,vscode