Eclipse 用于闪存和Ram调试的STM32 GDB/OpenOCD命令和初始化

Eclipse 用于闪存和Ram调试的STM32 GDB/OpenOCD命令和初始化,eclipse,debugging,gdb,stm32,openocd,Eclipse,Debugging,Gdb,Stm32,Openocd,我正在寻找有关正确的GDB/OpenOCD初始化和运行命令(外部工具)的帮助,以便在Eclipse中使用这些命令进行flash和RAM调试,以及需要在该MCU的flash vs RAM构建的makefile中包含的正确修改或添加,如果这当然重要的话 MCU:STM32F103VET6 我正在使用EclipseHelios和Zylin嵌入式CDT、Yagarto工具和BIN、OpenOCD 0.4,并且有一个Olimex ARM-USB-OCD JTAG适配器 我已经配置了ARM-USB-OCD,

我正在寻找有关正确的GDB/OpenOCD初始化和运行命令(外部工具)的帮助,以便在Eclipse中使用这些命令进行flash和RAM调试,以及需要在该MCU的flash vs RAM构建的makefile中包含的正确修改或添加,如果这当然重要的话

MCU:STM32F103VET6

我正在使用EclipseHelios和Zylin嵌入式CDT、Yagarto工具和BIN、OpenOCD 0.4,并且有一个Olimex ARM-USB-OCD JTAG适配器

我已经配置了ARM-USB-OCD,并将其添加为Eclipse中的一个外部工具。为了初始化OpenOCD,我在Eclipse中使用了以下命令。线路板配置文件引用stm32 MCU:

openocd -f interface/olimex-arm-usb-ocd-h.cfg -f board/stm32f10x_128k_eval.cfg
当我在Eclipse中运行这个程序时,一切似乎都在工作(GDB接口、OpenOCD找到MCU等)。我还可以远程登录OpenOCD并运行命令。 所以,我被困在下一部分;用于闪存和RAM调试以及擦除闪存的初始化和命令


我阅读了好几篇教程,浏览了网络,但没有找到这个处理器的任何特别之处。我是新手,所以我可能不认识一个等效的产品作为例子。

我正在使用相同的工具链来编程和调试STM32F107板。以下是我在这个工具链下编程和调试STM32Fxxx芯片的观察结果


起始点 所以在这一点上,你已经有了一个工作的OpenOCD到ARM-USB-OCD连接,所以你应该在这一点上做好准备。现在的工作是让Eclipse/Zylin/Yagarto-GDB组合通过OpenOCD/Olimex连接正确地与STM32Fxxx通信。需要记住的一点是,所有要发出的OpenOCD命令都是运行模式命令。用于调用OpenOCD服务器的配置脚本和命令行选项是配置模式命令。发出init命令后,服务器将进入运行模式,这将打开接下来需要的命令集。您可能在其他地方做过,但我在调用OpenOCD服务器时添加了一个'-c“init”'选项,如下所示:

openocd -f /path to scripts/olimex-arm-usb-ocd-h.cfg -f /path to targets/stm32f107.cfg -c "init"
下面我发出的命令是通过Eclipse调试配置对话框完成的。在Zylin Embedded debug(Native)部分下,我创建了一个新的配置,给它一个名称、项目(可选)和要编程的二进制文件的绝对路径。在Debugger选项卡下,我将调试器设置为嵌入式GDB,指向Yagarto GDB二进制路径,不设置GDB命令文件,将GDB命令设置为标准,将协议设置为mi


命令选项卡-将GDB连接到OpenOCD 因此,下一个选项卡是Commands选项卡,这就是问题的核心所在。您有两个空间初始化并运行。除了猜测它们发生在GDB调用之前和之后之外,不确定到底有什么区别。不管怎样,我都没有注意到我的命令在运行方式上有什么不同

但无论如何,按照我在网上找到的示例,我用以下命令填充了初始化框:

set remote hardware-breakpoint limit 6
set remote hardware-watchoint-limit 4
target remote localhost:3333
monitor halt
monitor poll
前两行告诉GDB您有多少断点和观察点。说GDB不能查询这些信息,所以我自己说。下一行命令GDB通过端口3333连接到本地主机上的远程目标。最后一行是monitor命令,它告诉GDB将命令传递给目标,而不采取任何行动。在本例中,目标是OpenOCD,我给它命令halt。之后,我告诉OpenOCD切换到异步操作模式。由于下面的一些操作需要一段时间,所以不要让OpenOCD阻塞并等待每个操作

侧注#1:如果您对GDB或OpenOCD的状态有任何疑问,那么在调用此调试配置后,您可以使用Eclipse调试控制台向GDB或OpenOCD发送命令(通过GDB监视器命令)


“命令”选项卡-设置用户闪存 接下来是我在“运行命令”部分给出的命令:

monitor flash probe 0
monitor flash protect 0 0 127 off
monitor reset halt
monitor stm32x mass_erase 0
monitor flash write_image STM3210CTest/test_rom.elf
monitor flash protect 0 0 127 on
disconnect
target remote localhost:3333
monitor soft_reset_halt
将在以下章节中解释

设置对用户闪存的访问 首先,我发出一个OpenOCD查询,看看它是否能找到flash模块并报告正确的地址。如果它回应说它在地址0x08000000找到了闪存,那么我们就没事了。末尾的0指定获取有关闪存组0的信息

侧注#2:STM32Fxxx零件特定数据表在第4节中有一个内存映射。在使用芯片的过程中,随身携带非常有用。此外,由于所有内容都是作为内存地址访问的,因此在编程一段时间后,您将像手背一样了解此布局

因此,在确认闪存已正确配置后,我们调用命令关闭对闪存组的写保护。描述您需要了解的有关闪存编程的所有信息。对于该命令,您需要知道的是闪存组、起始扇区、结束扇区,以及是否启用或禁用写保护。闪存库是在您传递给OpenOCD的配置文件中定义的,并由上一个命令确认。因为我想对整个闪存空间禁用保护,所以我指定了扇区0到127。PM0075解释了我是如何得到这个数字的,因为它指的是闪存是如何为我(和你)的设备组织成2KB的页面的。我的设备有256KB的闪存,这意味着我有128页。您的设备有512KB的闪存,因此您将有256页。要确认设备的写保护已正确禁用,可以使用OpenOCD命令检查地址0x40022020处的FLASH_WRPR寄存器:

monitor mdw 0x40022020
它打印的结果字将是0xffffffff,这意味着所有页面都禁用了写保护。0x00000000表示所有页面都启用了写保护

旁注#3:关于自我的主题
symbol-file STM3210CTest/test_rom.elf
thbreak main
continue