为什么要RAM调试?
-
相比于FLASH调试,在RAM调试可以很快地装载代码,可以节省将代码下载到Flash的时间。
-
RAM的擦写次数几乎无限,RAM调试可延长Flash的使用寿命。图1
一、准备(这里以STM32F103C8的LED流水灯程序为例)
-
Keil mdk514
-
Template模板工程 LED流水灯,V3.5.0版本的固件库
-
示例芯片型号:STM32F103C8,芯片的BOOT引脚必须接地
二、修改工程:打开Keil mdk工程,修改以下设置
1.添加一个Project target:
如图1左Project视图中右键Template_Flash选择Manage Project Items…出现工程文件管理界面。
图1 :左为project视图,右为工程项管理界面
在弹出的工程文件管理界面作图1右图所示的设置:(1)单击添加按钮;(2)输入Target名称,如Template_RAM;(3)单击Set as Current Target按钮,然后按ok保存。
这样做的好处是:可以使用下载按钮旁边的下拉列表切换用于Flash下载的配置和进行RAM调试的配置,如图2。
图2 :编译目标选择下拉框
2.分配RAM和Flash空间:
由《STM32数据手册》得知,STM32F103C8的RAM大小为20K,根据自己索要调试的代码分配者20K的空间;
例如:如图3是流水灯程序编译后的keil输出,流水灯程序占Flash:1352字节,占RAM:268+24+1632,那么可以将STM32F103C8的20K的RAM分10k给ROM,剩下10k作为RAM。
图3:流水灯程序Build Output
单击keil工具栏中的魔术棒按钮如图4(Options for Target…)弹出工程选项窗口:
图4 :工程选项Options forTarget按钮
修改工程选项的Target标签的IROM和IRAM如图5。设置IROM的Start=0x20000000,Size=0x2800(0x2800=10k);IRAM的Start=0x20002800,Size=0x2800。
图5 :工程选项-Target标签设置
为何这样设置?
答:下图来自《Cortex-M3权威指南(中文)》84页,据图5.1知Cortex-M3内核MCU内部RAM起始地址为0x20000000,因为STM32F103C8的内部RAM=20K,因此地址范围是:0x20000000~0x20005000。这样上述设置将10k分给的代码区(IROM),将10k分给了数据区(IRAM)。
3.修改中间文件和链接文件保存路径:(文件路径跟别的Target不同即可)
如图6,打开选项的Output标签,将objects文件的保存路径改为工程目录/OBJ/RAM目录下;同理,选项的Listing标签中,将lst文件的保存路径改为工程目录/LIST/RAM目录下;
图6:工程选项-Output标签设置
目的是:避免二、1步中所示的不同配置的Target产生的中间文件和链接文件混淆。
4.添加宏定义:
在选项的C/C++标签的Preprocessor Symbols的define中添加定义:VECT_TAB_SRAM,若有别的定义,则用英文逗号隔开。
图7:工程选项-C/C++标签设置
5.清除flash编程算法以及添加初始化文件:
(1)在选项的BEBUG标签中选择右侧的仿真器如Jlink,图8左;
图8 :左 工程选项-Debug标签 ;右 单击左图Setting弹出的仿真器设置界面
然后单击右边的Settings按钮:弹出如图8右图所示设置页,选择Flash download标签,设置如下:直到将Programming Algorithm中的内容清空。选项的Utilities标签也有一个Setting按钮,里面的设置同理。
(2)在选项的BEBUG标签中选择右侧的仿真器选择下方有一个Initialization File,添加Dbg_RAM.ini文件;
说明:Dbg_RAM.ini文件来自Keil安装目录\ARM\Pack\Keil\STM32F1xx_DFP\1.1.0\Boards\Keil\MCBSTM32C\Blinky\Dbg_RAM.ini,将其复制到工程目录的USER子目录下;不同版本Keil该文件路径可能不同。该文件可手动创建,内容如下:
FUNC void Setup (void) {
SP = _RDWORD(0x20000000); // Setup Stack Pointer
PC = _RDWORD(0x20000004); // Setup Program Counter
_WDWORD(0xE000ED08, 0x20000000); // Setup Vector Table Offset Register
}
FUNC void OnResetExec (void) { // executes upon software RESET
Setup(); // Setup for Running
}
load %L incremental
Setup(); // Setup for Running
g, main
6.最后的设置:选项的Utilities标签的 Update Target Before DeBugging项不能选中!
图9:工程选项-Utilities标签
上述设置完成后,注意单击ok保存设置。
三、enjoy程序调试:
重新编译项目文件,单击keil工具栏中的Bebug按钮就可以在RAM中调试程序。
注意:
1.RAM调试Target不能用于下载,因此不能单击下载按钮;
2.调试过程中复位后必须退出Debug再重新进入Debug。原因是复位后程序回到了芯片flash的起始地址而非RAM起始地址。
3.若进入debug程序立即运行,可先在main函数或需要的地方加好断点,或者取消图8工程选项-Debug标签所示的Run to main().选项 为什么是取消勾选??不得而知。
RAM调试工程模板下载:
http://download.csdn.net/detail/weboo10000/9085393
本文详细介绍了如何在Keil v5 MDK环境下,对基于STM32F10x的固件库程序进行RAM调试。通过修改工程设置,包括分配RAM和Flash空间、更改中间文件和链接文件路径、添加宏定义等步骤,使得调试过程更加高效。同时,文章强调了RAM调试的优势以及注意事项,如不能直接下载和复位后需重新进入Debug模式。
2467

被折叠的 条评论
为什么被折叠?



