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

Windows上使用 OpenOCD 给 STM32 下载程序

[复制链接]
STMCU小助手 发布时间:2021-7-26 10:52
一、OpenOCD介绍
4 q. W% J" m3 Bopenocd全名叫做Open On-Chip Debugger,是一个自由开放的片上调试工具和编程工具,目前已经发布到0.11.0版本,目前主流调试器几乎都支持。; B" }& Q5 |$ X2 w

# ~" @7 ^/ D$ o支持下载器列表(部分):
" F3 |# d5 t% B- t$ F/ n% `5 a9 L  L
CMSIS-DAP v2 (USB bulk based) adapter driver
' K- Q6 E& l7 bNuvoton Nu-Link and Nu-Link2 adapter drivers
% J7 g# h* E% f+ h, C: F9 ANXP IMX GPIO mmap based adapter driver' P4 {. h- K1 R" Q7 {9 V- ?: ~
ST-Link consolidate all versions in single config
, A6 `, V1 a2 U3 K( \7 B$ O) Q9 XST-Link read properly old USB serial numbers! x( d+ X4 E4 P
STLink/V3 support (for ST devices only)
8 a! j& W! c3 X( R- D9 z4 |' v- i1 R8 q1 Q' ^# c
二、安装openOCD
) X2 w* B4 w8 H# |
1. 下载openOCD
! K$ Z/ S5 V, f, N& {3 M下载地址:
' q9 J# O. H; l' c8 J( C7 O0 \1 nhttps://github.com/xpack-dev-tools/openocd-xpack/releases: c6 T  v. ~) c8 F4 u# ^
1.png
, `0 C) F  W8 G; w: o8 m8 B* M: w0 s$ ?: Z
2. 安装openOCD
2 H, L9 d" |2 l1 v& ?$ p这是第三方编译好的软件,解压后配置环境变量即可。
8 @% O* B2 S1 M 2.png 6 k) i3 \0 }' c2 `
openocd可执行程序在 bin 目录下,将 bin 目录路径添加到环境变量中:( f" M" F! t5 O( L
3.png
9 ?" u/ e- Z7 x$ E$ W配置好之后「重启电脑」。! f$ l4 \  m% F- @$ v

: z6 n. U. q: h: v  r& b3. 检查是否安装完成6 M# n# ]* O7 [% |# a. B' K) V
重启后打开命令行,检查是否可以查看openocd版本:& r; W0 `( O! Y. r. N+ R
4.png - h4 v! n- P2 F5 E
* t% C5 k# O/ L; `# k7 B
三、openOCD使用方法
+ \8 h% s' u. |2 C" r1. 连接到目标芯片
. X8 y9 n# ?+ o: G  O4 y8 M" m9 u; mopenOCD连接目标芯片的命令格式为:; i1 i5 L# X: [4 b) d
/ T; G: h2 S$ E8 u. K; }
openocd -f <接口配置文件> -f <目标芯片配置文件>7 K9 |2 E1 V8 f! U

3 T2 F8 m* X- [接口配置文件和目标芯片配置文件需要使用绝对路径。
: J& y  L( O: z4 W6 b. i4 S8 k6 R( g5 A% s, y8 x3 j7 c

% p, f+ Y( l- l6 F其中「接口配置文件」是openOCD支持的下载接口,在 scripts\interface 文件夹下:5 ^4 I. t8 u0 ^
5.png
+ d1 `9 e9 ]% O3 U5 T目标芯片配置文件是openOCD支持的目标芯片,在 scripts\target 文件夹下;, I/ @  t7 }' q8 S# A2 q/ \! I
6.png
  a% c4 W! H9 U! b比如这里我使用ST-Link v2-1下载器+STM32L431RCT6,结果如图:' a. o7 c+ Z( s7 j1 o7 R7 J: o
7.png 3 U3 `/ |. {/ n+ ^/ m. Z  c% V, {
+ L5 E  l5 ]; E
2. 下载程序) n) u4 Y) f8 I
成功连接到目标芯片后,需要使用 telnet 协议连接到 openOCD 终端,端口4444,这里我使用mobaxterm:
+ W( n) j& {8 S  y  g 8.png * h+ f, S4 z) K- B$ _
9.png
/ p" C9 h, n8 F4 }" @# Z# j7 a连接之后需要注意,此时终端所在的路径是openOCD开启服务的路径,可以使用pwd命令查看:
3 l1 B% I9 T3 m. p2 g8 x6 `, I2 b 10.png 9 C) J9 p. x# Q7 V
( ?3 R2 P! Y# O& A& b2 O
连接到openOCD终端之后,按照下面三个步骤下载程序。* k. r5 |6 d0 o# V3 `) B6 }/ }

