首页 > 代码库 > eclipse + st-link + openocd + gdb 开发 stm32f4

eclipse + st-link + openocd + gdb 开发 stm32f4

st-link win8上的支持不太好,据说是因为 st-link 硬件没有数字签名,win8 强制要求硬件必须有数字签名。虽然平时还是用的盗版 jlink 比较多一点,但是手上这块 discovery 板子只有板载的 st-link

下载zadig

首先下载 zadig,这是一个开源的win驱动,可以让win8识别出 st-link 硬件。

下载openocd

然后下载 openocd,这相当于调试代理。优点是支持较多的仿真器。可以通过4444端口 telnet 访问进行程序烧录,或者由gdb访问3333端口进行调试。

下载完毕并将 bin 目录加入环境变量,然后输入如下命令。

$ openocd-x64-0.7.0.exe -v

Open On-Chip Debugger 0.7.0 (2013-05-05-10:44)

Licensed under GNU GPL v2

For bug reports, read

 

http://openocd.sourceforge.net/doc/doxygen/bugs.html

 

然后连上我们的硬件,再用 -f 指定板子对应的配置文件,下载下来的文件夹中已经有一些写好的配置文件,其中就有针对 discovery 板的。

$ openocd-x64-0.7.0.exe -f stm32f4discovery.cfg

Open On-Chip Debugger 0.7.0 (2013-05-05-10:44)

Licensed under GNU GPL v2

For bug reports, read

 

http://openocd.sourceforge.net/doc/doxygen/bugs.html

 

srst_only separate srst_nogate srst_open_drain connect_deassert_srst

Info : This adapter doesn‘t support configurable speed

Info : STLINK v2 JTAG v14 API v2 SWIM v0 VID 0x0483 PID 0x3748

Info : Target voltage: 2.887346

Info : stm32f4x.cpu: hardware has 6 breakpoints, 4 watchpoints

如果出现如上显示,那么恭喜,已经可以开始调试了。

telnet实现flash烧录

使用 telnet 打开本地的 4444 端口。输入如下命令,即可实现程序烧录。这里我们烧录的是 MDK 编译出来的 axf 格式文件,之所以也支持 axf,是因为 axf 本质是一种 elf 文件。

reset halt

sleep 100

flash write_image erase demo.axf

sleep 100

verify_image demo.axf

sleep 100

reset run

使用 arm-none-eabi-gdb 调试

eclipse 调试原理是一样的,只不过多了个GUI

$ arm-none-eabi-gdb demo.axf

载入符号表。然后连接到 3333 端口。

(gdb) target remote localhost:3333

Remote debugging using localhost:3333

warning: Loadable segment "RW_IRAM1" outside of ELF segments

<Reset_Handler> ()

at ..\..\..\Libraries\CMSIS\ST\STM32F4xx\Source\Templates\arm\/startup_stm32

f4xx.s:175

175 LDR R0, =SystemInit

(gdb) monitor reset halt

target state: halted

target halted due to debug-request, current mode: Thread

xPSR: 0x01000000 pc: 0x0800019c msp: 0x20000c78

(gdb)

然后可以就可以用各种 gdb 命令调试了。

(gdb) b main

Breakpoint 1 at 0x8004546: file ..\/main.c, line 75.

(gdb) c

Continuing.

Note: automatically using hardware breakpoints for read-only addresses.

 

Breakpoint 1, main () at ..\/main.c:75

75 STM_EVAL_PBInit(BUTTON_USER, BUTTON_MODE_EXTI);

(gdb) s

STM_EVAL_PBInit (Button=BUTTON_USER, Button_Mode=BUTTON_MODE_EXTI)

at ..\/..\..\Utilities\STM32F4-Discovery\stm32f4_discovery.c:195

195 RCC_AHB1PeriphClockCmd(BUTTON_CLK[Button], ENABLE);

(gdb)

缺点无疑是这样太不直观。

eclipse 调试

当然首先你得有 cdt 插件,然后安装的时候记得把 gdb hardware debugging 选上,默认是不会安装的。

然后就按照图示都填好,其实图示和上面gdb原理完全一样。

最后不用 load image,因为已经通过telnet将程序烧录了,调试eclipse只需符号表即可。下面是调试界面:

后记

当然,你如果会用 arm-none-eabi-ld,就可完全抛弃商业软件。