Ubuntu下使用OpenOCD通过Jlink烧写HEX到STM32

时间:2023-02-20 16:01:26

本文地址:http://blog.csdn.net/smarxx/article/details/8486052,转载请保留

本文前提:

    1、OpenOCD(v0.6)已经装好,并且打开Jlink功能

    2、OpenOCD 已经能够正确识别Jlink。

    3、OpenOCD 可以访问Jlink设备(udev允许普通用户访问Jlink)

一、链接到STM32

打开一个终端,输入下面命令通过jlink连接到stm32:

smx@smx-Think:~$ openocd -f interface/jlink.cfg -f target/stm32f1x.cfg

说明:

    1、jlink.cfg 位于 /usr/share/openocd/scripts/interface/,无需输入jlink.cfg的完整路径, 但是如果省略“interface/”,则会提示无法找到文件。

    2、stm32f1x.cfg 位于/usr/share/openocd/scripts/target。

    “ /usr/share/openocd/scripts/” 存放着OpenOCD的相关脚本,如果通过源码编译安装OpenOCD的话,也可以在源码所在文件夹的tcl文件夹找到这些脚本。

如果看到下面的提示,则说明OpenOCD已经能够通过Jlink控制STM32了。

Open On-Chip Debugger 0.6.1 (2012-12-28-16:52)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.sourceforge.net/doc/doxygen/bugs.html
Info : only one transport option; autoselect 'jtag'
adapter speed: 1000 kHz
adapter_nsrst_delay: 100
jtag_ntrst_delay: 100
cortex_m3 reset_config sysresetreq
Info : J-Link initialization started / target CPU reset initiated
Info : J-Link ARM V8 compiled May 20 2010 17:07:46
Info : J-Link caps 0xb9ff7bbf
Info : J-Link hw version 80000
Info : J-Link hw type J-Link
Info : J-Link max mem block 9464
Info : J-Link configuration
Info : USB-Address: 0xff
Info : Kickstart power on JTAG-pin 19: 0xffffffff
Info : Vref = 2.672 TCK = 1 TDI = 0 TDO = 0 TMS = 0 SRST = 0 TRST = 0
Info : J-Link JTAG Interface ready
Info : clock speed 1000 kHz
Info : JTAG tap: stm32f1x.cpu tap/device found: 0x3ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x3)
Info : JTAG tap: stm32f1x.bs tap/device found: 0x16410041 (mfg: 0x020, part: 0x6410, ver: 0x1)
Info : stm32f1x.cpu: hardware has 6 breakpoints, 4 watchpoints

二、连接到OpenOCD守护程序

打开另一个终端,输入一下命令连接到OpenOCD守护程序。后面的所有命令都是在这个终端运行的。

smx@smx-Think:/mnt/d/VC_Work/Backup$ telnet localhost 4444
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Open On-Chip Debugger
>
说明:

    成功通过Jlink连接到STM32上之后,OpenOCD会监听本机的4444端口。通过telnet登录上去,之后就可以控制OpenOCD干些什么了。


三、烧写程序到STM32

在打开的第二个终端执行以下命令,把程序/foo/bar.hex写入STM32。

> halt                                                               
target state: halted
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x080002c2 msp: 0x20000710
> flash write_image erase /foo/bar.hex
auto erase enabled
wrote 28672 bytes from file /foo/bar.hex in 1.814544s (15.431 KiB/s)
> reset
JTAG tap: stm32f1x.cpu tap/device found: 0x3ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x3)
JTAG tap: stm32f1x.bs tap/device found: 0x16410041 (mfg: 0x020, part: 0x6410, ver: 0x1)
>

说明:

    1、halt : 

        挂起STM32,相当于关机,不执行halt,无法把程序写入STM32的Flash

    2、flash write_image erase /foo/bar.hex :

         flash write_image: 写入镜像,支持的类型有bin文件、hex文件、elf文件、s19文件(Motorola s19)、mem、builder,详情参见OpenOCD手册关于Flash命令章节

        erase:写入程序前先擦除Flash用到的扇区。如果要写入程序的所有扇区已经用“Flash erase_sector”命令擦除过,则可以去掉“erase”选项。

       /foo/bar.hex:指定要写入的程序bar.hex,位于/foo/。

    3、reset:

       复位STM32

四、OpenOCD的其他命令

       1、查看flash的bank序号:

> flash banks
#0 : stm32f1x.flash (stm32f1x) at 0x08000000, size 0x00010000, buswidth 0, chipwidth 0
>
      由返回的信息(#0)可以知道,bank序号是0。bank序号在某些指令上要用到。

      2、查看Flash擦除状态:

> flash erase_check 0   
Target not halted
unknown error when checking erase state of flash bank #0 at 0x08000000
# 0: 0x00000000 (0x400 1kB) erase state unknown
# 1: 0x00000400 (0x400 1kB) erase state unknown
# 2: 0x00000800 (0x400 1kB) erase state unknown
……
# 60: 0x0000f000 (0x400 1kB) erase state unknown
# 61: 0x0000f400 (0x400 1kB) erase state unknown
# 62: 0x0000f800 (0x400 1kB) erase state unknown
# 63: 0x0000fc00 (0x400 1kB) erase state unknown
in procedure 'flash'
>
说明:

    flash erase_check命令后面的“0”就是bank序号。

    3、擦除指定区域

> flash erase_sector 0 61 63
erased sectors 62 through 63 on flash bank 0 in 0.053325s
>

说明:

    命令后面的三个参数“0 61 63”,分别为bank序号,起始扇区,终止扇区

    4、设置jtag速度

> adapter_khz 10000
adapter speed: 10000 kHz
>

说明:

    参数10000为jtag速度,单位是Khz。


备注:

    本文所列命令在OpenOCD0.6.1上执行通过。OpenOCD命令并不是固定不变的。不同版本对应命令可能有所不同。最好查看一下对应版本的手册。