VSCODE开发STM32,实现编译下载和调试

一、简介

用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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rose_yj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值