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

用 VS Code 搭建 STM32 开发环境。

[复制链接]
STMCU小助手 发布时间:2022-10-24 13:55
之前,开发单片机项目,可以说 Keil 是最佳选择之一,但VSCode横空问世之后,这种格局被打破。
$ {' n9 \; |& E# J$ D9 r" ^5 H& p' W
因为 VSCode 免费且好用,可以安装各种插件,很多工程师逐渐从Keil 转向了 VSCode。而且,VSCode还能实现 Keil 不能实现的一些功能。: ]) L) Y! q" u# P6 V- T% S
6 }9 m5 L' U) V; [- {: x2 }, B
1.png ; U8 _+ y# _# g# I# X* h. X. R
  ^+ z9 L6 f- l- p9 s& s$ q2 q3 }
下面就给大家分享一下 VSCode 搭建 STM32 开发环境的一些常规且使用的功能。
% U' }7 M2 C2 G0 Z8 P
6 k3 M  b3 \( E& d; }/ T6 \
7 m: D0 v6 R$ O, J2 B, Z# Q
01 需要的软件和工具
2 y, n/ ~. F; Q5 \! D- M! l下载最新版VS Code: 安装好插件,具有良好的代码补全与调试功能。
- {  g$ E+ p  ?5 P8 v9 D% r3 D5 ]. g, W5 m
下载 LLVM:用于代码补全,其实可以理解为 Clang。因为VS Code 中“C/C++”插件的自动补全功能不太好用。STM32中好多库函数都补全不出来。记得按照好之后,将路径添加到环境变量里。1 C! W- b$ h7 R7 E: r+ S

