|
STM32开发之 VS Code + GDB下载调试
9 H! e- @2 J; ]( O/ @' G, O; j; o! a4 s) w
一、软件下载9 r- V$ O5 S |. S+ o
OpenOCD:https://gnutoolchains.com/arm-eabi/openocd/
1 `" Z" N8 Q; T4 B% Q. Z一个开源的片上调试器(Open On-Chip Debugger)。在其他平台上,OpenOCD是要自己 Configure并且自己编译的,但是 Windows平台上提供了编译好的二进制文件,所以只需要下载下来后随便解压出来就好了。安装完成后添加系统环境变量,可以利用 cmd命令:openocd -v测试。
% T) z( l0 F. y$ ^
7 |# a* w8 _; s7 ~( Y二、搭建调试链接
2 ^% V! t, A, c% d: ]在这里需要说明的是,OpenOCD文件夹下的 share/openocd/scripts 里面放的就是 openocd在运行时所需要用到的各种配置文件,其中 interface文件夹下放的是关于调试器的配置文件,而 target文件夹放的是目标平台的配置文件,这里我们需要的是 interface/stlink.cfg 和 target/stm32l1.cfg,不过不需要复制出来。注:stm32l1.cfg是要选择你的目标芯片对应的文件,可以进入 ...\OpenOCD-20200729-0.10.0\share\openocd\scripts\target路径下查找。+ D. W3 F3 \, U
连接好 STLink和板子,如果板子的调试接口正常的话;然后在终端控制台里键入命令:openocd -f interface/stlink.cfg -f target/stm32l1.cfg 回车,得到以下信息,即搭建了一个 GDB Server,连通了硬件调试器和 GDB,通过 USB和硬件调试器连接,并且通过 TCP和 GDB连接:
1 i: h3 V/ w- e7 P- t1 S* n, U
" y+ H' z1 f1 L0 l7 Z 三、下载配置: ^ N/ Q H' F0 g% x& S
当你能正确实现以上操作时,那么,关闭终端显示的窗口,使之退出搭建的 GDB Server链接;然后回到 tasks.json文件里,在原本的 “tasks” 任务标签里再追加以下内容:( k+ d% g& Y9 b3 I4 G& E/ r
- {
2 R( Q7 K7 X% v2 K$ |% g, v - "dependsOn":"Build", // 任务依赖
. O* B5 i/ W! {4 C; u" u - "label": "Build and Download",5 R6 \7 U- Q, V b5 U
- "type": "shell",- l) t. A2 I6 C' Q7 h- E
- "command": "openocd",. F' Q) Y5 t) a) V5 L0 U' P
- "args": [
) x% n' l) M: o" P( f+ G- G - "-f",
3 o) Z" f s! T0 f. y8 n# T - "interface/stlink.cfg",
6 [1 T/ c3 X* d2 T I! q7 M - "-f",' Z$ S7 J8 @3 \
- "target/stm32l1.cfg",4 ?1 T y+ R# [# |! @# S
- "-c",
( r9 w {# m, l: g4 r - "program ./build/${workspaceFolderBasename}.elf verify reset exit"+ ^: c' b1 n% _+ U
- ],
: @! f4 t6 O6 e! E- u% R - "problemMatcher": []
# J6 [' ~7 g* P: O `/ x) I; P - }
复制代码
, g) `# p$ ?/ z; F8 H @" d8 o& M# ^" V2 B9 p
最后变成:% F! j+ M1 G5 q$ J' V2 B
" Y% S8 c9 x% r; W, F! B0 C2 Y
这个任务要求先进行 Build任务,然后通过命令打开 openocd,加载两个配置文件(-f interface/stlink.cfg 和 -f target/stm32l1.cfg),同时,这个 -c 的选项后面跟着的就是openocd成功加载后执行的内置命令,这里我们让它下载、验证、reset,然后直接退出,这样就实现了一条龙式的下载。运行这个任务的方法就跟 Build一样,在此就不过多介绍了,最后运行该任务你会发现,这小破板跑起来。: p/ ^3 \1 I( _0 B3 U) Y- z* C
这里其实是经过了进入调试处理的操作,只不过我们让它自动退出了调试模式而已;因为下载和调试的区别是,下载只是把代码加载到芯片里,而不进行调试,也不会切换到调试页面,其实调试就已经会将代码下载到板子上了,所以这里所设置的下载,其实并不是单纯的下载,而是经过了进入调试,退出调试这样的操作,使我们人为的觉得是下载操作。
- q! d, B/ Q' l# H
; M% w% N" ?) U' \: @2 N' E- a \$ P3 f: a0 C. _0 P3 E
1 n5 R0 }( N( }$ ~四、调试配置
k _3 d" o% v6 }: q6 Q7 G. ~在窗口里点击 运行 -> 添加配置:$ u8 L$ O( I+ q' S! d( s7 ]. [. Q
" q$ o0 s4 D' }/ z
接着,如果根据上一篇安装了 Cortex Debug插件,就会出现如下选项(ps:如果窗口打开的是 .c文件或者 .h文件,只会显示前面两个选项,不知道是我电脑问题还是咋的,可以试着切换打开到 .json文件或者打开 makefile文件):
4 \* Y. c" e2 E- L# m
6 [9 W& I9 i! Q4 |( \! P# F* \& J 点击框选的选项,在 .vscode文件里会创建一个 launch.json文件,然后把里面的内容修改成以下样子:1 u" J3 J, ?" u" U6 k
# C9 s7 p, l; G2 m; O# ~, W- <font size="3">{
7 ]: ?% W) r8 l - // 使用 IntelliSense 了解相关属性。
* z0 P+ X+ }6 U0 b7 M - // 悬停以查看现有属性的描述。
: V' P& W* ]# q( x - // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387% |$ v1 h6 Z+ n
- "version": "0.2.0",
8 M: G2 t% g0 U; j - "configurations": [+ ?* q8 ^2 ~, O
- {/ V1 M+ ?& w4 D' [) \) o" v$ K* }1 Z1 \
- "name": "Cortex Debug",
8 @2 y; ~, b. F: @2 u4 p - "cwd": "${workspaceRoot}", // 输出路径+ Q# J* s- z5 u2 p! z) L0 o
- "executable": "./build/${workspaceRootFolderName}.elf", // 要调试的程序6 h3 z' f' A. B8 Q# {
- "request": "launch",
3 k C) M) `0 _9 k - "type": "cortex-debug",
" ~0 N6 Q) ]" C, X H$ d, G0 {4 g - "servertype": "openocd", // 调试器选择, H* C# m1 F& \3 f3 {6 f
- "device": "STM32L151CB", // 使用J-link GDB Server时必须;其他GBD Server时可选(有可能帮助自动选择 SVD文件)。支持的设备见 https://www.segger.com/downloads/supported-devices.php& x+ ~8 a+ U4 X2 C6 z: j
- //"svdFile": "./STM32L15xC.svd", // svd文件,有这个文件才能查看寄存器的值,每个单片机都不同。可以在以下地址找到 https://github.com/posborne/cmsis-svd下载
5 R& b( k# L3 I% s" T+ G; E - "interface": "swd",2 V' @1 X, B) w* P# Q5 z( D. r
- "configFiles": [
2 ]! z) j2 V. ~7 `4 r5 S. p - //"${workspaceRoot}/openocd.cfg",// *可以通过加载该文件来配置9 g I- F5 E5 |- L, V+ W
- "interface/stlink.cfg",& f/ x8 Q: x9 u! R( `0 Q
- "target/stm32l1.cfg"
: {9 I# }9 r, }4 f, ] - ],. u& @% b+ q( M$ O) {
- "runToMain": false,
) b1 Y& h0 J9 `7 P - "preLaunchTask": "Build", // 在调试前预先执行的任务,此处是tasks.json中的
1 Q* F& _7 {1 { A1 C# @' T - //"armToolchainPath": "C:\\Program Files (x86)\\GNU Tools ARM Embedded\\5.4 2016q3\\bin" // 如果没有把 arm工具链路径添加到系统环境变量,则需要这条指令添加你的路径
8 i2 ~3 K5 {9 S- D# t, h2 @& n - }
7 w* j D9 S- U) A) z3 \% O9 @ - ]
# W5 ^2 | }1 ~! X - }</font>
复制代码
2 f O o) A* l
z5 f0 x4 }+ w/ W8 X; G9 I这里主要就是指定 preLaunchTask,顾名思义就是先运行某个任务后再启动调试,我们这里要先运行前面配置的 Build 任务,意为先编译再进行调试操作;servertype 调试器这里,我们就使用 openocd 就好了,因为它支持各种不同的调试器,若是仅使用Jink,不用其他的调试器,那么,你可以改成 jlink,然后参考:https://zhuanlan.zhihu.com/p/163771273;device 是指定 STM32的芯片型号,如果支持,则可以帮助调试器显示外设寄存器的值;configFiles 就是前面说到需要加载的那两个配置文件了(类似于键入命令:openocd –f interface/jlink.cfg –f target/stm32f4.cfg);runToMain 就是选择程序是从 main函数开始加载,还是从汇编代码开始加载,stm32启动都是从 startup_stm32xxx.s开始的,所以这里得选择 false。5 h. B. q$ d+ U; f9 A$ d9 D$ {- H
然后在这里说一下,在configFiles 中,注释了一行,在正常情况下,如果我们不带参数启动(即所谓的单纯键入命令:openocd),openocd就会默认自动查找当前目录下有没有名为 openocd.cfg的文件,并把它作为配置文件来启动。若是你想在利用 openocd.cfg来加载配置,那么就要在工程路径下(对应你在 configFiles所填的路径文件)创建一个 openocd.cfg文件,并添加以下内容:" H$ d( H$ f2 b1 H6 E8 { C
. X: u1 [: b6 O& v$ _- [3 y1 @9 A- <font size="3"># 选择调试器为JLink or CMSIS-DAP or STlink4 T- F) W- s- l% V7 [
- #source [find interface/jlink.cfg]
- u) ~& P1 T) x$ E - #source [find interface/cmsis-dap.cfg]8 b: J, `* V K6 W- `6 K$ d
- source [find interface/stlink.cfg]6 Q9 E8 Y- P0 W8 }' W
9 k0 B e7 S! G6 f& m1 S* P" I- # 选择接口为SWD,jlink下打开
! T$ @9 y0 R! @7 o' | - #transport select swd
( v* m$ ^. w8 m, w - ) S/ D2 _# U5 l3 x6 N
- # 选择目标芯片
5 G4 u4 \" n. m( ^2 L+ T - source [find target/stm32l1.cfg]</font>
复制代码 9 b1 y5 y. {2 }) N- [7 v
) K- b, h, {1 B' D& H- o
实际上并不推荐这种方式,因为又要创建,又把 launch.json的配置分开了,当整体移植 .vscode文件夹并更换目标芯片时容易出现漏改参数。/ ]0 A* R) t$ k1 h+ R# ~ ~5 S9 d V
五、DEBUG调试
8 K! a' U' T, C! v在配置完成以上的 launch.json调试参数后,点击窗口 运行 -> 启动调试(或者直接按 f5),就可以进入 debug模式了:
" R) S" Y+ [7 m8 l. B) _" @
# p* _- {: D, V+ F5 Y
' V) `+ o/ e: r/ X) z$ b2 b3 O7 Y
. H1 O" Y( |: r6 ^文章出处: Arachnid
i" C1 g8 O, F) ~4 Y2 F" q
0 Y; i; f$ h9 s& }4 H' D) h |