之前,开发单片机项目,可以说 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
& 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
: 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
1 G Z) p+ X* h% C3 q$ H4 L8 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
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 ^
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
; {* 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- <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 }
- <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
/ 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- <font face="Tahoma"><font size="3"><font color="#000000">{</font></font></font>
+ j, O( m: A( }+ n - <font face="Tahoma"><font size="3"><font color="#000000"> "configurations": [</font></font></font>3 c, k: N1 u7 Y% o! P* [3 B" O
- <font face="Tahoma"><font size="3"><font color="#000000"> {</font></font></font>
' B) R; y2 w7 R+ u - <font face="Tahoma"><font size="3"><font color="#000000"> "name": "Win32",</font></font></font>4 n2 Z1 V& T( D% j! ?6 {5 f
- <font face="Tahoma"><font size="3"><font color="#000000"> "browse": {</font></font></font>
% w ^" |* ?% T! i7 ]0 z& g# I - <font face="Tahoma"><font size="3"><font color="#000000"> "path": [</font></font></font>2 p7 A/ w! t5 l2 R% ?7 m- [
- <font face="Tahoma"><font size="3"><font color="#000000"> "${workspaceFolder}/",</font></font></font>& a0 z2 c) A& \( x2 c
- <font face="Tahoma"><font size="3"><font color="#000000"> "${workspaceFolder}/Drivers/CMSIS",</font></font></font>
0 k% C# l7 O6 H- V - <font face="Tahoma"><font size="3"><font color="#000000"> "${workspaceFolder}/Drivers/FWlib/inc",</font></font></font>9 w+ a9 K0 V5 K4 q; @
- <font face="Tahoma"><font size="3"><font color="#000000"> "${workspaceFolder}/Drivers/CMSIS/startup",</font></font></font>
; S5 `9 k+ T, d; | - <font face="Tahoma"><font size="3"><font color="#000000"> "${workspaceFolder}/User/inc",</font></font></font>
& e9 q" j& n/ h7 p" | - <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 - <font face="Tahoma"><font size="3"><font color="#000000"> "${workspaceFolder}/ThirdParty/crclib/include"</font></font></font>* c6 r! ~" `1 ]3 d7 Q
- <font face="Tahoma"><font size="3"><font color="#000000"> ],</font></font></font>
: @9 r" f7 b; ] - <font face="Tahoma"><font size="3"><font color="#000000"> "limitSymbolsToIncludedHeaders": true</font></font></font>
8 j; F) ^3 y# c1 Z' u6 U - <font face="Tahoma"><font size="3"><font color="#000000"> },</font></font></font>
" Y; q, y$ L& U+ Y7 c5 C* g - <font face="Tahoma"><font size="3"><font color="#000000"> "includePath": [</font></font></font>
& [, _: Q n6 X6 V, @0 Q - <font face="Tahoma"><font size="3"><font color="#000000"> "${workspaceFolder}/",</font></font></font>
2 q) P' p- ?& d5 C, F* I - <font face="Tahoma"><font size="3"><font color="#000000"> "${workspaceFolder}/",</font></font></font>
: x, J% l$ r! ^ - <font face="Tahoma"><font size="3"><font color="#000000"> "${workspaceFolder}/Drivers/CMSIS",</font></font></font>! x, M+ a: I9 o( P( `$ k- Z: ~
- <font face="Tahoma"><font size="3"><font color="#000000"> "${workspaceFolder}/Drivers/FWlib/inc",</font></font></font>
, x* I& s' W0 l; _ - <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
- <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
- <font face="Tahoma"><font size="3"><font color="#000000"> "${workspaceFolder}/User",</font></font></font>* l: x7 ?7 H9 ^
- <font face="Tahoma"><font size="3"><font color="#000000"> "${workspaceFolder}/ThirdParty/crclib/include"</font></font></font>
5 h0 U9 y/ Y' S; u - <font face="Tahoma"><font size="3"><font color="#000000"> ],</font></font></font>0 `- b! C3 K& a% j/ \* I$ v
- <font face="Tahoma"><font size="3"><font color="#000000"> "defines": [</font></font></font>
1 U2 D+ e8 h4 t/ R - <font face="Tahoma"><font size="3"><font color="#000000"> "_DEBUG",</font></font></font>4 V* {! Y* }5 K" _: [
- <font face="Tahoma"><font size="3"><font color="#000000"> "UNICODE",</font></font></font>
. Q8 v$ v9 \. [ - <font face="Tahoma"><font size="3"><font color="#000000"> "_UNICODE",</font></font></font># P5 C+ V0 E( C% x
- <font face="Tahoma"><font size="3"><font color="#000000"> "__CC_ARM",</font></font></font>9 Y, n: A1 L; q- S' K
- <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 - <font face="Tahoma"><font size="3"><font color="#000000"> "STM32F10X_HD"</font></font></font>; ~ A* G4 }$ M3 G9 Q ^
- <font face="Tahoma"><font size="3"><font color="#000000"> ],</font></font></font>4 |" M; o. T7 q& n% h, ?
- <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
- <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
- <font face="Tahoma"><font size="3"><font color="#000000"> "cppStandard": "c++17",</font></font></font>% n. ^& i' m7 M( G! D& t
- <font face="Tahoma"><font size="3"><font color="#000000"> "intelliSenseMode": "clang-x64"</font></font></font>
3 {5 c( D+ x1 S, t, j - <font face="Tahoma"><font size="3"><font color="#000000"> }</font></font></font>
% {, B/ o$ n0 j/ ~# }8 v - <font face="Tahoma"><font size="3"><font color="#000000"> ],</font></font></font>/ ]2 A% y& m% c: Y
- <font face="Tahoma"><font size="3"><font color="#000000"> "version": 4</font></font></font>5 `' |/ L7 y% R1 a* c* @1 b3 `
- <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
3 u4 d8 }+ q' r7 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
# 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
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
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
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- 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
, 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 ]
) 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
. 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( [- target remote localhost:3333
复制代码 , O9 {8 l) }+ [
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
$ 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
& |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
: 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
) {$ ^ 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 H4.配置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 _
- <font face="Tahoma"><font size="3"><font color="#000000">{</font></font></font>( m9 i' h# `7 e* ~: {
- <font face="Tahoma"><font size="3"><font color="#000000"> "version": "0.2.0",</font></font></font>
% _8 U3 B- ?8 B) L - <font face="Tahoma"><font size="3"><font color="#000000"> "configurations": [</font></font></font>
7 W* j* s K# w - <font face="Tahoma"><font size="3"><font color="#000000">! `9 r- X' x# `. Q# n1 |* E
- </font></font></font>
8 ] o2 `& ~. i, g9 g7 r - <font face="Tahoma"><font size="3"><font color="#000000"> {</font></font></font>, d& b$ ^5 J8 s2 m# Z* d: ?5 A
- <font face="Tahoma"><font size="3"><font color="#000000"> "name": "ARM Debug",</font></font></font>$ Q8 A6 `! s: D* Q7 S8 H
- <font face="Tahoma"><font size="3"><font color="#000000"> "type": "cppdbg",</font></font></font>
0 {+ Q/ X2 T6 y" a0 J ?: k! C% J - <font face="Tahoma"><font size="3"><font color="#000000"> "request": "launch",</font></font></font>
. [, c, V9 E# X% P - <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
- <font face="Tahoma"><font size="3"><font color="#000000"> "args": [],</font></font></font>
) d: t% N) ~. }' l' ~0 _ - <font face="Tahoma"><font size="3"><font color="#000000"> "stopAtEntry": false,</font></font></font>6 Q4 q2 x2 T0 I. [$ D
- <font face="Tahoma"><font size="3"><font color="#000000"> "cwd": "${workspaceFolder}",</font></font></font>
3 I" a( `4 `& c - <font face="Tahoma"><font size="3"><font color="#000000"> "environment": [],</font></font></font>
$ [- p- h, ]; Q2 o: I - <font face="Tahoma"><font size="3"><font color="#000000"> "externalConsole": false, </font></font></font>7 }; c0 `- e$ u+ H: q# M
- <font face="Tahoma"><font size="3"><font color="#000000"> "MIMode": "gdb",</font></font></font>
( I1 }' F5 [# L6 R( ] - <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
- <font face="Tahoma"><font size="3"><font color="#000000"> "targetArchitecture": "arm", </font></font></font>
& g6 o1 y9 A4 r, Q7 l, b - <font face="Tahoma"><font size="3"><font color="#000000"> "setupCommands": [</font></font></font>7 O' H1 T$ Y4 |! N' F
- <font face="Tahoma"><font size="3"><font color="#000000"> {</font></font></font>* e7 k& m* x' A5 u/ x
- <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
- <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 - <font face="Tahoma"><font size="3"><font color="#000000"> "ignoreFailures": false</font></font></font>1 D+ l' p8 E0 {& m
- <font face="Tahoma"><font size="3"><font color="#000000"> },</font></font></font>
6 n, N. b# z T - <font face="Tahoma"><font size="3"><font color="#000000"> {</font></font></font>
2 [! O3 P0 O/ x: H - <font face="Tahoma"><font size="3"><font color="#000000"> "description": "连接GDB Server",</font></font></font>
9 I4 G& R0 M, j3 d$ J; d - <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
- <font face="Tahoma"><font size="3"><font color="#000000"> "ignoreFailures": false</font></font></font>& M4 s3 a' N. x5 r
- <font face="Tahoma"><font size="3"><font color="#000000"> },</font></font></font>9 F$ M0 @7 g3 d/ G
- <font face="Tahoma"><font size="3"><font color="#000000"> {</font></font></font>
# C' @/ c# ^" \8 b; J. L - <font face="Tahoma"><font size="3"><font color="#000000"> "description": "Reset MCU",</font></font></font>
5 F, K1 X5 h' @3 A - <font face="Tahoma"><font size="3"><font color="#000000"> "text": "monitor reset", </font></font></font>
; ]* T/ |; Y3 y) p5 N5 F" b - <font face="Tahoma"><font size="3"><font color="#000000"> "ignoreFailures": false</font></font></font>
7 `7 E& I, J h5 `# q2 Z - <font face="Tahoma"><font size="3"><font color="#000000"> },</font></font></font>
$ Q- V4 o) U3 n s6 J" o# o - <font face="Tahoma"><font size="3"><font color="#000000"> {</font></font></font>
; x) N' C ^/ J4 y1 j- \% n R, f - <font face="Tahoma"><font size="3"><font color="#000000"> "description": "Halt",</font></font></font># ?6 u# g% s' H! u) x
- <font face="Tahoma"><font size="3"><font color="#000000"> "text": "monitor halt", </font></font></font>. W) z. x( f3 c5 o
- <font face="Tahoma"><font size="3"><font color="#000000"> "ignoreFailures": false</font></font></font>% O- H0 b+ M K1 g ^9 n
- <font face="Tahoma"><font size="3"><font color="#000000"> },</font></font></font>3 B' x! o( ~7 M+ J# P1 b! W* i( Z
- <font face="Tahoma"><font size="3"><font color="#000000"> {</font></font></font>3 o/ a7 `+ v3 B7 y% } R
- <font face="Tahoma"><font size="3"><font color="#000000"> "description":"下载代码到MCU",</font></font></font>
" q4 H1 t) ]' y7 U+ i A - <font face="Tahoma"><font size="3"><font color="#000000"> "text": "load" , </font></font></font>% D9 h' g ~, M9 K
- <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
- <font face="Tahoma"><font size="3"><font color="#000000"> }</font></font></font>
6 G% e+ p7 Y$ {. \; i/ ~ - <font face="Tahoma"><font size="3"><font color="#000000"> ],</font></font></font>, }3 f+ c, Y) M- r
- <font face="Tahoma"><font size="3"><font color="#000000"> "preLaunchTask": "build", </font></font></font>; o( H: Q: O; j
- <font face="Tahoma"><font size="3"><font color="#000000"> }</font></font></font>
; ~" J" ]$ b- a' y - $ ~# m5 s" L) T# W! m8 t: a/ T
- <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
+ 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 `
- 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
|