[STM32F4xx 学习] 如何在RAM中调试程序
阅读原文时间:2023年07月08日阅读:1

在RAM中调试程序指的是将程序下载到RAM里面(而不是Flash里面),然后在RAM中执行程序、调试。

为什么要在RAM中调试程序?总结起来有以下两点原因:

1. Flash 擦写次数有限,STM32F4xx的Flash擦写次数只有上万次,见图1 Flash规格描述

图1. STM32F4xx Flash 寿命与保存时间

2. 程序下载到RAM里面要比下载到Flash里面快很多,在需要反复调试的时候,能省下不少时间(像调试GUI的时候)。

当然,在RAM调试也有一些不足的,比如:

1. 需要占用部分RAM用来存放程序

2. 不能使用软件复位功能,即每次运行程序前都要重新下载程序

3. 程序在RAM中调试成功,在Flash中不保证100%成功

4. 断电后程序会丢失

设置过程如下:

Step 1. 在uVision 中新建一种配置,命名为“RAM”

Step 1. 新建配置

Step 2. 选中新建的“RAM” 配置,配置新建的"RAM"配置

Step 2. 配置“RAM”

Step 3. 根据STM32F4xx RAM地址范围,在Target中配置代码段地址(IROM),数据段地址(IRAM)

Step 3. 配置地址范围

STM32F4xx的RAM大小为192KB(112+16+64):

  • 112KB和16KB的起始地址为0x2000 0000,通过AHB总线访问
  • 64KB的起始地址为0x1000 0000,只能通过CPU直接访问,关于这64KB RAM有何用途,请参考以下博文:

http://blog.sina.com.cn/s/blog_61332ec601016hj6.html

图2. STM32F4xx RAM 地址映射

Step 4. 在Linker中确保使用的是Target中设置的映射方式

Step 4. 地址映射选择

Step 5. 添加初始化文件(如果没有,复制以下代码到文本编辑器中,保存为.ini,并保存到工程所在目录中)

1 FUNC void Setup (void) {
2 SP = _RDWORD(0x20000000); // 堆栈指针
3 PC = _RDWORD(0x20000004); // PC
4 _WDWORD(0xE000ED08, 0x20000000); // 中断向量偏移地址
5 }
6
7 LOAD %L INCREMENTAL // 载入axf文件
8
9 Setup(); // 调用Setup();
10
11 g, main //跳转到main

清单1. 初始化代码

Step 5. 添加初始化文件

Step 6. 仿真器下载地址的配置

Step 6. 仿真器下载地址配置

方框②中的起始地址和大小就是Step 3中配置的代码存放范围(IROM),方框③中的起始地址和Step 3中的数据存放地址(IRAM)的起始地址相同,大小默认为0x0800。最后把方框④选上,这样每次进入仿真状态前,都会重新下载代码到RAM里面。

现在重新编译源文件,编译完成后,打开.map文件,是不是发现ROM和RAM已从新分配了?现在,享受Debug带来的乐趣吧!

More~

1. STM32F4xx Datasheet中描述,若要从RAM中启动,Boot0, Boot1引脚必须置高电平,如图3所示。实际测试,不管Boot0, Boot1为何值,都能从RAM中启动代     码。

图3. 启动模式选择

2. 若需要使用中断,也要将NVIC中断向量表重新映射到RAM里面。具体操作是在system_stm32f4xx.c源文件中,去掉#define VECT_TAB_SRAM前面的注释,如

图4所示

图4.

/×××××××××××××××××××××××××××××××××××××××× THE END××××××××××××××××××××××××××××××××××××××××××××/

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章