当前位置: 代码网 > it编程>编程语言>Java > Vscode搭建开发调试STM32/RISC-V环境IDE(最全面)

Vscode搭建开发调试STM32/RISC-V环境IDE(最全面)

2024年08月03日 Java 我要评论
单片机开发IDE环境如KeilMDK,虽然操作简单,容易上手,方便调试。但就是代码编辑和风格很老套,中文符号乱码还是常有的事,论代码编辑来说Keil就像老古董一样。而如今流行的vscode编辑器很不错,免费且相当轻量级,用来代码开发体验很好。Clion IDE要说更好,但是它不免费且体积较大,Stm32cubeIDE生成工程模板和配置方便,但自动补全还是太烂了,总之各有优劣吧。这里介绍下vscode搭建开发调试STM32的IDE,分享给有需要的朋友。

前言

这里介绍下vscode搭建开发调试stm32的ide,分享给有需要的朋友。

跟稚晖君的基于clion的如出一撤,都是基于cmake的工程,其实并不限于芯片是stm32还是risc-v,原理都是一样的(使用cmake管理项目,调用交叉工具链编译链接,使用openocd在线调试)。

虽然vscode下也有eide插件,但是个人感觉它略显繁琐,还是cmake的更通用些。用vscode开发stm32简直不要太爽,希望大家都能优雅的嵌入式开发。图引用自稚晖君的《配置clion用于stm32开发【优雅の嵌入式开发】》

【注】

对于当前较火的risc-v单片机来说,只有有交叉编译工具链,一样可以适用 vscode来配置和开发。risc-v官方支持的调试器上位机是openocd。openocd是地表最强大(没有之一)的开源调试上位机,支持各种target(arm(m、a系列)、fpga、risc-v等),支持各种调试器(jlink、cmsis-dap、ftdi等),支持jtag和swd接口。

环境准备

软件环境

  • stm32cubemx (非必须,有好处是可以帮你快速配置,若有工程模板可忽略)
  • vscode(安装相关插件cmaketools,cortexdebug)
  • mingw64(windows环境下的gcc工具链)
  • openocd( 或者jlinkgdbserver也可以)
  • gcc-arm-none-eabi (arm的gcc交叉编辑工具链,安装后需添加进环境变量)

用到的资源链接

直接从st官网下载可执行文件

以上cmake,mingw64 ,arm-none-eabi-gcc和openocd是必要软件。安装路径最好是没有中文和空格 。配置好环境变量,保证在cmd下这几行命令都能正常运行。

国外网站可能下载速度慢, 在这里提供我使用的工具链百度网盘地址

链接:https://pan.baidu.com/s/1ncqykq57xh6pfe28tu_ggw?pwd=goyj 
提取码:goyj 
--来自百度网盘超级会员v5的分享

环境变量配置好后,重启使得环境变量生效之后可以在命令行里用以下语句测试:

gcc -v
arm-none-eabi-gcc  -v 

cmake  --version
如果有信息输出,那就是装好了。

不想麻烦建工程想尽快体验的,可以直接使用我的模板。

附工程项目源码下载链接,可直接用vscode打开:

vscode插件安装

vscode需要下载安装以下插件,第一个截图中仅划红线的需要:

 

 

cmake脚本内容

cmake组织编译规则都是基于cmakelists.txt文件的,如果熟悉cmake应该会觉得很方便很强大。不熟悉的也没事,基本不需要额外修改什么,只需要知道怎么在这个文件里面添加源码目录和include文件夹的路径就行了,这个文件几乎很少改动。

#this file is auto generated from the template! do not change!
set(cmake_system_name generic)
set(cmake_system_version 1)
cmake_minimum_required(version 3.20)

# 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(vscodestm32demo  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)

add_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")

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 ()

add_definitions(-duse_hal_driver -dstm32f103xb -duse_stdperiph_driver -dstm32f10x_hd)

