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

STM32开发之 VS Code + GDB下载调试

[复制链接]
STMCU-管管 发布时间:2020-10-10 10:02
STM32开发之 VS Code + GDB下载调试

+ V8 W) S1 U7 b( Q0 P
* p5 h- N3 ?9 w6 ?2 Q7 `
一、软件下载
+ |' O$ S% i: `- ~1 D% X! MOpenOCD:
https://gnutoolchains.com/arm-eabi/openocd/3 x" ?. ^5 R0 ]0 N$ K. D2 s
一个开源的片上调试器(Open On-Chip Debugger)。在其他平台上,OpenOCD是要自己 Configure并且自己编译的,但是 Windows平台上提供了编译好的二进制文件,所以只需要下载下来后随便解压出来就好了。安装完成后添加系统环境变量,可以利用 cmd命令:openocd -v测试。4 z! y, E9 b. L

' c$ O$ j) }" T二、搭建调试链接
; p( B! S" B: B在这里需要说明的是,OpenOCD文件夹下的 share/openocd/scripts 里面放的就是 openocd在运行时所需要用到的各种配置文件,其中 interface文件夹下放的是关于调试器的配置文件,而 target文件夹放的是目标平台的配置文件,这里我们需要的是 interface/stlink.cfg 和 target/stm32l1.cfg,不过不需要复制出来。注:stm32l1.cfg是要选择你的目标芯片对应的文件,可以进入 ...\OpenOCD-20200729-0.10.0\share\openocd\scripts\target路径下查找。

, {( R! H! B* a8 Z7 O连接好 STLink和板子,如果板子的调试接口正常的话;然后在终端控制台里键入命令:openocd -f interface/stlink.cfg -f target/stm32l1.cfg 回车,得到以下信息,即搭建了一个 GDB Server,连通了硬件调试器和 GDB,通过 USB和硬件调试器连接,并且通过 TCP和 GDB连接:) n9 ]5 {8 L7 k! L6 x$ [5 \0 A3 f
2.png . p8 H3 y- d1 Y
三、下载配置
& q8 K( o# H: Y" ?$ O$ o; @+ K7 ?当你能正确实现以上操作时,那么,关闭终端显示的窗口,使之退出搭建的 GDB Server链接;然后回到 tasks.json文件里,在原本的 “tasks” 任务标签里再追加以下内容:

: v' _' i* Y" n5 ]6 }+ E
  1. {# d! R- G3 n6 z
  2.    "dependsOn":"Build",          // 任务依赖+ q7 W0 c4 G% y% m% C0 C; g! E
  3.    "label": "Build and Download",& ^4 y# H# ~0 x3 N% ?) W& }
  4.    "type": "shell",5 |1 l( R( Z; o
  5.    "command": "openocd",. l* F  u8 \1 `  }4 s
  6.    "args": [0 L  \6 j# a+ G: J4 n
  7.    "-f",
    & a  C" Z# g; [# e$ u4 t
  8.    "interface/stlink.cfg",+ A6 D) e! |8 `7 F5 s) ^
  9.    "-f",
    + d" f7 u0 x; |
  10.    "target/stm32l1.cfg",) Q0 P% P& g" J3 H) G( y
  11.    "-c",. E5 v$ u" \# l1 s+ E( _! r
  12.    "program ./build/${workspaceFolderBasename}.elf verify reset exit", J+ p9 _8 R% D  x0 z! i% P1 M
  13.   ],
    3 W* p  E! f3 A' [* Y5 s. p3 r
  14.    "problemMatcher": []/ l' @! f# O( U! o8 d
  15. }
复制代码
; Y" n# |9 R- d4 n' l

3 r1 N* L( r9 n8 K8 r: t! u) f! o; a最后变成:
( G9 c4 O7 y: H: {# T' K
3.png + y+ U9 G9 [6 A4 B2 S  u# j
这个任务要求先进行 Build任务,然后通过命令打开 openocd,加载两个配置文件(-f interface/stlink.cfg 和 -f target/stm32l1.cfg),同时,这个 -c 的选项后面跟着的就是openocd成功加载后执行的内置命令,这里我们让它下载、验证、reset,然后直接退出,这样就实现了一条龙式的下载。运行这个任务的方法就跟 Build一样,在此就不过多介绍了,最后运行该任务你会发现,这小破板跑起来。% b. G8 e$ p- O
这里其实是经过了进入调试处理的操作,只不过我们让它自动退出了调试模式而已;因为下载和调试的区别是,下载只是把代码加载到芯片里,而不进行调试,也不会切换到调试页面,其实调试就已经会将代码下载到板子上了,所以这里所设置的下载,其实并不是单纯的下载,而是经过了进入调试,退出调试这样的操作,使我们人为的觉得是下载操作。& |3 c" G' D5 y4 U$ c) l" W$ F

; v* F2 T5 u5 p& {" f" ]. [9 N

9 v- D. M& J+ U% z% E# Y; M% J$ o; O) W) v. Y2 Y2 g4 f
四、调试配置
0 e$ ]" L+ i' T在窗口里点击 运行 -> 添加配置:
" y( p/ Y% d  A
4.png & `2 ]* D7 t3 z! b5 C- n$ w
接着,如果根据上一篇安装了 Cortex Debug插件,就会出现如下选项(ps:如果窗口打开的是 .c文件或者 .h文件,只会显示前面两个选项,不知道是我电脑问题还是咋的,可以试着切换打开到 .json文件或者打开 makefile文件):7 J4 D: A9 }* E4 C
5.png
! D: J0 E; i- o
点击框选的选项,在 .vscode文件里会创建一个 launch.json文件,然后把里面的内容修改成以下样子:
9 e- L& b( V% C) o# h  u. b5 }4 K
  1. <font size="3">{' ]6 h9 a2 a! x
  2.    // 使用 IntelliSense 了解相关属性。/ q% T3 [+ t3 E* ^7 ]6 K
  3.    // 悬停以查看现有属性的描述。
    . }0 e) n4 ?1 U0 Q/ T
  4.    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    ( i! K: C! g! Y$ b
  5.    "version": "0.2.0",
    # n9 r6 ?) R& o/ \
  6.    "configurations": [8 d: ?8 C* b3 d0 ~
  7.       {5 s5 ?% i- ~, E
  8.            "name": "Cortex Debug",
    + m6 t. C$ K5 f  O6 l8 J% A% W
  9.            "cwd": "${workspaceRoot}",  // 输出路径
    ) c5 V) G  c& F: y
  10.            "executable": "./build/${workspaceRootFolderName}.elf",    // 要调试的程序
    * t) S8 ]% D6 s
  11.            "request": "launch",$ T2 l( h3 w- p5 ^' W" z
  12.            "type": "cortex-debug",9 D. G1 v/ C( \8 u" f
  13.            "servertype": "openocd",    // 调试器选择( H. j3 H# G  V/ C
  14.            "device": "STM32L151CB",    // 使用J-link GDB Server时必须;其他GBD Server时可选(有可能帮助自动选择 SVD文件)。支持的设备见 https://www.segger.com/downloads/supported-devices.php
    * ~9 A3 s2 I! D+ Z3 x! H9 o  R
  15.            //"svdFile": "./STM32L15xC.svd", // svd文件,有这个文件才能查看寄存器的值,每个单片机都不同。可以在以下地址找到 https://github.com/posborne/cmsis-svd下载
    5 K; u5 \( `0 U& c8 K7 G4 d* V
  16.            "interface": "swd",
    ) c) m! e6 k- U7 K5 e$ G# Y+ H8 n. S: y
  17.            "configFiles": [4 q1 _% v: z, M& n- W+ m" i' b
  18.                //"${workspaceRoot}/openocd.cfg",// *可以通过加载该文件来配置
      G" O  o- ]! u1 U5 m) _
  19.                "interface/stlink.cfg",! ^2 r) v+ w' ?) ?3 T9 ^: E4 T
  20.                "target/stm32l1.cfg"
    3 \" M5 V7 Y) V: q
  21.           ],
    4 ^3 C$ |1 O: ^5 v
  22.            "runToMain": false,
    ) K9 S- |: o/ E# L2 ]8 w
  23.            "preLaunchTask": "Build",   // 在调试前预先执行的任务,此处是tasks.json中的
    # H( C0 |5 Z* t' c
  24.            //"armToolchainPath": "C:\\Program Files (x86)\\GNU Tools ARM Embedded\\5.4 2016q3\\bin"   // 如果没有把 arm工具链路径添加到系统环境变量,则需要这条指令添加你的路径, H6 e- _5 c: L5 W: z) Z8 @, M) k
  25.       }
    - g: [( H/ Y( Y5 v- @! y
  26.   ]3 Y- b8 L, V' K- `* p! W' @
  27. }</font>
复制代码
7 l! }2 V* P$ X* \  r
- }" `6 K$ {8 X  w9 x
这里主要就是指定 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。
$ ~2 S. F! `" E  E然后在这里说一下,在configFiles 中,注释了一行,在正常情况下,如果我们不带参数启动(即所谓的单纯键入命令:openocd),openocd就会默认自动查找当前目录下有没有名为 openocd.cfg的文件,并把它作为配置文件来启动。若是你想在利用 openocd.cfg来加载配置,那么就要在工程路径下(对应你在 configFiles所填的路径文件)创建一个 openocd.cfg文件,并添加以下内容:! R& X- D: i. W% R+ T

7 u: [( P0 U- O4 j9 @" P8 H5 i
  1. <font size="3"># 选择调试器为JLink or CMSIS-DAP or STlink' a) |/ L* w% Y
  2. #source [find interface/jlink.cfg]
    1 z7 j' h, T& Y- _% F: K
  3. #source [find interface/cmsis-dap.cfg]
    * ~4 \1 k1 \/ R/ B0 I
  4. source [find interface/stlink.cfg]
    * S3 r' ?, L+ W; {; N

  5. 8 p7 A' O9 O8 f' P3 F" r. r7 G
  6. # 选择接口为SWD,jlink下打开2 X' `1 L/ d. @  P) s
  7. #transport select swd' A/ o8 X1 J" k4 y
  8. 6 c, ]8 B3 A2 g( a, _5 x
  9. # 选择目标芯片4 @" x* ^! E6 b% y7 o- h3 N2 A
  10. source [find target/stm32l1.cfg]</font>
复制代码

0 {9 v) _  x! o2 f4 w  o4 e4 w7 w: A; j3 y. {8 G
实际上并不推荐这种方式,因为又要创建,又把 launch.json的配置分开了,当整体移植 .vscode文件夹并更换目标芯片时容易出现漏改参数。
) U# ^1 @; a) L五、DEBUG调试( W& C4 v7 W& H( V& \1 j5 M( r
在配置完成以上的 launch.json调试参数后,点击窗口 运行 -> 启动调试(或者直接按 f5),就可以进入 debug模式了:

' n5 P7 H* q* ?
6.png
- `3 y5 f% y- ]9 m3 E
7 u. ^4 t/ z" f: {7 O
. }4 p9 D+ }, c: J
文章出处: Arachnid
. U" k/ F1 E0 K/ L( y* v; p; ^- W
+ R: u( [9 b; L) l4 s. r
收藏 1 评论0 发布时间:2020-10-10 10:02

举报

0个回答

所属标签

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