该文章转载自微信公众号“大龄菜鸟”的文章《STM32结合eclipse+OpenOCD在RAM中调试程序》。
1.1 背景
由于MCU的Flash有一定的擦除寿命,所以在调试阶段,为了减小对Flash寿命的影响,可以考虑将编写好的调试程序下载到MCU的RAM中进行调试。
1.2 测试平台
这里使用的开发环境和相关硬件如下。
-
操作系统:Ubuntu 20.04.2 LTS x86_64(使用uname -a命令查看)
-
集成开发环境(IDE):Eclipse IDE for Embedded C/C++ Developers,Version: 2021-06 (4.20.0)
-
MCU固件下载和调试软件:Open OCD,Version: 0.10.0
-
硬件开发板:STM32F429I-DISCO
1.3 操作步骤
这里以一个闪灯的简单程序为例(工程名称:STM32F429I-DISCO)来说明具体的操作步骤。
(1) 首先确保该程序在默认下载到Flash中的配置时是可以正常通过OpenOCD进行下载和调试的。
(2) 修改链接脚本文件,这里的文件名称是STM32F429ZITx_FLASH.ld,为ST的官方文件。找到该文件中的MEMORY段,修改之前如下所示。
/* Specify the memory areas */
MEMORY
{
FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 2048K
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 192K
CCMRAM (rw) : ORIGIN = 0x10000000, LENGTH = 64K
}
将以上内容修改成下面的设置。即将FLASH的地址映射到RAM空间,这里的MCU型号是STM32F429ZIT,有192KB的RAM,这里将前128KB的RAM设置成程序代码存储空间,后64KB的RAM设置成程序运行时的数据空间。
MEMORY
{
FLASH (rx) : ORIGIN = 0x20000000, LENGTH = 128K
RAM (xrw) : ORIGIN = 0x20020000, LENGTH = 64K
CCMRAM (rw) : ORIGIN = 0x10000000, LENGTH = 64K
}
(3) 由于程序代码被放置在RAM中运行,所以需要将中断向量表也重新映射到RAM空间。这里只需要在system_stm32f4xx.c文件中搜索VECT_TAB_SRAM,将#define VECT_TAB_SRAM的注释去掉,使VECT_TAB_SRAM这个宏有定义即可。
(4) 以上修改完成之后,重新编译链接工程代码即可,这时可以看到在最终生成的.map文件中的程序代码地址被映射到了0x20000000为起始地址的RAM存储区中了。
(5) 接着需要对OpenOCD的下载配置进行一些修改。鼠标单击eclipse工具栏上臭虫图标右边的倒三角,在下拉菜单中单击“Debug Configurations...”,如图1所示。也可以通过菜单“Run->Debug Configurations...”进行设置。
图1 打开调试配置方法
(6) OpenOCD的下载配置是在之前可以正常通过Flash来下载和调试的配置基础上进行的修改。因此,只需在弹出的Debug Configurations窗口中找到“GDB OpenOCD Debugging”下和当前工程对应的下载调试配置项,这里是STM32F429I-DISCO Debug,选中该配置项,然后切换到Startup选项卡,在“Runtime Options”组中勾选“Debug in RAM”,然后单击右下角的“Apply”保存设置,最后单击“Debug”按钮即可将程序下载到MCU的RAM中运行并调试。如图2所示。
图2 OpenOCD下载配置
(7) 全速运行程序之后,可以看到2个LED在闪烁。退出程序调试,然后给板子断电后再上电,可以发现LED灯不闪烁了,说明前面下载的程序已经丢失,可以证明前面的程序确实是下载到了RAM中运行的。
1.4 参考链接
- how can i debug code in ram ?
https://embdev.net/topic/185672
- STM32程序下载到SRAM调试方法
https://blog.csdn.net/u012780211/article/details/107878394