7 d- I- a4 Q! @下载安装 Git for Windows: 提供Git支持和MINGW64指令终端。
& o2 I: D% M0 w8 k, G2 C% j, ^
( O% f' X- j$ Q. |: F( i; ~下载安装 arm-none-eabi-gcc:选择gcc-arm\-none-eabi-5\_4-2016q3-20160926-win32.exe (md5)这里是一个2016年的,我目前也是用的这个,好像还有其他的新版的下载,GNU Arm Embedded Toolchain。正常安装后,记得需要将软件的安装目录下的bin文件夹设置进入环境变量PATH中。
* m* H1 C; C$ D/ V# s# M3 K- V. A
8 u+ {. C" K8 }2 u3 M5 s7 f- H下载 OpenOCD for Windows:一个开源的片上调试器(Open On-Chip Debugger)。在Windows下自己编译可能有问题 。所以,我们选择编译好的。下载后的文件不是安装包,把程序文件夹放入自己的软件安装目录下,将软件的bin文件夹路径加入用户环境变量PATH中。  d1 N) K$ e  @3 e& O
/ }# |7 J' T& B1 h' F' ]0 t. S
STM32CubeMX:用于生成带makefile的工程。这样我们就可以不用自己写MakeFile了。套用他的模板,然后修改为自己的目录就可以。; y+ t& x9 D2 F' b( N0 i
- q" v$ P- n( x7 C  o
02 搭建编译环境
. K( |+ j" u; r4 d8 }" `% k1. 用STM32Cube创建工程。% q6 [$ N5 G0 L
STM32CubeMX生成的是用HAL库开发的项目,具体怎么配置这里就不介绍了,只介绍与主题有关的部分。6 n$ a! g5 M; w7 x& i- d
(1)STM32CubeMx芯片包(固件库)下载,注意事项:; [4 B1 g4 ~/ @  s! b! P
2.png
* @# K( T3 o! y& U/ v2 ^
% \6 _  a% R6 Z( N* c需要选择help -> updater settings ->Connection Parameters设置好网络后,才能下载固件包。. M" i8 |* c! k% O) ?* G5 h# d
) b1 ~$ O3 J1 f3 h6 e! _' s* Z
(2)生成工程。选择MakeFile选项。
9 x% G7 v2 y( W% K$ Q* b7 `注意: 4.18.0以下的版本是没有Makefile这个选项的。最后下载一个中间版本,因为5.0以上的版本界面很乱。我选择的是 4.27.0." C, h. \( Z9 @$ w2 y( I( Q5 B
$ p! L" ^* |3 w/ i" e' d" ^! p0 b
微信图片_20221024135356.png
  u: u' G+ N2 ?+ [% J7 {
: D7 F* T. _' `
2.配置VS Code+ g0 D6 M2 E( E; ]1 O# D
(1)打开工程所在的文件夹。在右键“用VS Code打开工程文件夹”,
6 U- |$ }5 `2 T& }- Q+ \  f, M+ P' p% z2 q: s1 V/ P0 D" i4 |5 M
微信图片_20221024135359.png
6 M8 D% r4 B9 P0 [

7 S) n5 ~8 [( O! c: k4 s8 M你将会看到这样的目录结构
8 Z& R! g8 {7 {) L% b' {: I; X  q. j) E
微信图片_20221024135401.png
7 `: m2 x% r/ R' |

3 n4 v7 F! p( B/ r3 o4 o$ ?1 S' O.ioc文件是STM32Cube的工程文件,Inc和Src是供用户修改的源码,Driver里是STM32和ARM CMSIS的库,最好不要修改。
, T% G( M% F; H# O不过,如果你要采用标准库开发的话,就修改为标准库的Driver.
7 S5 I: `! G% r2 [) M(2)安装VS Code插件,需要这几样:
' Z9 }1 \6 P" L3 x& I8 ]
$ B- [# F9 I1 ?+ f! K8 A& A 微信图片_20221024135403.png $ G' a3 {6 @; I  S! f# {: W- v- E: n
2 v7 v/ Q; s) n/ Y
(3)配置VS Code内置终端2 t8 O% E( m7 l# F* Y
这里将我们上面安装的 Git for Windows 设置为VScode 的内置终端。
; z4 Y$ X* ]9 W* m# M' R+ Y& Q# }% Q/ B文件–首选项–设置,搜索terminal,设置内置终端的Shell为Bash(安装VS Code的时候它会推荐你安装Git,里面有这个Bash)。或者打开 Settings.json添加下面两句。
4 U0 }/ E; K9 J+ s5 G
. I$ D* G: M# e1 a! d" g5 j
  1. <font face="Tahoma"><font size="3"><font color="#000000">"terminal.integrated.shell.windows": "D:\\Program Files\\Git\\bin\\bash.exe",</font></font></font>3 q. F- e3 d: S# i8 d% r% T/ D
  2. <font face="Tahoma"><font size="3"><font color="#000000">"terminal.external.windowsExec": "D:\\Program Files\\Git\\bin\\bash.exe"</font></font></font>
复制代码
" `* }: S# c; f$ t
然后按Ctrl+` 就可以打开终端,看到Bash了
. J* ~' W: m4 h8 L6 ^6 W( p$ I9 v$ G$ ]8 e) m
微信图片_20221024135412.png
: f% Q" Z/ A) X2 S% m1 k* Q9 ]' |
( M. @4 i3 V, l2 q  v9 R  t+ K" b
(4)配置智能补全、智能感知插件。, [) f! ^( M8 x( G2 P
前面我们安装了 LLVM 用它来实现智能补全,与纠错,自然就需要一个路径去寻找这些文件。因此我们需要一个。c\_cpp\_properties.json文件的配置文件。8 y+ c- F7 d* o9 `
我们在当前目录的.vscode文件夹下创建c\_cpp\_properties.json配置文件,用来告诉VS Code我们定义的宏与文件的路径。( Z) ~' t& v) e! E/ k5 Z
  1. <font face="Tahoma"><font size="3"><font color="#000000">{</font></font></font>& \  n3 ^$ h4 r
  2. <font face="Tahoma"><font size="3"><font color="#000000">    "configurations": [</font></font></font>; r$ B9 C( k* o/ f, _
  3. <font face="Tahoma"><font size="3"><font color="#000000">        {</font></font></font>
    : s2 b& A4 Y* k6 l; W" E' M
  4. <font face="Tahoma"><font size="3"><font color="#000000">            "name": "Win32",</font></font></font>
    0 i; b& _7 J1 y# j* h5 D
  5. <font face="Tahoma"><font size="3"><font color="#000000">            "browse": {</font></font></font>& w/ @" \) ^7 B  J. h" Y9 m. r/ J
  6. <font face="Tahoma"><font size="3"><font color="#000000">                "path": [</font></font></font>
    2 L4 w( B8 n  m1 W3 r# _
  7. <font face="Tahoma"><font size="3"><font color="#000000">                    "${workspaceFolder}/",</font></font></font>. [5 V6 i3 ~# f! C# I3 P  }' i
  8. <font face="Tahoma"><font size="3"><font color="#000000">                    "${workspaceFolder}/Drivers/CMSIS",</font></font></font>
    ! _9 r  S8 b# k; Y- F4 q# P& ~
  9. <font face="Tahoma"><font size="3"><font color="#000000">                    "${workspaceFolder}/Drivers/FWlib/inc",</font></font></font>* j8 x3 c! y' Q
  10. <font face="Tahoma"><font size="3"><font color="#000000">                    "${workspaceFolder}/Drivers/CMSIS/startup",</font></font></font>
    8 N. e" ?, k- ~7 W" @& I: G
  11. <font face="Tahoma"><font size="3"><font color="#000000">                    "${workspaceFolder}/User/inc",</font></font></font>. Q7 p7 G$ G, Z$ {' m5 v
  12. <font face="Tahoma"><font size="3"><font color="#000000">                    "${workspaceFolder}/User",</font></font></font>- N# \/ l( D  m* V: B; m: h' E2 P
  13. <font face="Tahoma"><font size="3"><font color="#000000">                    "${workspaceFolder}/ThirdParty/crclib/include"</font></font></font>
    # w- j8 M6 p. Q9 |8 o1 n8 M. i
  14. <font face="Tahoma"><font size="3"><font color="#000000">                ],</font></font></font>) @. D5 j0 k: E8 b
  15. <font face="Tahoma"><font size="3"><font color="#000000">                "limitSymbolsToIncludedHeaders": true</font></font></font>
      o; W9 l* @+ f+ ^2 i
  16. <font face="Tahoma"><font size="3"><font color="#000000">            },</font></font></font>
    % c- o% I8 c; I  g, h/ L2 ~+ w6 E
  17. <font face="Tahoma"><font size="3"><font color="#000000">            "includePath": [</font></font></font>4 }* v' f% f$ J) U: G+ L
  18. <font face="Tahoma"><font size="3"><font color="#000000">                "${workspaceFolder}/",</font></font></font>
    7 V3 j7 P1 y4 s
  19. <font face="Tahoma"><font size="3"><font color="#000000">                "${workspaceFolder}/",</font></font></font>
      M5 i6 H! w0 v4 D$ y/ v( e0 Q# \. [
  20. <font face="Tahoma"><font size="3"><font color="#000000">                "${workspaceFolder}/Drivers/CMSIS",</font></font></font>) g: X/ i$ R& _3 p
  21. <font face="Tahoma"><font size="3"><font color="#000000">                "${workspaceFolder}/Drivers/FWlib/inc",</font></font></font>
    ! U2 O* W  f1 |$ S+ R1 q% O
  22. <font face="Tahoma"><font size="3"><font color="#000000">                "${workspaceFolder}/Drivers/CMSIS/startup",</font></font></font>+ D9 {& I: U( s$ f+ x# u  \
  23. <font face="Tahoma"><font size="3"><font color="#000000">                "${workspaceFolder}/User/inc",</font></font></font>
    . `( b& B6 |  n* j
  24. <font face="Tahoma"><font size="3"><font color="#000000">                "${workspaceFolder}/User",</font></font></font>- K/ ^) Y- E- |
  25. <font face="Tahoma"><font size="3"><font color="#000000">                "${workspaceFolder}/ThirdParty/crclib/include"</font></font></font>+ @; V! e% _5 N+ l/ a
  26. <font face="Tahoma"><font size="3"><font color="#000000">            ],</font></font></font>
    3 R" l1 I; |) p* ]+ h( F
  27. <font face="Tahoma"><font size="3"><font color="#000000">            "defines": [</font></font></font>9 X) `' d3 j+ Q5 P
  28. <font face="Tahoma"><font size="3"><font color="#000000">                "_DEBUG",</font></font></font>
    ! s, j/ s1 j3 F0 H* n/ y3 D
  29. <font face="Tahoma"><font size="3"><font color="#000000">                "UNICODE",</font></font></font>
    " Y, n" ^5 m) A* \9 Q4 }
  30. <font face="Tahoma"><font size="3"><font color="#000000">                "_UNICODE",</font></font></font>
    * t, G2 g; g  }5 O  Y
  31. <font face="Tahoma"><font size="3"><font color="#000000">                "__CC_ARM",</font></font></font>
    ; c* h% c/ N) Y! ?
  32. <font face="Tahoma"><font size="3"><font color="#000000">                "USE_STDPERIPH_DRIVER",</font></font></font>
    + m" R+ f. h6 T3 ?+ Z5 k% b. [
  33. <font face="Tahoma"><font size="3"><font color="#000000">                "STM32F10X_HD"</font></font></font>- Y, R: |/ b  a8 x' i( }* r
  34. <font face="Tahoma"><font size="3"><font color="#000000">            ],</font></font></font>' _) m# M1 Y1 `) S
  35. <font face="Tahoma"><font size="3"><font color="#000000">            "compilerPath": "C:\\Program Files\\LLVM\\bin\\clang-format.exe",</font></font></font>
    ; \2 O8 P5 E8 s, s
  36. <font face="Tahoma"><font size="3"><font color="#000000">            "cStandard": "c11",</font></font></font>
      `" Z* U5 L2 X2 c
  37. <font face="Tahoma"><font size="3"><font color="#000000">            "cppStandard": "c++17",</font></font></font>! _; ?" D4 \+ |( K0 y
  38. <font face="Tahoma"><font size="3"><font color="#000000">            "intelliSenseMode": "clang-x64"</font></font></font>7 h+ ~' l" U. \7 B( J) p2 e
  39. <font face="Tahoma"><font size="3"><font color="#000000">        }</font></font></font>
    & o2 t* y9 X$ |6 L, l5 G8 O. V2 h
  40. <font face="Tahoma"><font size="3"><font color="#000000">    ],</font></font></font>
    4 j  n! _; _5 I0 |2 A2 K4 R
  41. <font face="Tahoma"><font size="3"><font color="#000000">    "version": 4</font></font></font>6 ?' m4 r+ l2 s1 A
  42. <font face="Tahoma"><font size="3"><font color="#000000">}</font></font></font>
复制代码

" y9 w5 f9 b1 i( S* B注意:如果提示variable “uint32\_t” is not a type name不是一个type类型。; C  K9 u" e+ r8 R3 B$ F( u& D
则需要 添加宏定义\_\_CC\_ARM,如果没有该宏定义,则uint32\_t类型会报错。并且结构体中使用了uint32\_t定义的成员,也会补全不了。
% m& ?% r- i2 L7 Z8 o(5)编译程序8 u% ~8 }/ m) x& `# C
gcc下编译过程如下图所示:  |$ f9 V* q/ r. p* m# V; H
.c文件 经过 arm-none-eabi-gcc 编译成 .o文件* J3 F$ b8 J+ ]9 A# v
.s文件 经过 arm-none-eabi-as 编译成 .o文件
  g( z4 @) P. ^$ _: g7 n.o文件 和 .a文件 经过 arm-none-eabi-ld 链接成 .elf文件& q% w$ q1 F) m/ q& A4 m
.elf文件 经过 arm-none-eabi-objcopy 和 arm-none-eabi-objdump 转换成 hex文件/dis文件; J7 l1 _( R* r
arm-none-eabi-gdb 使用 .elf文件 进行debug
# _. K) W6 M4 f" z+ Q$ m0 t. H
3 v+ W% C( u8 S8 ^- E* N  e4 `
2 Z2 \+ a1 A; B2 D2 D1 I
微信图片_20221024135416.png
& {; ?; q: Q, M

+ I$ @$ l3 Q6 w8 ~' K7 }+ Z- W在Terminal下输入make指令,即会开始build程序: V, V2 I6 _! _. m  o/ N- Y. [

: L8 J0 J6 X: C

5 `7 f: v2 x( B( r 微信图片_20221024135423.png ( K/ ~8 D- o( v# f
! h+ g9 t: W1 W5 T
编译完成后,生成的所有文件都会放在Build文件夹下.
- |/ Q. L- R  O4 B/ ^, z; k3 I5 \+ T$ q* g9 [* ~
微信图片_20221024135425.png : H, V0 K6 u& X/ {8 i5 K# [
( T" |% [2 S. v2 D
注意: 由于我安装了 Qt. Qt中自带了 mingw32-make.exe。我把这个文件复制了一份,重命名为make.exe。并且添加进了环境变量中。因此我可以直接使用 make。* A0 R+ p- a8 Y) T# T6 l" g
如果你没有 make 的环境。可以下载一个choco包管理器,它类似于linux下的apt,只不过是windows下使用的。然后用choco安装make即可:" i6 U+ g( w6 C- d: |& ?  Z
& t7 J3 S: \2 j( x5 W8 y
微信图片_20221024135428.png ; ]/ C$ w) l  W, ^

- V/ t  `8 ?' @如果改了source code,需要重新编译程序,那就得先执行make clean指令去删除之前build好的所有东西。然后重新执行make指令即可。, I/ V7 V4 b6 d/ H3 B& F6 ^, q

; n4 |5 Q) K- X$ p

6 M' W% S4 ]$ D# R, G/ l& T03 布局# S3 `' ~6 x9 o0 A! z
搭建调试环境) W2 x$ J  M' ~7 Y: C& K
1.配置openocd。
! `) ]/ j3 W! z- Z( @! e5 g要运行openocd这个gdb server,需要配置如下几个参数:
- r$ q( y9 H( s8 ~用什么仿真器?(J-link, ST-link…)
1 |0 y/ ]# |, j8 B( V用什么接口?(JTAG, SWD…)
, i4 B: K5 w$ x4 m目标芯片是什么?(STM32F4x, tm4c123g…)$ {9 r7 L/ T" \# b9 A6 v. K: b
首先我们打开openocd的安装目录,打开share/openocd/scripts,里面有很多提前写好的配置文件。
1 w; S+ q! D9 v8 W0 M$ b1 ?  W) I  A( U  w
微信图片_20221024135431.png
3 v$ w- }/ x! h

0 a" q! q6 k4 m7 M: i# ytarget里存放目标芯片的配置文件,例如stm32f4.cfg9 u( x4 ]) j' Y- p7 X7 Q. K# Z
interface里存放仿真器相关的配置文件,例如jlink.cfg,stlink.cfg.  c3 b; T0 G2 {. a( {4 n+ {/ r5 }
当我们启动openocd时,可以用-f参数来指定一个配置文件。例如:" `; [  Q4 k% ~% I5 j
  1. openocd –f interface/stlink.cfg –f target/stm32f4.cfg
复制代码

+ Y) w4 L+ G6 @- k7 }【注】配置仿真器的参数必须在配置目标MCU的参数之前,否则将报错。
: S. _8 y/ c7 W' G6 N! S2 X- \如果我们不带参数启动,openocd就会自动查找当前目录下有没有名为openocd.cfg的文件,并把它作为配置文件来启动。因此,我们就在当前工程下创建一个名为openocd.cfg的文件。/ [9 w: ?6 d" E
7 n8 [4 _7 M  w* A# x' f
微信图片_20221024135435.png
% n- X! x+ f& m" z: T- C. t  Z4 M& C' R9 Y& x6 r" X/ d1 p
我们选择使用ST-link,SWD接口,目标芯片为stm32f1x。, K; F  G- o0 V
(PS:这里注释掉了SWD接口,如果采用Jlink 则需要SWD接口)。
* s4 n8 K7 A. b$ m$ g: b  S8 P这样,我们连好板子上好电,直接在终端里敲openocd,即可启动。: t$ _2 X) k2 c
' J3 E/ Q9 _5 C1 f& T. M" l
微信图片_20221024135437.png
; I0 m% z$ t( x& ]2 P1 o1 Z$ _, r' m9 z* |6 n
openocd运行时,这个shell终端就被占用了,我们一会要新开一个终端。
7 j% t4 o( p# f1 @+ s+ A; |0 l7 ^8 \7 t
2.用gdb连接上openocd' |  e4 W' j: e" n
(1)直接启动gdb,参数为编译好的调试文件(.elf)
: B. \7 h  z9 x9 I! r- r
0 x8 @- |" M4 e" v, e$ ~4 c; P8 y7 ?
微信图片_20221024135440.png # @( q1 Y6 G0 X% v4 g+ u

- }, u* h7 X! n, j/ |(2)使gdb连接上openocd 前面已经说过openocd留给gdb的TCP/IP端口是3333,因此输入:$ S$ |' P( U( z2 {5 r: ?3 f1 D1 l: A, ?
  1. target remote localhost:3333
复制代码
( l  ]3 z% h3 O% ~' q) t$ m  }
微信图片_20221024135443.png
6 O5 _1 M% [7 ]/ P0 _6 V
& F' @9 C6 Q* U$ V注意,在连接openocd的时候,一定需要先运行 openocd 服务才能通信上,否则一直出现 taget remote 错误。3 S8 ^3 f4 P$ w6 {- v
/ F( H; c( h" s# A; v
(3)下载代码.0 c! z% X* d$ i1 u9 ?8 {' l
) C8 }! H( [# q: r; e/ V
微信图片_20221024135449.png 6 H1 d/ I& n) B( q+ }$ Z1 N
  ^" _) h# h7 W" ]7 b) i
后面就和普通的gdb一样操作了,加断点,单步运行什么的,网上可以搜到很多教程。
1 k+ E! N" w9 D+ M2 N. P【注】 最后记得输入q来退出gdb,以免影响后面的配置。
5 |( K8 Y$ [9 h' U% ^& {
3 M6 r, ~5 {* S$ X) o+ U3 a
3.配置openocd任务与build任务/ U, r& j: Q3 r1 q8 t+ f
为了避免每次都在终端输入 make 和 make clean ,与 openocd 。我们可以在VSCode 中,建立一个 Task 来帮我们完成这个任务,  D- ~/ q5 \2 o3 ~! |0 t
(1)在当前目录下创建build.py的文件。; ?* t4 c% _  @, H  w1 W  `

. `# m: w# m7 _+ f$ `0 @
微信图片_20221024135452.png
: q5 f& F" a$ i& w; a
( l- y2 m0 A) `8 \  P0 f, R(2)在VSCode界面下,单击“任务”,选择“配置任务”
1 J8 |* `  |  `; r, M8 {0 [按 F1,选择"配置任务" .vscode目录下就会创建一个tasks.json配置文件.
' x' N# Q. s# f. Y) h
2 j: a9 C0 h$ V! x
微信图片_20221024135454.png
) Y6 w8 N: u1 E7 h2 _' n. G5 \; Z3 q: h1 }5 r2 I: P% R% U

  S; k0 O& ^( P/ L打开 tasks.json ,修改内容如下:# d' n& ?; l) Z) L% W) u

* O/ K% R5 W4 Y8 r 微信图片_20221024135457.png 6 i9 [7 w( k& w: A

( }- v' P& Z2 s! I* F* ?注意上面是两个任务,一个是openocd.用于连接st-link调试。一个是 build 用于编译。
/ r' p7 ?' G& E9 }8 ]4 a  r它相当于是创建了一个名为build的任务,任务的内容是在shell里面执行 python build.py这个命令。只是不用我们手动输入而已。) H1 \& l' R* h! Q, }8 U; c
0 M* M$ c$ \% q0 N& \3 C6 J6 O; H" s: F3 y
4.配置VS Code的调试功能
$ x; ]" e! y; Q2 b1 y( }使用VS Code,肯定是图方便,图好看。所以我肯定不会让大家靠敲命令来调试,这样岂不是开倒车,还不如用keil。因此,这里要配置VS Code的调试功能,相当于对gdb的一个图形化吧。
! l2 w: Y- D( N8 M% Q在VS Code内选择debug(就是左边那个虫子图标),选择“添加配置”,类型为GDB。就会在.vscode文件夹下生成launch.json配置文件。
% O; u) y  [! H; G7 a按照下面来配置:
5 x6 d+ K0 N, ]
  1. <font face="Tahoma"><font size="3"><font color="#000000">{</font></font></font>& h  e3 w" O8 F
  2. <font face="Tahoma"><font size="3"><font color="#000000">    "version": "0.2.0",</font></font></font>- \. Y* U8 E- N$ b
  3. <font face="Tahoma"><font size="3"><font color="#000000">    "configurations": [</font></font></font>
    5 C7 p# m0 e; d/ U3 D
  4. <font face="Tahoma"><font size="3"><font color="#000000">- u+ p5 t! x! @, O5 Z
  5. </font></font></font>7 G/ F- F- O2 F9 M( Y9 A' Q& h
  6. <font face="Tahoma"><font size="3"><font color="#000000">        {</font></font></font>) Q# `% a3 [/ O) r; u! I# O
  7. <font face="Tahoma"><font size="3"><font color="#000000">            "name": "ARM Debug",</font></font></font>: w' k6 v; o+ U0 e+ r
  8. <font face="Tahoma"><font size="3"><font color="#000000">            "type": "cppdbg",</font></font></font>8 N% N2 ^9 a* V  \; O
  9. <font face="Tahoma"><font size="3"><font color="#000000">            "request": "launch",</font></font></font>: Y: N6 q+ d! q; f3 B2 O) L
  10. <font face="Tahoma"><font size="3"><font color="#000000">            "program": "${workspaceFolder}/Build/STM32F103RC_Template.elf",</font></font></font>; _) J% b* s( |$ t( c
  11. <font face="Tahoma"><font size="3"><font color="#000000">            "args": [],</font></font></font>
    8 ]8 n3 q2 U4 d5 j9 y4 z9 c
  12. <font face="Tahoma"><font size="3"><font color="#000000">            "stopAtEntry": false,</font></font></font>
    : j7 e& H' Q, g/ k8 w- u: K/ \
  13. <font face="Tahoma"><font size="3"><font color="#000000">            "cwd": "${workspaceFolder}",</font></font></font>
    $ l! l% o2 {( V% w) N* l# d) O
  14. <font face="Tahoma"><font size="3"><font color="#000000">            "environment": [],</font></font></font>; Z% u% R+ B  s  _+ O& U' m
  15. <font face="Tahoma"><font size="3"><font color="#000000">            "externalConsole": false, </font></font></font>4 z2 Q( V' F. x
  16. <font face="Tahoma"><font size="3"><font color="#000000">            "MIMode": "gdb",</font></font></font>
    # p0 B% d7 D# I2 I6 T" ]
  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>3 d; |3 R; M* v7 m, E8 B
  18. <font face="Tahoma"><font size="3"><font color="#000000">            "targetArchitecture": "arm", </font></font></font>
    % K! R+ t( ?) p5 ~4 t" n! x& R
  19. <font face="Tahoma"><font size="3"><font color="#000000">            "setupCommands": [</font></font></font>
    2 F+ b  |2 @# \$ T
  20. <font face="Tahoma"><font size="3"><font color="#000000">                {</font></font></font>
    8 `( E: p. u0 L8 \0 S
  21. <font face="Tahoma"><font size="3"><font color="#000000">                    "description": "选择调试文件(.elf)到gdb",</font></font></font>
    5 G  W$ z/ d: |
  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>
    / h. r8 ?7 e6 O1 B2 J# o
  23. <font face="Tahoma"><font size="3"><font color="#000000">                    "ignoreFailures": false</font></font></font>; M( ?% ?6 t8 R6 O
  24. <font face="Tahoma"><font size="3"><font color="#000000">                },</font></font></font>! m/ Z6 Z( \& ~2 I  n
  25. <font face="Tahoma"><font size="3"><font color="#000000">                {</font></font></font>
    1 U, I  L! m" v- {4 y, n
  26. <font face="Tahoma"><font size="3"><font color="#000000">                    "description": "连接GDB Server",</font></font></font>
    : B/ Z: ]* V% d4 M# f! a
  27. <font face="Tahoma"><font size="3"><font color="#000000">                    "text": "target remote localhost:3333",                                 </font></font></font>2 `9 ]0 B, P: j+ |1 V: t
  28. <font face="Tahoma"><font size="3"><font color="#000000">                    "ignoreFailures": false</font></font></font>  B  `* z% [6 O5 I1 e' M  Q
  29. <font face="Tahoma"><font size="3"><font color="#000000">                },</font></font></font>
    8 G, J& \/ f4 T/ v; y
  30. <font face="Tahoma"><font size="3"><font color="#000000">                {</font></font></font>& E9 d1 Y* A3 h7 j/ \4 a5 \
  31. <font face="Tahoma"><font size="3"><font color="#000000">                    "description": "Reset MCU",</font></font></font>2 e5 M. W7 t- u. J7 C
  32. <font face="Tahoma"><font size="3"><font color="#000000">                    "text": "monitor reset",                                              </font></font></font>5 [, e$ |/ b8 o; ?- N
  33. <font face="Tahoma"><font size="3"><font color="#000000">                    "ignoreFailures": false</font></font></font>
    & A. }0 B" h! A5 Z0 X; j( B' E7 I. s
  34. <font face="Tahoma"><font size="3"><font color="#000000">                },</font></font></font>- ?* c( F+ F% |  q
  35. <font face="Tahoma"><font size="3"><font color="#000000">                {</font></font></font>2 f* t5 C( u: N. x; A$ U8 l
  36. <font face="Tahoma"><font size="3"><font color="#000000">                    "description": "Halt",</font></font></font># F$ g. g" R4 e' ~; _1 c
  37. <font face="Tahoma"><font size="3"><font color="#000000">                    "text": "monitor halt",                                                  </font></font></font>
    , L) P7 q4 s7 F, @
  38. <font face="Tahoma"><font size="3"><font color="#000000">                    "ignoreFailures": false</font></font></font>
    , Q! ^" P7 q: ^+ J
  39. <font face="Tahoma"><font size="3"><font color="#000000">                },</font></font></font>
    % Q9 w' q, M$ e9 G2 ^
  40. <font face="Tahoma"><font size="3"><font color="#000000">                {</font></font></font>
    * N, E2 e; x. n2 s. m; m+ Q
  41. <font face="Tahoma"><font size="3"><font color="#000000">                    "description":"下载代码到MCU",</font></font></font>' O  E# L: V* O% k' r, J4 j: F
  42. <font face="Tahoma"><font size="3"><font color="#000000">                    "text": "load" ,              </font></font></font>& h+ R* _6 a# L6 B& V% H
  43. <font face="Tahoma"><font size="3"><font color="#000000">                    "ignoreFailures": false                                      </font></font></font>
    , h: Z6 V$ w& S- t
  44. <font face="Tahoma"><font size="3"><font color="#000000">                }</font></font></font>
    & z. Q, c# t3 l( G8 a
  45. <font face="Tahoma"><font size="3"><font color="#000000">            ],</font></font></font>
    8 j/ \" a/ P+ q. I6 J
  46. <font face="Tahoma"><font size="3"><font color="#000000">            "preLaunchTask": "build", </font></font></font>1 D) v. {2 Y! }- r' {2 L2 O
  47. <font face="Tahoma"><font size="3"><font color="#000000">        }</font></font></font>
    # O: g0 _4 i# A; m
  48.   y$ q' Y' z2 g! b+ _9 z
  49. <font face="Tahoma"><font size="3"><font color="#000000">}</font></font></font>
复制代码

0 u8 `  B( ~/ a. T- Y  l可以看到,setupCommands里面就是我们之前试用gdb时操作过的流程:连接GDB Server——reset——halt——下载代码。! L& X# f3 m" p

# n5 w% f- D9 y. Y2 h: [
而preLaunchTask中是我们之前在tasks.json中配置的build任务。它可以让我们每次调试时都先编译一遍。
$ p4 d1 T$ t0 u7 L9 s保存后,随便打几个断点,按下F5,就可以快乐调试了。可以看到功能还是很齐全的。7 p) C; s+ X+ P' o9 e+ T
$ e' ?/ ?7 S# C
微信图片_20221024135502.png
) P* s3 J, f/ I

- j5 j2 a0 ~$ r) h【注意】:在进行调试的时候,需要先 按 F1 --> 任务:运行任务里选择 openocd 任务运行。& }' j" e, x* ?, ?$ O7 B8 t

. A! V2 y) `) V6 F0 G 微信图片_20221024135505.png ; w6 m( Y( m  O; G3 h( ^
/ V: t4 i# K' G9 x; T
因为调试,需要连接st-link进行调试,而openocd任务是开启st-link的服务。这样客户端才能连接上。# K' W  q4 O2 B1 c/ G( J1 J
' z' M2 {% L/ p8 G
否则会一直出现 target remote localhost:3333 的错误。
$ u7 h3 Q, o$ e& R! w+ h! D
8 K. ]  O- P; }5 r" f: Z看到这里,基本就差不多了,开发STM32完全没问题了。
: ~* t5 F! K5 i. H2 q& {( y# J
' b" ~- V" n, s- j# C6 ?8 F2 b. n

! e6 k6 L; K" K$ j转载自:大鱼机器人# L, u# t5 ]) K4 j, _
# A) R! I9 R2 T* j2 R7 J) `3 Q

5 Q! K, W$ g8 A, ?- |  Y# T
微信图片_20221024135406.png
收藏 评论0 发布时间:2022-10-24 13:55

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版