一、OpenOCD介绍% j4 w, R8 f, [. t# R6 Y
openocd全名叫做Open On-Chip Debugger,是一个自由开放的片上调试工具和编程工具,目前已经发布到0.11.0版本,目前主流调试器几乎都支持。
3 S. G0 }! ? R! L" h9 M! K* H4 T& k( r* @8 T# K$ j# d$ g' V
支持下载器列表(部分):- V# J1 k0 P4 k$ x+ w" s
) n$ v) q% C, E) k/ K: |
CMSIS-DAP v2 (USB bulk based) adapter driver
/ M8 _ w$ a9 ]$ {2 C4 ]+ HNuvoton Nu-Link and Nu-Link2 adapter drivers
/ K* E, r( h0 a* {2 T$ a: XNXP IMX GPIO mmap based adapter driver2 |/ P. h( k% [* F, }7 k5 F
ST-Link consolidate all versions in single config% J1 `9 n* I8 T
ST-Link read properly old USB serial numbers' F! n8 @ p7 L, O; C; S
STLink/V3 support (for ST devices only)
' G$ O" w' a- v5 b( O K0 [0 o' u5 K% z& \4 h: A
二、安装openOCD$ z8 T9 u7 u s) H5 ~
1. 下载openOCD% k( M. H1 H0 N: L( C
下载地址:3 [/ h" p A( n L6 \
https://github.com/xpack-dev-tools/openocd-xpack/releases
5 W" ^6 _ e' m
, a! y$ l1 I2 [1 B$ w% z! `$ R3 @' ?. D5 e
2. 安装openOCD
& T& j# c; v5 ]# g- g这是第三方编译好的软件,解压后配置环境变量即可。
4 Q$ a7 ^# J- u! b' Y
) x) u1 F) O3 D% ~openocd可执行程序在 bin 目录下,将 bin 目录路径添加到环境变量中:
! d% [7 x: i2 o* [) R$ Z+ Q
$ g n8 k+ R0 r0 m0 Y. t* E配置好之后「重启电脑」。
( c0 u: w4 o' G- K9 R% f J/ u% C! R0 B- l
3. 检查是否安装完成
5 G5 v9 q+ z, s# M6 k9 H& O ~重启后打开命令行,检查是否可以查看openocd版本:
6 @8 ?% o: q4 k
3 Y; D c, B/ O
0 T- M0 N& s3 m1 i$ A$ W三、openOCD使用方法
% C v. E; H& \1 A1. 连接到目标芯片; \5 \( K8 P2 X/ P& G* q9 L$ p
openOCD连接目标芯片的命令格式为:
u* S$ ^2 W3 _9 _- U! \ J, G v
# I2 t% I& e7 h1 Q7 K" Yopenocd -f <接口配置文件> -f <目标芯片配置文件>5 f2 f* D- F" \( \* R0 s. z7 A8 q
❝
2 K( _$ Q) ?4 t/ v接口配置文件和目标芯片配置文件需要使用绝对路径。
/ M/ l. S' q8 W3 b5 ~0 | `7 k/ W
9 c% C$ Y: G2 N1 Z❞: R% u& E+ n0 k3 [8 A. |
其中「接口配置文件」是openOCD支持的下载接口,在 scripts\interface 文件夹下:$ R0 F* c# P9 P' y+ D
- y" e( J v* q9 \' k* @& c/ g' e8 D目标芯片配置文件是openOCD支持的目标芯片,在 scripts\target 文件夹下;
# p7 c: G% Y& \* |' o
) N$ Z8 `' N" I @$ `- H$ |
比如这里我使用ST-Link v2-1下载器+STM32L431RCT6,结果如图:
3 O# P: U7 c( @/ w, f' X( g: V! a
, \& t# s/ J8 I! ]4 R) d' L! n
% M5 c' i( J+ z: {
2. 下载程序: D$ J; R! |* f! R
成功连接到目标芯片后,需要使用 telnet 协议连接到 openOCD 终端,端口4444,这里我使用mobaxterm:4 U3 m2 g8 r) D! P6 L, y) w" w* t
3 E' ?' Y- Z% z
/ R; x, ?1 X. e/ G8 Y连接之后需要注意,此时终端所在的路径是openOCD开启服务的路径,可以使用pwd命令查看:* P9 w/ K6 o: X* ^
" p( i/ b1 O' y" L& Q9 _( `+ U7 P
4 S2 Q6 R# l# e0 T/ O8 c
连接到openOCD终端之后,按照下面三个步骤下载程序。
1 w2 H& b, d; M# w4 w1 ^
6 M6 P* A/ n! l① 目标芯片挂起,停机:
2 z6 f7 F# W8 ]' M: L" ~1 \1 F# j1 b- <font face="微软雅黑" size="3">halt</font>
复制代码 ② 烧写:1 H' q4 W+ |1 b* r( f
- <font face="微软雅黑" size="3">flash write_image erase <要下载的文件> <flash烧写起始地址></font>
复制代码 ③ 复位:
2 [! L: J, W7 f+ g% o! Q, C1 j- <font face="微软雅黑" size="3">reset</font>
复制代码
& E8 v3 w" Z n. |/ W9 l2 D" K# `: |* X, T+ W8 z& `* j# }
3. 一行命令完成
, |$ ]/ K. x& F, ^1 S( \可以在启动openOCD的时候,使用 -c 参数带上要执行的命令,通过一行命令完成烧写和复位,「无需新建终端使用 telnet 连接openOCD」。
1 g. x/ @# L) p D- <font face="微软雅黑" size="3">openocd -f <接口配置文件> -f <目标芯片配置文件> -c <要执行的命令></font>
复制代码 比如之前的过程可以综合为:; J3 H5 B, J2 _# R& }
- <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>
复制代码 下载结果如下:6 h) l6 g1 N/ s2 t! q# j) s( m: [
2 K* ~% F' [; R$ C4 A1 a
% T" c% n( a# b4 X# Z' ~
四、添加到makefile中实现一键下载
5 i8 G* r& g3 w7 R C) j0 O# e' H1. 添加makefile伪目标
4 o4 p( \" z3 t* QopenOCD虽然可以通过一行命令完成下载,每次都要输入这么多过于麻烦。
3 T, |2 A- C7 L; ?" i. Y6 k2 A9 q I; h+ u4 F
「基于STM32CubeMX生成的makefile」,将其添加作为伪目标:6 x( g0 @/ S% X. W' l. B0 P. @, ]
- <font face="微软雅黑" size="3">#######################################
- B ~% J: ?, b6 g0 G% S - # download
p& H3 l3 H) |$ m x5 u o- t - #######################################
% B* M) a! k! `( P% d - download:/ x& h. m, F) K4 z
- 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* c, A" s% l: w
- </font>
复制代码 这样我们就可以使用下面这行命令完成烧写:
6 z- U0 R% F- l4 O _ N- <font face="微软雅黑" size="3">make download</font>
复制代码 2. 优化makefile/ f; @: {( ^$ N8 u. V
对上述在makefile中添加的命令使用变量进行优化,方便以后不同的工程进行修改:
0 M+ {0 q% F: @$ N0 u- <font face="微软雅黑" size="3">#######################################. T* L6 W; \3 z
- # download$ Q+ C5 n) F+ l
- #######################################
: P2 c5 j8 k' T5 a - OPENOCD_ROOT = G:\develop_tools\openOCD\xpack-openocd-0.11.0-1
$ D0 G) o3 b! K) r# m3 f% ?# g - OPENOCD_INTERFACE = stlink-v2-1.cfg
, a: N, c1 L* B, h4 }" M - OPENOCD_TARGET = stm32l4x.cfg
% \) C+ c! Y9 s) m' K6 ?% g - OPENOCD_FLASH_START = 0x08000000 H4 `9 F4 o( ^& z9 @! r3 U1 u
- PWD_DIR = E:/MCU/STM32L431RC-BearPi/usart1-fpu-test
" E" Y3 |0 R! U+ z
4 @' e7 Y, ?+ M( V" n; V- download:6 b; S d9 v @, q& }" S/ i
- 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>
复制代码
" t: E! G; h A$ @
4 _3 x8 f, t" T' |
6 G! H3 t/ `( A) S4 F9 ^ |