作用
(1)某些应用场合下不希望或不能修改内部 FLASH 的内容,这时就可以使用 RAM 调试功能 ,它的本质是把原来存储在内部 FLASH 的代码(CODE 及 RW-data 的内容)改为存储到SRAM 中(内部 SRAM 或外部 SDRAM 均可),芯片复位后从 SRAM 中加载代码并运行。
(2)避免 FLASH 擦写,下载程序非常快。避免FLASH可擦除次数过多失效;
(3)把代码下载到RAM,可以解锁被锁定的FLASH芯片。
注意,存储在 RAM 上的程序掉电后会丢失,不能像 FLASH 那样保存。 所以在 SRAM 中运行的代码一般只是用于调试,调试完毕后,在实际生产环境中仍然使用在内部 FLASH 中运行的代码。
步骤
芯片:STM32F103 VCT6 ,256KB FLASH,48KB SRAM
仿真器:Jlink v8
1.建立双工程
点击keil
。为了方便我们的使用,针对同一个项目和源代码,我们可以建立flash调试和SRAM调试两个工程。也可以在一个工程配置,不过需要切换,比较麻烦。
通过点击按钮,可以进行如下配置:

点击Target options魔术棒按钮可以进入SRAM工程配置界面。
2.分配内存
有两种方式。一种是配置分散加载文件,手动编辑sct文件,另一种是用MDK对话框选项。可以根据自己的需要分配内存。
2.1 配置分散加载文件

这里把32K(0x8000)当做ROM使用,即虚拟ROM,分16k(0x4000)用做RAM内存。
sct文件内容如下:
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
LR_IROM1 0x20000000 0x00008000 { ; load region size_region
ER_IROM1 0x20000000 0x00008000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
.ANY (+XO)
}
RW_IRAM1 0x20008000 0x00004000 { ; RW data
.ANY (+RW +ZI)
}
}
2.2 对话框设置
如果勾选了Use Memory Layout from Target Dialog,按如下分配。

3.配置中断向量表
由于 startup_stm32f10x.s 启动文件中的代码不是指定到绝对地址的,经过它由链接器决定应存储到内部 FLASH 还是 SRAM,所以 SRAM 版本工程中的启动文件不需要作任何修改。
重点在于启动文件定义的中断向量表被存储到内部 FLASH 和内部 SRAM 时,这两种情况对内核的影响是不同的,内核会根据它的“向量表偏移寄存器 VTOR”配置来获取向量表,即中断服务函数的入口。
下面以STM32F103VCT6为例
|
| |
![]() |

4.建立ini脚本,指定PC及SP指针
4.创建RAM.ini脚本
![]() |
FUNC void Setup (void)
RAM.ini脚本文件,放在工程目录下,脚本内容如下:
{
SP = _RDWORD(0x20000000); // 堆栈指针
PC = _RDWORD(0x20000004); // PC
_WDWORD(0xE000ED08, 0x20000000); // 中断向量偏移地址
}
LOAD %L INCREMENTAL // 下载.axf文件到RAM
Setup(); // 调用Setup();
g, main //跳转到main,可选
如果上一步在代码中,中断向量偏移地址VECT_TAB_OFFSET没有修改,则默认为0x20000000。
5. JLink设置

6.Flash Download设置

勾选不需要擦除,RAM for Algorithm和Start与前面分散加载文件配置一致。根据实际情况进行调整。
7.调试运行
编译,使用debug按钮进行调试。
编译后程序大小分析
编译成功后,KEIL命令行会显示这样一行数据:

Code:代码,存储在ROM中
RO-data:只读数据,存储在ROM中,如const变量
RW-data:初始化为“非 0 值”的可读写变量,使用 ROM 记录该初始值,运行的时候复制到RAM区,如非0的全局变量。
ZI-data:初始化为“0 值”的可读写数据,堆栈空间。存储在RAM区
- 函数内的局部变量属于栈空间,进入函数申请内存,退出函数释放内存
- Malloc属于堆空间
,程序无法正常存储。
,程序无法正常执行.
参考书目
《STM32库开发实战指南——基于STM32F103》




1829

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



