一、OpenOCD介绍% \0 b1 q' l2 V" R% A# u9 @
openocd全名叫做Open On-Chip Debugger,是一个自由开放的片上调试工具和编程工具,目前已经发布到0.11.0版本,目前主流调试器几乎都支持。
; `, r* E+ G) [# P3 m2 }7 ]) v2 V4 W9 C
支持下载器列表(部分):% f, @" G& r& F) b0 X4 d( r% s
0 q& y* H6 x+ m1 Z3 L2 I4 j: t% V
CMSIS-DAP v2 (USB bulk based) adapter driver$ U) x7 p" l$ R! U! A5 [; O
Nuvoton Nu-Link and Nu-Link2 adapter drivers7 O# E" t/ e& Z) J9 j/ K
NXP IMX GPIO mmap based adapter driver
. M% f' w) H* XST-Link consolidate all versions in single config. M* w- `/ |6 _! P& I# h) @
ST-Link read properly old USB serial numbers
. f5 w# E6 R$ E5 WSTLink/V3 support (for ST devices only)5 L0 x, I d4 X* r
! D" @; ^/ y+ \; J$ F+ \, g
二、安装openOCD
- y0 h: V) i1 s1 |8 A, t- I! r- @1. 下载openOCD; T& o, a' F2 f: D9 v
下载地址:2 t- ^& p, @$ z% @& ^
https://github.com/xpack-dev-tools/openocd-xpack/releases
( j2 _9 `4 K1 D1 L* {/ }$ G- t
. D3 ]. L3 Q5 U: h+ x! m
# o# l: U& W+ n) k9 A2. 安装openOCD
' e! x/ |9 j2 y; H0 `, G* N5 g& J这是第三方编译好的软件,解压后配置环境变量即可。
* k! z. W0 A* A" w# ^- q; Q
8 i q( y2 c) zopenocd可执行程序在 bin 目录下,将 bin 目录路径添加到环境变量中:+ G/ C# L+ }: E( g
1 y% C. u4 t3 I8 s6 x }0 L$ a配置好之后「重启电脑」。
3 R) ?0 g* `5 f) C
* E& r$ i* z; n8 a! D% ~; @# r3. 检查是否安装完成7 z* |8 ? q) e& H
重启后打开命令行,检查是否可以查看openocd版本:
e% |9 w: l5 r4 H8 d) l; {
0 [, N& Q* Q0 R; s* Q" w& }
( y# T8 f. p9 b9 j6 S三、openOCD使用方法
6 |: d8 T) I5 t. U* N1. 连接到目标芯片0 l- Z. M5 {; U% m& U7 p2 T
openOCD连接目标芯片的命令格式为:
" U9 B4 j0 o/ z& ]2 {) S! ?9 P7 E$ c- r! d2 Y. E0 @- |2 r( g
openocd -f <接口配置文件> -f <目标芯片配置文件>
$ [# O! E. m# |% d" l2 Q❝
2 U" ?8 n( P4 p: `2 `8 [+ D接口配置文件和目标芯片配置文件需要使用绝对路径。. E' r0 }$ |, K; }& m# t
. G6 z# n3 @- _- X/ v# k❞3 a* ~4 i2 ]) [ J, Y, A1 W
其中「接口配置文件」是openOCD支持的下载接口,在 scripts\interface 文件夹下:4 y" N: d3 ]$ K# \+ Z# S
; n! J: V8 L) n0 B
目标芯片配置文件是openOCD支持的目标芯片,在 scripts\target 文件夹下;* G/ u7 j# U+ j \0 U5 o
; ]5 _: t- e) W) @/ o- {$ H
比如这里我使用ST-Link v2-1下载器+STM32L431RCT6,结果如图:
/ P! L! N( y1 B
1 M% H1 t' c8 v; {, a- k! K+ q; g" t% z8 L$ `; e2 L/ I( I- q2 ] W7 M
2. 下载程序& g" j) M# Z x A+ v
成功连接到目标芯片后,需要使用 telnet 协议连接到 openOCD 终端,端口4444,这里我使用mobaxterm:
0 ]* v0 b; ~# H
, ?" y# ?2 U( i3 Z8 x, E
, I, L& h. c* r6 b% e. n# y连接之后需要注意,此时终端所在的路径是openOCD开启服务的路径,可以使用pwd命令查看:+ [& c& T( G1 U: L0 y
# g4 A3 p- H( U" _1 {. }
8 t8 }2 P% D$ `4 O5 J; ]
连接到openOCD终端之后,按照下面三个步骤下载程序。3 J8 `: }. s) r5 d! V
, c: R) l- r- W% u# d& t
① 目标芯片挂起,停机:, L% _2 B9 j% m& s7 }
- <font face="微软雅黑" size="3">halt</font>
复制代码 ② 烧写:- B* F* r' U+ g s* P
- <font face="微软雅黑" size="3">flash write_image erase <要下载的文件> <flash烧写起始地址></font>
复制代码 ③ 复位:4 u m0 s& x- j- Q3 a
- <font face="微软雅黑" size="3">reset</font>
复制代码
- m' k5 P7 T, i+ \8 i# ~# ^
5 @. D! k, D) x3. 一行命令完成9 ~3 m/ a9 a, Z! \8 I8 K: x
可以在启动openOCD的时候,使用 -c 参数带上要执行的命令,通过一行命令完成烧写和复位,「无需新建终端使用 telnet 连接openOCD」。
) x$ c& A* E& Y/ v- <font face="微软雅黑" size="3">openocd -f <接口配置文件> -f <目标芯片配置文件> -c <要执行的命令></font>
复制代码 比如之前的过程可以综合为:7 V$ w' i) P, Z
- <font face="微软雅黑" size="3">openocd -f G:\develop_tools\openOCD\xpack-openocd-0.11.0-1\scripts\interface\stlink-v2-1.cfg -f G:\develop_tools\openOCD\xpack-openocd-0.11.0-1\scripts\target\stm32l4x.cfg -c init -c halt -c "flash write_image erase E:/MCU/STM32L431RC-BearPi/usart1-fpu-test/build/usart1-fpu-test.bin 0x08000000" -c reset -c shutdown</font>
复制代码 下载结果如下:
! s N0 b- e' o$ A" O
% z( U/ z C$ X) G
3 ]5 y; V$ k0 d2 K四、添加到makefile中实现一键下载
& C4 @ S! W% U6 `5 R6 a Q5 x1. 添加makefile伪目标
: I7 W" E& ]0 [: ]& _: h& }1 KopenOCD虽然可以通过一行命令完成下载,每次都要输入这么多过于麻烦。9 F. r4 k$ n7 z) ?' A
" Y/ [8 P. E* w1 e9 |% `2 X「基于STM32CubeMX生成的makefile」,将其添加作为伪目标:% Z. M0 L6 y& @& Y: K9 ^: ` S
- <font face="微软雅黑" size="3">#######################################. u; S5 _' F" N& f! n- n4 ]
- # download* C; F2 s* K1 S5 k, l! z
- #######################################
; B4 [! N' _! d7 Z! x7 G - download:
9 C' J$ Y O; R* H - openocd -f G:\develop_tools\openOCD\xpack-openocd-0.11.0-1\scripts\interface\stlink-v2-1.cfg -f G:\develop_tools\openOCD\xpack-openocd-0.11.0-1\scripts\target\stm32l4x.cfg -c init -c halt -c "flash write_image erase E:/MCU/STM32L431RC-BearPi/usart1-fpu-test/build/usart1-fpu-test.bin 0x08000000" -c reset -c shutdown3 U; F% w2 ^6 j1 e! |; v6 A: n
- </font>
复制代码 这样我们就可以使用下面这行命令完成烧写:; k% Z9 w/ A# z! s; t/ n# w
- <font face="微软雅黑" size="3">make download</font>
复制代码 2. 优化makefile
+ e8 h4 ~8 i1 N5 D: a' V' X对上述在makefile中添加的命令使用变量进行优化,方便以后不同的工程进行修改:: X2 V4 F* @+ K! r9 j: D; N1 O
- <font face="微软雅黑" size="3">#######################################8 t! l9 O6 f( t- `* X) a7 s7 [
- # download
& }0 Q Y, t4 k7 P0 d! e - #######################################
3 [% R2 b# A' Q4 c ]& Q - OPENOCD_ROOT = G:\develop_tools\openOCD\xpack-openocd-0.11.0-17 i* k% f) x. Z0 k5 [# S0 N M
- OPENOCD_INTERFACE = stlink-v2-1.cfg
+ w. m: W; I2 S Y( g - OPENOCD_TARGET = stm32l4x.cfg2 i! G! y' e" d7 t
- OPENOCD_FLASH_START = 0x08000000
- _* Y5 z1 B: c - PWD_DIR = E:/MCU/STM32L431RC-BearPi/usart1-fpu-test
: j( H; m5 f$ m - $ Y8 K- X& L! Z4 M, ^$ w
- download:
# h( ?6 U( B; A' `- f3 T - openocd -f $(OPENOCD_ROOT)\scripts\interface\$(OPENOCD_INTERFACE) -f $(OPENOCD_ROOT)\scripts\target\$(OPENOCD_TARGET) -c init -c halt -c "flash write_image erase $(PWD_DIR)/$(BUILD_DIR)/$(TARGET).bin $(OPENOCD_FLASH_START)" -c reset -c shutdown</font>
复制代码 - C/ r0 @% f6 J% R
# E* N, z0 z3 i. C
0 a* b9 _9 O3 n9 }) `8 @' M) w
|