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

Windows上使用 OpenOCD 给 STM32 下载程序

[复制链接]
STMCU小助手 发布时间:2021-7-26 10:52
一、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 1.png . 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 2.png
8 i  q( y2 c) zopenocd可执行程序在 bin 目录下,将 bin 目录路径添加到环境变量中:+ G/ C# L+ }: E( g
3.png
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; { 4.png 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# k3 a* ~4 i2 ]) [  J, Y, A1 W
其中「接口配置文件」是openOCD支持的下载接口,在 scripts\interface 文件夹下:4 y" N: d3 ]$ K# \+ Z# S
5.png ; n! J: V8 L) n0 B
目标芯片配置文件是openOCD支持的目标芯片,在 scripts\target 文件夹下;* G/ u7 j# U+ j  \0 U5 o
6.png ; ]5 _: t- e) W) @/ o- {$ H
比如这里我使用ST-Link v2-1下载器+STM32L431RCT6,结果如图:
/ P! L! N( y1 B 7.png
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 8.png , ?" y# ?2 U( i3 Z8 x, E
9.png
, I, L& h. c* r6 b% e. n# y连接之后需要注意,此时终端所在的路径是openOCD开启服务的路径,可以使用pwd命令查看:+ [& c& T( G1 U: L0 y
10.png # 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 }
  1. <font face="微软雅黑" size="3">halt</font>
复制代码
② 烧写:- B* F* r' U+ g  s* P
  1. <font face="微软雅黑" size="3">flash write_image erase <要下载的文件> <flash烧写起始地址></font>
复制代码
③ 复位:4 u  m0 s& x- j- Q3 a
  1. <font face="微软雅黑" size="3">reset</font>
复制代码
11.png
- 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
  1. <font face="微软雅黑" size="3">openocd -f <接口配置文件> -f <目标芯片配置文件> -c <要执行的命令></font>
复制代码
比如之前的过程可以综合为:7 V$ w' i) P, Z
  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>
复制代码
下载结果如下:
! s  N0 b- e' o$ A" O 12.png % 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
  1. <font face="微软雅黑" size="3">#######################################. u; S5 _' F" N& f! n- n4 ]
  2. # download* C; F2 s* K1 S5 k, l! z
  3. #######################################
    ; B4 [! N' _! d7 Z! x7 G
  4. download:
    9 C' J$ Y  O; R* H
  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 U; F% w2 ^6 j1 e! |; v6 A: n
  6. </font>
复制代码
这样我们就可以使用下面这行命令完成烧写:; k% Z9 w/ A# z! s; t/ n# w
  1. <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
  1. <font face="微软雅黑" size="3">#######################################8 t! l9 O6 f( t- `* X) a7 s7 [
  2. # download
    & }0 Q  Y, t4 k7 P0 d! e
  3. #######################################
    3 [% R2 b# A' Q4 c  ]& Q
  4. OPENOCD_ROOT = G:\develop_tools\openOCD\xpack-openocd-0.11.0-17 i* k% f) x. Z0 k5 [# S0 N  M
  5. OPENOCD_INTERFACE = stlink-v2-1.cfg
    + w. m: W; I2 S  Y( g
  6. OPENOCD_TARGET = stm32l4x.cfg2 i! G! y' e" d7 t
  7. OPENOCD_FLASH_START = 0x08000000
    - _* Y5 z1 B: c
  8. PWD_DIR = E:/MCU/STM32L431RC-BearPi/usart1-fpu-test
    : j( H; m5 f$ m
  9. $ Y8 K- X& L! Z4 M, ^$ w
  10. download:
    # h( ?6 U( B; A' `- f3 T
  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>
复制代码
- C/ r0 @% f6 J% R
# E* N, z0 z3 i. C
0 a* b9 _9 O3 n9 }) `8 @' M) w
收藏 1 评论1 发布时间:2021-7-26 10:52

举报

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