include_directories(./stm32f10x_fwlib/inc ./include)
file(glob_recurse sources "startup/*.*" stm32f10x_fwlib/src/*.c "./source/*.c")

set(linker_script ${cmake_source_dir}/stm32f103c8tx_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})

add_link_options(-specs=nano.specs -specs=nosys.specs -u _printf_float)

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}")

工程配置

stm32cubemx其实并不必要,我们只需要配一份cmake脚本和startup的*.s文件即可,可以通过stm32cubemx生成,同一块板子也可以直接copy过来用就好。其中的stm32f103c8tx_flash.ld文件为链接脚本文件,很重要,不同型号的片子不一样,它告诉编译器相关的编译后的可执行代码,内存变量,中断向量,链接在哪个存储区(.text,.rodata ,.data, .bss等段在ram和rom中的位置和布局 )。

如何使用

初始项目工程代码,可以使用stm32cubmx配置生成,也可以从其他地方拷贝过来,或者自己手工创建目录也可以。startup_stm32f103xb.s汇编文件和链接脚本文件是必要的。cmakelists.txt文件也是必须的,可以自己编写或者使用写好的模板也可以,文中有提供现成的模板文件。有了这些后,至于是使用hal库还是标准库都无所谓,跟使用什么库没关系。

在上述软件环境和插件都安装就绪的前提下,直接用vscode打开工程源码文件夹(cmakelists.txt所在的那个文件夹)即可。会自动识别cmake的工程配置,并在最下方展示的有相关项。如下图红色划线所示:

选择最下方状态栏的配置图标按钮,可以用来切换工具链,如下图所示: 

编译过程日志

[main] configuring project: vscodestm32demo 
[proc] executing command: "d:\program files\cmake\bin\cmake.exe" --no-warn-unused-cli -dcmake_export_compile_commands:bool=true -dcmake_build_type:string=relwithdebinfo -dcmake_c_compiler:filepath=c:\tools\arm-gcc\bin\arm-none-eabi-gcc.exe -dcmake_cxx_compiler:filepath=c:\tools\arm-gcc\bin\arm-none-eabi-g++.exe -sd:/users/administrator/desktop/test3/vscodestm32demo -bd:/users/administrator/desktop/test3/vscodestm32demo/build -g ninja
[cmake] not searching for unused variables given on the command line.
[cmake] -- maximum optimization for speed, debug info included
[cmake] -- configuring done
[cmake] -- generating done
[cmake] -- build files have been written to: d:/users/administrator/desktop/test3/vscodestm32demo/build


[main] building folder: vscodestm32demo 
[build] starting build
[proc] executing command: "d:\program files\cmake\bin\cmake.exe" --build d:/users/administrator/desktop/test3/vscodestm32demo/build --config relwithdebinfo --target all --
[build] [14/29   3% :: 0.202] building c object cmakefiles/vscodestm32demo.elf.dir/source/main.c.obj
[build] [15/29   6% :: 0.222] building c object cmakefiles/vscodestm32demo.elf.dir/stm32f10x_fwlib/src/core_cm3.c.obj
[build] [16/29  10% :: 0.265] building c object cmakefiles/vscodestm32demo.elf.dir/source/printf_uart.c.obj
[build] [17/29  13% :: 0.297] building c object cmakefiles/vscodestm32demo.elf.dir/stm32f10x_fwlib/src/stm32f10x_bkp.c.obj
[build] [18/29  17% :: 0.310] building c object cmakefiles/vscodestm32demo.elf.dir/stm32f10x_fwlib/src/misc.c.obj
[build] [19/29  20% :: 0.325] building c object cmakefiles/vscodestm32demo.elf.dir/stm32f10x_fwlib/src/stm32f10x_cec.c.obj
[build] [20/29  24% :: 0.339] building c object cmakefiles/vscodestm32demo.elf.dir/stm32f10x_fwlib/src/stm32f10x_dbgmcu.c.obj
[build] [21/29  27% :: 0.355] building c object cmakefiles/vscodestm32demo.elf.dir/stm32f10x_fwlib/src/stm32f10x_dac.c.obj

编译截图: 

烧录程序 & 在线调试

在烧录之前,必须添加仿真器配置文件,下面是dap-link的烧录文件,大家根据自己手头上的下载器的参数进行修改,并保存为xxxlink.cfg的格式,放在工程目录下config的文件夹中

# choose st-link/j-link/dap-link etc.
source [find interface/cmsis-dap.cfg]
transport select swd
# 0x10000 = 64k flash size
# 0x80000 = 512k flash size
set flash_size 0x80000
source [find target/stm32f1x.cfg]
# download speed = 10mhz
adapter speed 10000
reset_config srst_only
#reset_config none

在工程根目录下新建一个文件夹config,在里面新建一个配置文件daplink.cfg(因为我这里使用的是daplink作为仿真器),文件的内容如下:

# choose st-link/j-link/dap-link etc.
adapter driver cmsis-dap
transport select swd
​
# 0x10000 = 64k flash size
set flash_size 0x20000
​
source [find target/stm32f1x.cfg]
​
# download speed = 10mhz
adapter speed 10000

如果是用st-link的话:

# choose st-link/j-link/dap-link etc.
#adapter driver cmsis-dap
#transport select swd
source [find interface/stlink.cfg]
transport select hla_swd
source [find target/stm32f1x.cfg]
# download speed = 10mhz
adapter speed 10000

前两行设置了仿真器的类型和接口,下面几行指定了flash大小芯片类型下载速度等。

如果对自己的芯片不知道怎么设置,可以参考openocd自带的一系列配置文件,路径在openocd安装目录的share\openocd\scripts

在配置文件中不要加reset_config srst_only这一句,会导致下载失败,这一句是指示系统重启的,删除不影响下载。

isp串口烧录程序

如果不需要在线仿真调试的话, 到这里就结束了。生成的hex文件可以直接使用串口工具下载程序。flymcu 工具软件是一款用于 stm32 芯片 isp 串口烧录程序的专用工具,免费,且较为非常容易下手,好用便捷。使用串口一键下载有个前提条件,既你的电路板需要有一个rs串口转接电路,其中dtr和rts是必须的,目的为了实现一键下载准备,做为boot0电平置高电平,才能将stm芯片引导到串口烧录程序,原理是通过dtr和rts控制了boot管脚的变化使得芯片进入boot升级模式。

工具下载地址: 单片机在线编程网:www.mcuisp.com单片机在线编程网

仿真器下载程序

在终端输入命令openocd -f interface/stlink-v2.cfg -f target/stm32f4x.cfg -c "program build/vscodef4.hex verify reset exit"即可下载程序。

若在vscode中实现像keil那样的调试,需要配置调试文件,点击左侧调试按钮。选择创建launch.json文件。选择c++(gdb/lldb),再选择默认配置。

选择cortex debug: openocd 

项目根目录下的.vscode文件夹里的 launch.json编辑并增加以下内容(configfiles和svdfile配置),executable路径需要修改为实际生成elf文件的路径:

{
    // use intellisense to learn about possible attributes.
    // hover to view descriptions of existing attributes.
    // for more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "cwd": "${workspaceroot}",
            "executable": "./bin/executable.elf",
            "name": "debug with openocd",
            "request": "launch",
            "type": "cortex-debug",
            "servertype": "openocd",
            "configfiles": [
                "stlink-v2.cfg",
                "stm32f4x.cfg"
            ],
            "searchdir": [],
            "runtoentrypoint": "main",
            "showdevdebugoutput": "none",
            "svdfile": "./stm32f40x.svd"

        }

    ]
}

关于openocd 

从上面ide的步骤中可以看出,openocd 就是一个连通gdb和硬件调试器的工具,linux,macos,windows都可用。openocd 支持大量的硬件调试器,常见的比如stm32常用的stlink,jlink调试器等。openocd是一个运行于pc上的开源调试软件,最初是由dominic rath同学还在大学期间发起的(2005年)项目。openocd旨在提供针对嵌入式设备的调试、系统编程和边界扫描功能。

svd文件为单片机寄存器文件,加入这个文件才可以再调试时看寄存器的值,寄存器值变化可见需要在程序中打断点,才能看到寄存器值的变化。关于stm32单片机的svd文件,可在keil的芯片包安装路径下找到。(安装了keil以及芯片包才能找到)

运行调试界面:

 到此结束,有问题欢迎交流!最后可以愉快的使用vscode开发啦,助你开发愉快!

其他资源

嵌入式开发:配置clion用于stm32开发_clion stm32_华丶仔的博客-csdn博客

嵌入式ide原理 openocd介绍 以及stlink如何连接stm32板子_我是标同学的博客-csdn博客

从零开始教你使用clion优雅开发stm32(三)clion嵌入式开发必备插件_clion插件推荐_王拉图的博客-csdn博客

https://github.com/

配置clion用于stm32开发【标准库】 - 简书

配置vs code 开发stm32【宇宙&最强编辑器】-电子工程世界

stm32cubemx - stm32cube初始化代码生成器 - 意法半导体stmicroelectronics

从零开始教你使用clion优雅开发stm32(一)软件安装与环境配置_clion开发stm32_王拉图的博客-csdn博客

vscode-armgcc-openocd搭建stm32开发调试环境_vscode调试stm32_nick全栈之路的博客-csdn博客

mingw-w64 - for 32 and 64 bit windows - browse files at sourceforge.net

配置clion用于stm32开发【优雅の嵌入式开发】 - 知乎

vscode openocd 配置jlink 下载和调试stm32 教程 - 灰信网(软件开发博客聚合)

risc-v mcu ld链接脚本说明_at > flash_借过风景的博客-csdn博客

riscv soc开发环境 4——代码调试(openocd + gdb) - 知乎

openocd刷写flash代码结构浅析(基于riscv)_openocd源码解析_ys1115的博客-csdn博客

risc-v 调试软件 openocd 安装及配置 - risc-v技术论坛 - 电子技术论坛 - 广受欢迎的专业电子论坛!

深入浅出risc-v调试_51cto博客_深入浅出dpdk

一个超级好用的插件—eide,在vscode下快速创建arm工程_小麦大叔的博客-csdn博客

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com