如何使用OpenOCD和GDB编程STM32闪存

4
我正在使用Olimex ARM-USB-OCD适配器,结合openOCD和GDB来编程和调试stm32f103微控制器。我使用的IDE来自Olimex开发套件光盘,并且使用了Eclipse Ganymede。
我可以将一个小程序加载到RAM中,并且毫无问题地逐步执行代码。
现在,我有一个更大的程序,它无法放入RAM中(RAM只有20K),因此我想从闪存(128K)中运行它。
我已经修改了链接脚本,指示程序代码应该放在闪存部分(地址为0x8000000),但是GDB无法加载程序。
(gdb) 
20 load main.out
&"load main.out\n"
load main.out
~"Loading section .text, size 0xb0e6 lma 0x8000000\n"
Loading section .text, size 0xb0e6 lma 0x8000000
&"Load failed\n"
Load failed

我该怎样让gdb将程序加载到闪存中?
1个回答

7
您考虑过使用OpenOCD直接烧录吗?我在类似的设置中这样做,但是使用的是ARM7微控制器。
 openocd -f flash.cfg

这是我的flash.cfg文件。
set CHIPNAME at91sam7x512

source [find interface/olimex-arm-usb-ocd.cfg]
source [find target/at91sam7sx.cfg]

init    
halt

flash probe 0
flash probe 1

flash erase_sector 0 0 15
flash erase_sector 1 0 15

flash write_image my-image.elf

at91sam7 gpnvm 0 set
at91sam7 gpnvm 1 set
at91sam7 gpnvm 2 set
shutdown

GPNVM是Atmel SAM7特有的,但我认为这个脚本应该为您制作STM32版本提供了一个良好的起点。Openocd在开始时可能有点令人困惑,但文档很好并值得阅读(http://openocd.berlios.de/)。当前稳定版本(0.4.0)相当古老,如果您遇到问题,请下载最新的源代码并编译自己。


2
最终我采用了这种方法,现在一切都正常工作了。我使用openOCD将.text和.data部分写入闪存,然后将.data部分复制到我的main()函数的开头处的RAM中。 - mksuth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接