请选择 进入手机版 | 继续访问电脑版

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

Windows上使用 OpenOCD 给 STM32 下载程序

[复制链接]
STMCU小助手 发布时间:2021-7-26 10:52
一、OpenOCD介绍6 k* L9 a& f3 J& E4 n; ^
openocd全名叫做Open On-Chip Debugger,是一个自由开放的片上调试工具和编程工具,目前已经发布到0.11.0版本,目前主流调试器几乎都支持。1 I) v4 o7 L. w9 u( b, o% f& x  U
  [- R! ~- S) j8 E) N( @6 `
支持下载器列表(部分):
6 {  s: F* {7 ]- i% c% h+ W* e$ X! d0 k3 X
CMSIS-DAP v2 (USB bulk based) adapter driver
: b/ K, w- l# R7 ONuvoton Nu-Link and Nu-Link2 adapter drivers
* n5 c6 n9 }" S. {8 R+ lNXP IMX GPIO mmap based adapter driver9 T  Z- u1 p, {
ST-Link consolidate all versions in single config
) T! _1 C* D2 R2 ~2 K+ V( NST-Link read properly old USB serial numbers
2 z  P' C( j+ G: d/ n# ZSTLink/V3 support (for ST devices only)/ b& W' o, k, a! z% R: i6 N- A

% F" ~- }; }; U! [二、安装openOCD
- o' y# v" W9 s" N
1. 下载openOCD5 i! B3 \, ?, I+ z; f
下载地址:- L8 E, v3 `# L% L- S5 D
https://github.com/xpack-dev-tools/openocd-xpack/releases4 Z+ g/ J, }" V5 C
1.png
' f" H$ k  Q) S  R* Z4 {7 M/ R" r0 x, \0 e5 Z; c
2. 安装openOCD" p1 ^0 ?7 f# Z, ?) w) a  ^
这是第三方编译好的软件,解压后配置环境变量即可。
9 q4 J7 h) ?, z) x7 ^9 b$ a2 Y: | 2.png
9 `6 ~6 `" g# j: V3 f1 Jopenocd可执行程序在 bin 目录下,将 bin 目录路径添加到环境变量中:; F9 U# A+ G$ i% F6 M
3.png * v; C- |9 t; O
配置好之后「重启电脑」。. @9 G) H/ I% k- ^8 i

