你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

用 VS Code 搭建 STM32 开发环境。

[复制链接]
STMCU小助手 发布时间:2022-10-24 13:55
之前,开发单片机项目,可以说 Keil 是最佳选择之一,但VSCode横空问世之后,这种格局被打破。
# U( l/ P: J& v8 P# ]/ A5 _; |% K8 s/ _4 I
因为 VSCode 免费且好用,可以安装各种插件,很多工程师逐渐从Keil 转向了 VSCode。而且,VSCode还能实现 Keil 不能实现的一些功能。- V) r% D5 L6 `: _  H( ]

( G3 j  b+ c3 x, Z 1.png
& P; j4 p- U$ W& a$ T' C: U+ s% L& M$ u; _  `+ t9 M. E, @7 ]3 r
下面就给大家分享一下 VSCode 搭建 STM32 开发环境的一些常规且使用的功能。
/ g- q- j' W  Q. R) H! [
9 ]7 {( {! o) X
; j5 X  t7 |1 h7 k8 y- }; T
01 需要的软件和工具
$ Z% I7 |4 t$ |2 C# L( _下载最新版VS Code: 安装好插件,具有良好的代码补全与调试功能。0 N, L6 T; l; C

# T0 D0 h( @6 g# M下载 LLVM:用于代码补全,其实可以理解为 Clang。因为VS Code 中“C/C++”插件的自动补全功能不太好用。STM32中好多库函数都补全不出来。记得按照好之后,将路径添加到环境变量里。
# i7 [# s# e7 h) j2 z. {2 H1 S4 w- j5 H# ?& B' V
下载安装 Git for Windows: 提供Git支持和MINGW64指令终端。) M) O0 y- H+ V1 o! S
! N- M& h# e' R, X* z9 x
下载安装 arm-none-eabi-gcc:选择gcc-arm\-none-eabi-5\_4-2016q3-20160926-win32.exe (md5)这里是一个2016年的,我目前也是用的这个,好像还有其他的新版的下载,GNU Arm Embedded Toolchain。正常安装后,记得需要将软件的安装目录下的bin文件夹设置进入环境变量PATH中。
  {0 ^& K8 n$ \  [6 z) L9 E# M+ l4 Q! i8 T& G
下载 OpenOCD for Windows:一个开源的片上调试器(Open On-Chip Debugger)。在Windows下自己编译可能有问题 。所以,我们选择编译好的。下载后的文件不是安装包,把程序文件夹放入自己的软件安装目录下,将软件的bin文件夹路径加入用户环境变量PATH中。) @, U6 ~. @# m7 E7 y, [' h