& j- m+ a0 C5 t6 T1 P( X① 目标芯片挂起,停机:( E1 ?  m: H4 Y* R8 N4 _! z
  1. <font face="微软雅黑" size="3">halt</font>
复制代码
② 烧写:& D0 l7 d/ i: d2 Z. s, w1 i% m
  1. <font face="微软雅黑" size="3">flash write_image erase <要下载的文件> <flash烧写起始地址></font>
复制代码
③ 复位:
& O! M/ _' R1 n. N) P- f
  1. <font face="微软雅黑" size="3">reset</font>
复制代码
11.png
% f2 y# N% B. R3 w  T/ M3 t, h, [/ n3 ]  H) X! g
3. 一行命令完成
3 G( O2 X" f4 o- U7 l! P可以在启动openOCD的时候,使用 -c 参数带上要执行的命令,通过一行命令完成烧写和复位,「无需新建终端使用 telnet 连接openOCD」。
4 r; n8 g2 m5 g, G( ?+ O) _  I
  1. <font face="微软雅黑" size="3">openocd -f <接口配置文件> -f <目标芯片配置文件> -c <要执行的命令></font>
复制代码
比如之前的过程可以综合为:% x2 W) S% U2 q) W, c. b/ f
  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>
复制代码
下载结果如下:
" e) X6 ~( N! `4 |8 q# a; @$ P" w 12.png : ^9 E8 X6 s5 [0 Z; U& w) t
4 r- [: |% I. ?5 }& R* ^9 {
四、添加到makefile中实现一键下载
7 j" K$ e# L' W" C; O4 N8 g. B) ]& r- K1. 添加makefile伪目标
$ y4 _/ c$ L$ j2 HopenOCD虽然可以通过一行命令完成下载,每次都要输入这么多过于麻烦。. }5 R" m+ ^: \

+ ?1 C( {. T+ E「基于STM32CubeMX生成的makefile」,将其添加作为伪目标:# d% }) S; b. Q3 A
  1. <font face="微软雅黑" size="3">#######################################
    7 N0 N! O: U! P$ `& m; z. d
  2. # download
    - `( g$ _$ @& @/ |
  3. #######################################2 R7 B& j3 J7 w% L, }9 M
  4. download:# T  b4 e5 r  x/ _& r
  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 shutdown
    ! E) W9 U; j4 ~* E$ O2 q/ y
  6. </font>
复制代码
这样我们就可以使用下面这行命令完成烧写:* f; V7 [, m# l
  1. <font face="微软雅黑" size="3">make download</font>
复制代码
2. 优化makefile# H: o5 G3 w3 m! n0 ]& X) S( g
对上述在makefile中添加的命令使用变量进行优化,方便以后不同的工程进行修改:% T- {' H% q% L
  1. <font face="微软雅黑" size="3">#######################################, O8 C" D# G3 q) x' p3 I: g
  2. # download) j" M0 e4 c7 Z, d, C- C
  3. #######################################
    , `7 T/ r" O+ T3 x5 V2 _
  4. OPENOCD_ROOT = G:\develop_tools\openOCD\xpack-openocd-0.11.0-1
    $ U, U  l' m( X
  5. OPENOCD_INTERFACE = stlink-v2-1.cfg
    + q  f1 u. A- ]; a6 V3 o
  6. OPENOCD_TARGET = stm32l4x.cfg
    $ G- Y& Z0 q! |% E1 |& J
  7. OPENOCD_FLASH_START = 0x08000000
    " m. K& Y& _# M! C& i7 u
  8. PWD_DIR = E:/MCU/STM32L431RC-BearPi/usart1-fpu-test" W* N" v, \% i- b. G

  9. ' J& f+ R# K$ D. y4 i3 N& Z2 S4 u
  10. download:
    1 F) v6 U7 m4 w0 {! g
  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>
复制代码
) Q$ O9 B1 y4 w1 Z

2 M: R4 O( @: `- G0 u9 V2 F& M! l5 s& n, O% f/ J
收藏 1 评论1 发布时间:2021-7-26 10:52

举报

1个回答
goyhuan 回答时间:2021-7-26 11:17:54
跟直接用原厂提供的烧录软件进行烧录有什么区别?

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版