/ b5 i4 N, Z* D: J, E4 G8 }- ]3. 检查是否安装完成; ~- z6 l' ]; ?7 x8 w
重启后打开命令行,检查是否可以查看openocd版本:
4 @5 }6 R/ T9 o3 q  w+ r 4.png
0 f1 ~5 x, f& _, a
0 ^/ t$ t, u! E+ c三、openOCD使用方法
0 q8 _& ~$ S5 X2 x! R2 ~9 M1. 连接到目标芯片
, a' j5 R0 R9 w: S7 c* Z3 r3 vopenOCD连接目标芯片的命令格式为:
+ h$ T% Y6 H1 i8 e8 }! m- j% V8 L
- f! n: Q# j* {openocd -f <接口配置文件> -f <目标芯片配置文件>
7 [8 N& k; ]( n
; R7 D( T7 y8 x. @% N接口配置文件和目标芯片配置文件需要使用绝对路径。
( w! ]( P0 g8 k, ?% r; {' G( G$ r- f* l+ f2 C/ B/ Q% `
# g& ^8 w8 w; ?! Q" \) G9 [
其中「接口配置文件」是openOCD支持的下载接口,在 scripts\interface 文件夹下:
' {2 p" v3 K. d, ?$ U3 ^0 O& E 5.png ; X5 {7 B0 ]0 q  N, O
目标芯片配置文件是openOCD支持的目标芯片,在 scripts\target 文件夹下;: f5 P1 r5 l8 w3 c
6.png
/ F9 R$ W, d2 D比如这里我使用ST-Link v2-1下载器+STM32L431RCT6,结果如图:9 ~! ~* P, L) ^5 p$ z# v; }7 p
7.png 5 i& ]( q. }" s) P. O' [# A( M

# |0 |  `6 p+ Y/ i# y8 m7 P2. 下载程序+ v8 q$ b% X* a; {: F1 n
成功连接到目标芯片后,需要使用 telnet 协议连接到 openOCD 终端,端口4444,这里我使用mobaxterm:
$ P  W2 f' B6 A9 g, p0 `2 V* A 8.png
; o" S$ r8 j' d2 [, j' I1 ^2 q 9.png ) `4 q3 k; _' J. y2 @
连接之后需要注意,此时终端所在的路径是openOCD开启服务的路径,可以使用pwd命令查看:
5 i" |9 ]1 e& a8 V1 n+ O& V 10.png & e( u  F% @) [+ z, ^0 q+ v
5 E. D/ Q0 D8 m  C& I3 w! U
连接到openOCD终端之后,按照下面三个步骤下载程序。
) q& V2 a( n8 V" ~/ K) x& V: c0 Y4 v, F  r1 ~
① 目标芯片挂起,停机:- q' n4 z1 L1 R5 f& \
  1. <font face="微软雅黑" size="3">halt</font>
复制代码
② 烧写:
& N/ m" L) k- G
  1. <font face="微软雅黑" size="3">flash write_image erase <要下载的文件> <flash烧写起始地址></font>
复制代码
③ 复位:9 @9 `5 V% E* ]' i
  1. <font face="微软雅黑" size="3">reset</font>
复制代码
11.png
9 a8 C5 `- V( M: w6 T5 D* R
) E  \$ b: k) Q5 ^  A, {3. 一行命令完成
( E! y, L8 n/ @0 H可以在启动openOCD的时候,使用 -c 参数带上要执行的命令,通过一行命令完成烧写和复位,「无需新建终端使用 telnet 连接openOCD」。4 w* b- b% j& U  O) j- j8 Q
  1. <font face="微软雅黑" size="3">openocd -f <接口配置文件> -f <目标芯片配置文件> -c <要执行的命令></font>
复制代码
比如之前的过程可以综合为:
, w( I  z% x  c. J$ Z; {/ m
  1. <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>
复制代码
下载结果如下:
( D/ z2 x# S- o# w 12.png / D. Q1 v, p, q$ l+ w( ]

. q) s' o* X# i四、添加到makefile中实现一键下载5 J7 D% e0 q" c$ q6 w/ u. D4 l
1. 添加makefile伪目标
! K' A, B5 w2 b- [) HopenOCD虽然可以通过一行命令完成下载,每次都要输入这么多过于麻烦。
5 l8 W$ }) S. n! f
! \' ?5 R! Z. M6 o「基于STM32CubeMX生成的makefile」,将其添加作为伪目标:
. G3 ]) P( ?( G% f. Z/ ~" t9 A
  1. <font face="微软雅黑" size="3">#######################################, g$ z+ ^* _7 e, Q7 Q
  2. # download
    ) A2 p& {( @# x* a( U8 I
  3. #######################################1 ~+ O5 s" a8 k! K0 O1 [. x7 z  S
  4. download:" m, l) Z* R6 ^' V* {3 O  E
  5. 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 x. D; k0 y: k# d2 G, {
  6. </font>
复制代码
这样我们就可以使用下面这行命令完成烧写:. d. b' V0 ?% P/ A) u( E
  1. <font face="微软雅黑" size="3">make download</font>
复制代码
2. 优化makefile) l( ~2 i, N+ u2 r6 A, }
对上述在makefile中添加的命令使用变量进行优化,方便以后不同的工程进行修改:
% k) F# u. z, v+ E
  1. <font face="微软雅黑" size="3">#######################################! I6 l. T( m% C9 B& V" w
  2. # download) T) @/ h+ b6 t" M  n6 u6 J7 V
  3. #######################################) z7 C6 }# l- h# J; p1 U$ n
  4. OPENOCD_ROOT = G:\develop_tools\openOCD\xpack-openocd-0.11.0-1
    9 t# t9 k) r1 H2 s* K; F  N  @
  5. OPENOCD_INTERFACE = stlink-v2-1.cfg
    & `6 l$ O7 F2 }3 S! T4 n
  6. OPENOCD_TARGET = stm32l4x.cfg1 c) V8 m8 V2 h* N- X
  7. OPENOCD_FLASH_START = 0x08000000
    ! A' |& c) N. E5 _
  8. PWD_DIR = E:/MCU/STM32L431RC-BearPi/usart1-fpu-test2 T, C4 d/ X* }+ C, E

  9. , D* ?% f3 }2 z; f. s8 E
  10. download:% {7 f* F7 V! b5 {; @
  11. 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>
复制代码
# N6 i! ], y$ N9 u1 e5 I

# F& Y- k5 C( i$ s0 e1 ]& ]2 C, Y8 p
收藏 1 评论1 发布时间:2021-7-26 10:52

举报

1个回答
goyhuan 回答时间:2021-7-26 11:17:54
跟直接用原厂提供的烧录软件进行烧录有什么区别?
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版