- M0 ~$ S5 P/ P3 ~3 p) YSTM32CubeMX:用于生成带makefile的工程。这样我们就可以不用自己写MakeFile了。套用他的模板,然后修改为自己的目录就可以。% O) H% w; I1 {  t+ M  d

" y+ M6 Z0 L/ C& H- U6 o3 F02 搭建编译环境
1 O; ^2 B( v% q) O1. 用STM32Cube创建工程。
" L: [* V) K$ p& k) @. n+ GSTM32CubeMX生成的是用HAL库开发的项目,具体怎么配置这里就不介绍了,只介绍与主题有关的部分。% p+ [# [) B7 `2 K6 u: j8 V- {  t! h3 M
(1)STM32CubeMx芯片包(固件库)下载,注意事项:; p. q3 Y9 u! X& x& a
2.png : O% |8 G. m7 J0 R. V/ I

* |8 o' [% H( u5 W# O/ w需要选择help -> updater settings ->Connection Parameters设置好网络后,才能下载固件包。
8 M, U8 I1 S- V# G4 j) Z" H. E" X2 M
(2)生成工程。选择MakeFile选项。
  o5 X& ~9 B, a* k! U' O. b注意: 4.18.0以下的版本是没有Makefile这个选项的。最后下载一个中间版本,因为5.0以上的版本界面很乱。我选择的是 4.27.0.
3 l; d% v9 M/ t# }8 f
! J( d' Z' {! f2 j( r2 r, H 微信图片_20221024135356.png
1 G  Z) p+ X* h% C3 q$ H4 L
8 S# N0 U; l& `3 n5 x" K+ a
2.配置VS Code) R( q! P& D7 V
(1)打开工程所在的文件夹。在右键“用VS Code打开工程文件夹”,/ j" p# |! w' S( X. W6 \

  T( J" a3 m9 o# w5 M8 c" C4 o 微信图片_20221024135359.png
6 @# {* E6 L2 S3 O/ [

7 W& v) V9 _2 i. p0 {你将会看到这样的目录结构, s- o5 Z! s( p1 A' v. J# y  G+ {

! o6 x7 R1 \! k0 \7 ^ 微信图片_20221024135401.png
5 f. T5 u: c0 g' T" F6 x2 F

& w" W( J' G' b* S* R" D) g4 f! m.ioc文件是STM32Cube的工程文件,Inc和Src是供用户修改的源码,Driver里是STM32和ARM CMSIS的库,最好不要修改。
" k/ k& A7 Z8 k; h7 b不过,如果你要采用标准库开发的话,就修改为标准库的Driver.
6 [* f0 c( Y/ t" ^" I8 W5 J5 g(2)安装VS Code插件,需要这几样:# s" V" N" O, u1 g0 |2 A

6 q+ p4 e# r# v7 {9 w" y9 Y 微信图片_20221024135403.png
; {* R' o/ t7 S6 o2 M, k( F

6 T/ v9 [) e/ R1 f& f  q(3)配置VS Code内置终端5 n3 ?+ r5 }/ Z" h) {# y8 _; P+ [( ^
这里将我们上面安装的 Git for Windows 设置为VScode 的内置终端。
8 _- `% t  V9 O, q9 F% h8 j文件–首选项–设置,搜索terminal,设置内置终端的Shell为Bash(安装VS Code的时候它会推荐你安装Git,里面有这个Bash)。或者打开 Settings.json添加下面两句。% B! S# t; l2 _6 p3 q

; Z2 ]# g4 ^7 h2 M- E
  1. <font face="Tahoma"><font size="3"><font color="#000000">"terminal.integrated.shell.windows": "D:\\Program Files\\Git\\bin\\bash.exe",</font></font></font>2 r8 N! I. [" z4 h: |0 }
  2. <font face="Tahoma"><font size="3"><font color="#000000">"terminal.external.windowsExec": "D:\\Program Files\\Git\\bin\\bash.exe"</font></font></font>
复制代码
4 w: n- s& \" ?# n: r$ c; v8 I
然后按Ctrl+` 就可以打开终端,看到Bash了
/ M9 K8 I) [) V; w  p
. X& A, m! C( @$ z2 i 微信图片_20221024135412.png / w# i. a' w! z0 v- G( @, ~

& t1 C" k, f% l* Y  Q(4)配置智能补全、智能感知插件。
; J- f) j0 H7 L# t前面我们安装了 LLVM 用它来实现智能补全,与纠错,自然就需要一个路径去寻找这些文件。因此我们需要一个。c\_cpp\_properties.json文件的配置文件。
  P0 _3 z  r# {; ~! B我们在当前目录的.vscode文件夹下创建c\_cpp\_properties.json配置文件,用来告诉VS Code我们定义的宏与文件的路径。
2 k0 C8 o2 u$ C4 N% ~* X8 L" s# A
  1. <font face="Tahoma"><font size="3"><font color="#000000">{</font></font></font>
    + j, O( m: A( }+ n
  2. <font face="Tahoma"><font size="3"><font color="#000000">    "configurations": [</font></font></font>3 c, k: N1 u7 Y% o! P* [3 B" O
  3. <font face="Tahoma"><font size="3"><font color="#000000">        {</font></font></font>
    ' B) R; y2 w7 R+ u
  4. <font face="Tahoma"><font size="3"><font color="#000000">            "name": "Win32",</font></font></font>4 n2 Z1 V& T( D% j! ?6 {5 f
  5. <font face="Tahoma"><font size="3"><font color="#000000">            "browse": {</font></font></font>
    % w  ^" |* ?% T! i7 ]0 z& g# I
  6. <font face="Tahoma"><font size="3"><font color="#000000">                "path": [</font></font></font>2 p7 A/ w! t5 l2 R% ?7 m- [
  7. <font face="Tahoma"><font size="3"><font color="#000000">                    "${workspaceFolder}/",</font></font></font>& a0 z2 c) A& \( x2 c
  8. <font face="Tahoma"><font size="3"><font color="#000000">                    "${workspaceFolder}/Drivers/CMSIS",</font></font></font>
    0 k% C# l7 O6 H- V
  9. <font face="Tahoma"><font size="3"><font color="#000000">                    "${workspaceFolder}/Drivers/FWlib/inc",</font></font></font>9 w+ a9 K0 V5 K4 q; @
  10. <font face="Tahoma"><font size="3"><font color="#000000">                    "${workspaceFolder}/Drivers/CMSIS/startup",</font></font></font>
    ; S5 `9 k+ T, d; |
  11. <font face="Tahoma"><font size="3"><font color="#000000">                    "${workspaceFolder}/User/inc",</font></font></font>
    & e9 q" j& n/ h7 p" |
  12. <font face="Tahoma"><font size="3"><font color="#000000">                    "${workspaceFolder}/User",</font></font></font>
    8 N( q2 d) x3 a) l# P  B4 r: D
  13. <font face="Tahoma"><font size="3"><font color="#000000">                    "${workspaceFolder}/ThirdParty/crclib/include"</font></font></font>* c6 r! ~" `1 ]3 d7 Q
  14. <font face="Tahoma"><font size="3"><font color="#000000">                ],</font></font></font>
    : @9 r" f7 b; ]
  15. <font face="Tahoma"><font size="3"><font color="#000000">                "limitSymbolsToIncludedHeaders": true</font></font></font>
    8 j; F) ^3 y# c1 Z' u6 U
  16. <font face="Tahoma"><font size="3"><font color="#000000">            },</font></font></font>
    " Y; q, y$ L& U+ Y7 c5 C* g
  17. <font face="Tahoma"><font size="3"><font color="#000000">            "includePath": [</font></font></font>
    & [, _: Q  n6 X6 V, @0 Q
  18. <font face="Tahoma"><font size="3"><font color="#000000">                "${workspaceFolder}/",</font></font></font>
    2 q) P' p- ?& d5 C, F* I
  19. <font face="Tahoma"><font size="3"><font color="#000000">                "${workspaceFolder}/",</font></font></font>
    : x, J% l$ r! ^
  20. <font face="Tahoma"><font size="3"><font color="#000000">                "${workspaceFolder}/Drivers/CMSIS",</font></font></font>! x, M+ a: I9 o( P( `$ k- Z: ~
  21. <font face="Tahoma"><font size="3"><font color="#000000">                "${workspaceFolder}/Drivers/FWlib/inc",</font></font></font>
    , x* I& s' W0 l; _
  22. <font face="Tahoma"><font size="3"><font color="#000000">                "${workspaceFolder}/Drivers/CMSIS/startup",</font></font></font>4 }1 b/ g) s: P! j5 M% f
  23. <font face="Tahoma"><font size="3"><font color="#000000">                "${workspaceFolder}/User/inc",</font></font></font>4 S/ S# w; n1 f. ^2 S: U% R  Z
  24. <font face="Tahoma"><font size="3"><font color="#000000">                "${workspaceFolder}/User",</font></font></font>* l: x7 ?7 H9 ^
  25. <font face="Tahoma"><font size="3"><font color="#000000">                "${workspaceFolder}/ThirdParty/crclib/include"</font></font></font>
    5 h0 U9 y/ Y' S; u
  26. <font face="Tahoma"><font size="3"><font color="#000000">            ],</font></font></font>0 `- b! C3 K& a% j/ \* I$ v
  27. <font face="Tahoma"><font size="3"><font color="#000000">            "defines": [</font></font></font>
    1 U2 D+ e8 h4 t/ R
  28. <font face="Tahoma"><font size="3"><font color="#000000">                "_DEBUG",</font></font></font>4 V* {! Y* }5 K" _: [
  29. <font face="Tahoma"><font size="3"><font color="#000000">                "UNICODE",</font></font></font>
    . Q8 v$ v9 \. [
  30. <font face="Tahoma"><font size="3"><font color="#000000">                "_UNICODE",</font></font></font># P5 C+ V0 E( C% x
  31. <font face="Tahoma"><font size="3"><font color="#000000">                "__CC_ARM",</font></font></font>9 Y, n: A1 L; q- S' K
  32. <font face="Tahoma"><font size="3"><font color="#000000">                "USE_STDPERIPH_DRIVER",</font></font></font>
    3 c) M/ r9 n5 I4 u  d1 G& U1 e
  33. <font face="Tahoma"><font size="3"><font color="#000000">                "STM32F10X_HD"</font></font></font>; ~  A* G4 }$ M3 G9 Q  ^
  34. <font face="Tahoma"><font size="3"><font color="#000000">            ],</font></font></font>4 |" M; o. T7 q& n% h, ?
  35. <font face="Tahoma"><font size="3"><font color="#000000">            "compilerPath": "C:\\Program Files\\LLVM\\bin\\clang-format.exe",</font></font></font>9 Z. e& Z5 A9 }; o/ f1 y. Y  I; b
  36. <font face="Tahoma"><font size="3"><font color="#000000">            "cStandard": "c11",</font></font></font>0 D2 j, a" y3 V! I; F$ a( d% G# T
  37. <font face="Tahoma"><font size="3"><font color="#000000">            "cppStandard": "c++17",</font></font></font>% n. ^& i' m7 M( G! D& t
  38. <font face="Tahoma"><font size="3"><font color="#000000">            "intelliSenseMode": "clang-x64"</font></font></font>
    3 {5 c( D+ x1 S, t, j
  39. <font face="Tahoma"><font size="3"><font color="#000000">        }</font></font></font>
    % {, B/ o$ n0 j/ ~# }8 v
  40. <font face="Tahoma"><font size="3"><font color="#000000">    ],</font></font></font>/ ]2 A% y& m% c: Y
  41. <font face="Tahoma"><font size="3"><font color="#000000">    "version": 4</font></font></font>5 `' |/ L7 y% R1 a* c* @1 b3 `
  42. <font face="Tahoma"><font size="3"><font color="#000000">}</font></font></font>
复制代码

5 Y: k( N9 q+ t5 _( o注意:如果提示variable “uint32\_t” is not a type name不是一个type类型。( V6 w1 g( l! [  J
则需要 添加宏定义\_\_CC\_ARM,如果没有该宏定义,则uint32\_t类型会报错。并且结构体中使用了uint32\_t定义的成员,也会补全不了。
- d9 {( B' o3 X2 [(5)编译程序
' V( u( H- \0 K: p7 x$ ^  sgcc下编译过程如下图所示:
9 P8 X8 X. v# b6 W.c文件 经过 arm-none-eabi-gcc 编译成 .o文件/ M# h" N! w+ x7 E6 M" j# `
.s文件 经过 arm-none-eabi-as 编译成 .o文件
0 k( P' c* H$ _# u/ }  g.o文件 和 .a文件 经过 arm-none-eabi-ld 链接成 .elf文件6 n4 V  V. P0 d5 g  m- v4 n
.elf文件 经过 arm-none-eabi-objcopy 和 arm-none-eabi-objdump 转换成 hex文件/dis文件9 }0 ?4 O6 i5 e( ^
arm-none-eabi-gdb 使用 .elf文件 进行debug
: b/ h0 c0 |- c7 ]8 [* @
+ m( K% D) [* p$ n6 A0 l) o

. q, s0 ]! k, i 微信图片_20221024135416.png
3 u4 d8 }+ q' r
7 r6 n# n; L; N% q: X( f
在Terminal下输入make指令,即会开始build程序
0 _0 _/ ^( y1 l+ e! q1 }, u
& w, e. w3 X' Z
( X) v$ B% t2 p! I+ o
微信图片_20221024135423.png # Z. n  B3 n4 x+ t

; Z% t- L6 f2 }* s; @/ q) l1 `/ F编译完成后,生成的所有文件都会放在Build文件夹下.
; ?$ k+ l3 w7 C: H8 D
: a0 l" E* ]: m& ?% o& e) z* x 微信图片_20221024135425.png
2 B2 o6 E6 y: ~" n! r8 s
( R8 c; p. K3 B. ^) }! I
注意: 由于我安装了 Qt. Qt中自带了 mingw32-make.exe。我把这个文件复制了一份,重命名为make.exe。并且添加进了环境变量中。因此我可以直接使用 make。
/ M0 g, q4 y* u1 g如果你没有 make 的环境。可以下载一个choco包管理器,它类似于linux下的apt,只不过是windows下使用的。然后用choco安装make即可:6 j; L9 D# D7 D) s: U
3 B( [7 a8 j8 F3 M  n
微信图片_20221024135428.png 5 ^4 S7 g( X( D/ f6 ]8 O8 z

6 d5 ~; r* F: W: T, S如果改了source code,需要重新编译程序,那就得先执行make clean指令去删除之前build好的所有东西。然后重新执行make指令即可。/ ~: h! K! e( E' c* F' J

" r, x: u' d& _# H* h2 G

' {! d" C5 z8 ~4 `" ]2 f03 布局
/ j- W( Q7 y' ^搭建调试环境& @0 B4 }  G# i& R
1.配置openocd。% ~$ Q2 N  E5 R/ g4 E
要运行openocd这个gdb server,需要配置如下几个参数:* |7 Z# ^" W! r) b
用什么仿真器?(J-link, ST-link…)
, u  O9 w$ `0 j' n& d用什么接口?(JTAG, SWD…)
. Z! O  ?( V/ E目标芯片是什么?(STM32F4x, tm4c123g…)
* }" ?3 l' L" q+ b! Z首先我们打开openocd的安装目录,打开share/openocd/scripts,里面有很多提前写好的配置文件。
* i5 {5 \) V9 l; N4 ^
* ]* E' m: S' {2 {% b  m 微信图片_20221024135431.png 5 n0 }1 h. b) v/ ^
3 O7 ?, T% i1 h; d
target里存放目标芯片的配置文件,例如stm32f4.cfg" C& M/ n) H$ ^7 t
interface里存放仿真器相关的配置文件,例如jlink.cfg,stlink.cfg.* y1 E8 H2 |- c1 ~
当我们启动openocd时,可以用-f参数来指定一个配置文件。例如:
3 k# _/ }( i. M, }0 j
  1. openocd –f interface/stlink.cfg –f target/stm32f4.cfg
复制代码

' D/ m' A! E3 P& ~【注】配置仿真器的参数必须在配置目标MCU的参数之前,否则将报错。& c' q4 U* r- N1 D- J/ R1 U
如果我们不带参数启动,openocd就会自动查找当前目录下有没有名为openocd.cfg的文件,并把它作为配置文件来启动。因此,我们就在当前工程下创建一个名为openocd.cfg的文件。
% M4 O8 P1 m9 u5 C+ f$ a8 ^4 v, |/ @' s: E
微信图片_20221024135435.png
, l4 k: I( U8 M; x/ t! u% q  q! ?* [
我们选择使用ST-link,SWD接口,目标芯片为stm32f1x。- R) l4 J- U  P0 r) a- ^
(PS:这里注释掉了SWD接口,如果采用Jlink 则需要SWD接口)。, `7 G- k/ W/ e( w* m
这样,我们连好板子上好电,直接在终端里敲openocd,即可启动。: r9 C, o3 m4 I* Y" P. v

. G/ r2 D' W3 ]
微信图片_20221024135437.png
) b  |% D+ H' I! Y2 r0 R
/ z+ C& e- N$ x8 T* K9 n3 P# Popenocd运行时,这个shell终端就被占用了,我们一会要新开一个终端。
+ A6 C% [* K9 G8 i" ]/ H5 E' r: l% P. R) ^* I2 ^
2.用gdb连接上openocd
2 {# C) x* o4 H) h(1)直接启动gdb,参数为编译好的调试文件(.elf)
0 x* ~8 z& T& Y( H' S. D) d7 ^+ ?1 u" z/ ?5 ^- R; r6 J6 o/ t; X
微信图片_20221024135440.png
. I0 M; w8 H( N( ]6 P" A
- x& D- ]) g- Z; [(2)使gdb连接上openocd 前面已经说过openocd留给gdb的TCP/IP端口是3333,因此输入:
5 G( {; M) \' ~, F- N$ p( [
  1. target remote localhost:3333
复制代码
, O9 {8 l) }+ [
微信图片_20221024135443.png
0 P' q! D5 L$ t  j! s* F& u$ q0 e1 C0 o
注意,在连接openocd的时候,一定需要先运行 openocd 服务才能通信上,否则一直出现 taget remote 错误。
# P+ ~7 B1 n9 j  c) {4 Y% b1 O! o- `; a3 ?1 P* O
(3)下载代码.* i9 G6 f# r& J7 S
5 s0 l/ T+ U2 F, Q! u
微信图片_20221024135449.png
$ P0 m) i# d  ^# B7 T' H) b

9 U. z; }. L- p) B  ]后面就和普通的gdb一样操作了,加断点,单步运行什么的,网上可以搜到很多教程。
) r% g0 S  k- |5 k+ k  A1 d【注】 最后记得输入q来退出gdb,以免影响后面的配置。! ]6 r; a+ g+ e  R) q: h3 h

" I$ W/ i* k5 ~
3.配置openocd任务与build任务# C% [. b/ B2 w8 ?0 O, T- G+ N% S5 N
为了避免每次都在终端输入 make 和 make clean ,与 openocd 。我们可以在VSCode 中,建立一个 Task 来帮我们完成这个任务,
" @, T% D3 q% q' R' N(1)在当前目录下创建build.py的文件。
& f4 V/ y3 o1 g8 |+ B2 C0 _& I6 T( s8 W4 @, O
微信图片_20221024135452.png & |7 r' r2 R$ Y% V4 }6 k
4 Q1 R, H( a5 D$ F, S6 w
(2)在VSCode界面下,单击“任务”,选择“配置任务”
& l7 J- z$ [& _7 D( \( Y; D0 m按 F1,选择"配置任务" .vscode目录下就会创建一个tasks.json配置文件.
2 D/ P- e+ o: F0 m
- ^, \0 S9 R0 `& U
微信图片_20221024135454.png : E% T/ L/ U" {/ H4 O( F
4 F1 J" I  j! {$ }
1 T4 W+ t9 e% j7 K/ [8 i1 |
打开 tasks.json ,修改内容如下:# a  s5 y  q5 l/ s
$ `- R( Q4 p/ G  j1 X* T$ J' I
微信图片_20221024135457.png
) {$ ^  U7 ]3 f/ W& d7 [3 }! I; X
$ Y! J5 T6 S; Y7 S/ `
注意上面是两个任务,一个是openocd.用于连接st-link调试。一个是 build 用于编译。
$ u9 m/ w1 x* M: f3 O4 ~* n) \# P它相当于是创建了一个名为build的任务,任务的内容是在shell里面执行 python build.py这个命令。只是不用我们手动输入而已。8 W+ A& }: E; W+ i

) S" o- z, f; B6 K6 C( a9 H
4.配置VS Code的调试功能- s) R% U- D* Z0 X, m0 N7 D
使用VS Code,肯定是图方便,图好看。所以我肯定不会让大家靠敲命令来调试,这样岂不是开倒车,还不如用keil。因此,这里要配置VS Code的调试功能,相当于对gdb的一个图形化吧。! ~6 M- f' C; D/ c3 f
在VS Code内选择debug(就是左边那个虫子图标),选择“添加配置”,类型为GDB。就会在.vscode文件夹下生成launch.json配置文件。
( t" s& x& b3 z; j: l; m0 Y按照下面来配置:8 Q" |9 d# T/ D3 j4 _
  1. <font face="Tahoma"><font size="3"><font color="#000000">{</font></font></font>( m9 i' h# `7 e* ~: {
  2. <font face="Tahoma"><font size="3"><font color="#000000">    "version": "0.2.0",</font></font></font>
    % _8 U3 B- ?8 B) L
  3. <font face="Tahoma"><font size="3"><font color="#000000">    "configurations": [</font></font></font>
    7 W* j* s  K# w
  4. <font face="Tahoma"><font size="3"><font color="#000000">! `9 r- X' x# `. Q# n1 |* E
  5. </font></font></font>
    8 ]  o2 `& ~. i, g9 g7 r
  6. <font face="Tahoma"><font size="3"><font color="#000000">        {</font></font></font>, d& b$ ^5 J8 s2 m# Z* d: ?5 A
  7. <font face="Tahoma"><font size="3"><font color="#000000">            "name": "ARM Debug",</font></font></font>$ Q8 A6 `! s: D* Q7 S8 H
  8. <font face="Tahoma"><font size="3"><font color="#000000">            "type": "cppdbg",</font></font></font>
    0 {+ Q/ X2 T6 y" a0 J  ?: k! C% J
  9. <font face="Tahoma"><font size="3"><font color="#000000">            "request": "launch",</font></font></font>
    . [, c, V9 E# X% P
  10. <font face="Tahoma"><font size="3"><font color="#000000">            "program": "${workspaceFolder}/Build/STM32F103RC_Template.elf",</font></font></font>) R5 K( h4 E6 ?% R, Q; K4 p, d
  11. <font face="Tahoma"><font size="3"><font color="#000000">            "args": [],</font></font></font>
    ) d: t% N) ~. }' l' ~0 _
  12. <font face="Tahoma"><font size="3"><font color="#000000">            "stopAtEntry": false,</font></font></font>6 Q4 q2 x2 T0 I. [$ D
  13. <font face="Tahoma"><font size="3"><font color="#000000">            "cwd": "${workspaceFolder}",</font></font></font>
    3 I" a( `4 `& c
  14. <font face="Tahoma"><font size="3"><font color="#000000">            "environment": [],</font></font></font>
    $ [- p- h, ]; Q2 o: I
  15. <font face="Tahoma"><font size="3"><font color="#000000">            "externalConsole": false, </font></font></font>7 }; c0 `- e$ u+ H: q# M
  16. <font face="Tahoma"><font size="3"><font color="#000000">            "MIMode": "gdb",</font></font></font>
    ( I1 }' F5 [# L6 R( ]
  17. <font face="Tahoma"><font size="3"><font color="#000000">            "miDebuggerPath": "C:\\Program Files (x86)\\GNU Tools ARM Embedded\\5.4 2016q3\\bin\\arm-none-eabi-gdb.exe",</font></font></font>6 c- l; G5 G. Y0 x2 i0 H& e
  18. <font face="Tahoma"><font size="3"><font color="#000000">            "targetArchitecture": "arm", </font></font></font>
    & g6 o1 y9 A4 r, Q7 l, b
  19. <font face="Tahoma"><font size="3"><font color="#000000">            "setupCommands": [</font></font></font>7 O' H1 T$ Y4 |! N' F
  20. <font face="Tahoma"><font size="3"><font color="#000000">                {</font></font></font>* e7 k& m* x' A5 u/ x
  21. <font face="Tahoma"><font size="3"><font color="#000000">                    "description": "选择调试文件(.elf)到gdb",</font></font></font>7 I1 Z) X) o0 l/ Z# B+ o5 M; E* A
  22. <font face="Tahoma"><font size="3"><font color="#000000">                    "text": "file E:/VScode/STM32_VSCode/stm32f103_temp/Build/STM32F103RC_Template.elf",</font></font></font>
    : B0 i7 q  b% d( b/ x3 U6 T
  23. <font face="Tahoma"><font size="3"><font color="#000000">                    "ignoreFailures": false</font></font></font>1 D+ l' p8 E0 {& m
  24. <font face="Tahoma"><font size="3"><font color="#000000">                },</font></font></font>
    6 n, N. b# z  T
  25. <font face="Tahoma"><font size="3"><font color="#000000">                {</font></font></font>
    2 [! O3 P0 O/ x: H
  26. <font face="Tahoma"><font size="3"><font color="#000000">                    "description": "连接GDB Server",</font></font></font>
    9 I4 G& R0 M, j3 d$ J; d
  27. <font face="Tahoma"><font size="3"><font color="#000000">                    "text": "target remote localhost:3333",                                 </font></font></font>" [+ E) s& m7 }8 Z) t' p) x. s
  28. <font face="Tahoma"><font size="3"><font color="#000000">                    "ignoreFailures": false</font></font></font>& M4 s3 a' N. x5 r
  29. <font face="Tahoma"><font size="3"><font color="#000000">                },</font></font></font>9 F$ M0 @7 g3 d/ G
  30. <font face="Tahoma"><font size="3"><font color="#000000">                {</font></font></font>
    # C' @/ c# ^" \8 b; J. L
  31. <font face="Tahoma"><font size="3"><font color="#000000">                    "description": "Reset MCU",</font></font></font>
    5 F, K1 X5 h' @3 A
  32. <font face="Tahoma"><font size="3"><font color="#000000">                    "text": "monitor reset",                                              </font></font></font>
    ; ]* T/ |; Y3 y) p5 N5 F" b
  33. <font face="Tahoma"><font size="3"><font color="#000000">                    "ignoreFailures": false</font></font></font>
    7 `7 E& I, J  h5 `# q2 Z
  34. <font face="Tahoma"><font size="3"><font color="#000000">                },</font></font></font>
    $ Q- V4 o) U3 n  s6 J" o# o
  35. <font face="Tahoma"><font size="3"><font color="#000000">                {</font></font></font>
    ; x) N' C  ^/ J4 y1 j- \% n  R, f
  36. <font face="Tahoma"><font size="3"><font color="#000000">                    "description": "Halt",</font></font></font># ?6 u# g% s' H! u) x
  37. <font face="Tahoma"><font size="3"><font color="#000000">                    "text": "monitor halt",                                                  </font></font></font>. W) z. x( f3 c5 o
  38. <font face="Tahoma"><font size="3"><font color="#000000">                    "ignoreFailures": false</font></font></font>% O- H0 b+ M  K1 g  ^9 n
  39. <font face="Tahoma"><font size="3"><font color="#000000">                },</font></font></font>3 B' x! o( ~7 M+ J# P1 b! W* i( Z
  40. <font face="Tahoma"><font size="3"><font color="#000000">                {</font></font></font>3 o/ a7 `+ v3 B7 y% }  R
  41. <font face="Tahoma"><font size="3"><font color="#000000">                    "description":"下载代码到MCU",</font></font></font>
    " q4 H1 t) ]' y7 U+ i  A
  42. <font face="Tahoma"><font size="3"><font color="#000000">                    "text": "load" ,              </font></font></font>% D9 h' g  ~, M9 K
  43. <font face="Tahoma"><font size="3"><font color="#000000">                    "ignoreFailures": false                                      </font></font></font>5 T; v- A$ F4 M) O+ r# d8 R2 i
  44. <font face="Tahoma"><font size="3"><font color="#000000">                }</font></font></font>
    6 G% e+ p7 Y$ {. \; i/ ~
  45. <font face="Tahoma"><font size="3"><font color="#000000">            ],</font></font></font>, }3 f+ c, Y) M- r
  46. <font face="Tahoma"><font size="3"><font color="#000000">            "preLaunchTask": "build", </font></font></font>; o( H: Q: O; j
  47. <font face="Tahoma"><font size="3"><font color="#000000">        }</font></font></font>
    ; ~" J" ]$ b- a' y
  48. $ ~# m5 s" L) T# W! m8 t: a/ T
  49. <font face="Tahoma"><font size="3"><font color="#000000">}</font></font></font>
复制代码
  p4 g0 T% U/ M( L: ?! Q1 X
可以看到,setupCommands里面就是我们之前试用gdb时操作过的流程:连接GDB Server——reset——halt——下载代码。# t# |! M- Q3 N

- p+ g" I/ s: S1 c5 z2 h- m
而preLaunchTask中是我们之前在tasks.json中配置的build任务。它可以让我们每次调试时都先编译一遍。
! K- C% N5 X8 X( y$ \  h7 {保存后,随便打几个断点,按下F5,就可以快乐调试了。可以看到功能还是很齐全的。9 i  w/ F/ G4 X' B

- f8 [7 R# N. M" w 微信图片_20221024135502.png
+ K# U7 M( z; K; P1 J6 {0 d1 b

$ f$ G, D: N" [0 j2 L【注意】:在进行调试的时候,需要先 按 F1 --> 任务:运行任务里选择 openocd 任务运行。9 u) o2 F" O# Q, x
3 |9 u( E( }* V3 `
微信图片_20221024135505.png - S5 ^0 v: v% N4 X3 x% z' U

7 |$ r% p6 J: }因为调试,需要连接st-link进行调试,而openocd任务是开启st-link的服务。这样客户端才能连接上。7 k/ v1 s, V& f2 v" Z

  m6 Q8 V) u! _% ~) Y' K否则会一直出现 target remote localhost:3333 的错误。& P/ w0 X5 U* [7 x
% Y2 D9 G2 f% l# j" S
看到这里,基本就差不多了,开发STM32完全没问题了。
1 W$ s/ L2 _# z- d! d
( |! i9 p0 a7 ^+ y9 h! @

, ~% K, U: W9 D! I转载自:大鱼机器人& ~6 o, `! ?( l

% M# Z* A/ j5 p4 H! M( m. J$ [2 D# {: j& V
微信图片_20221024135406.png
赞 收藏 评论0 发布时间:2022-10-24 13:55

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版