在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××××××××××××××××××××××××××××××××××××××××××××/

[STM32F4xx 学习] 如何在RAM中调试程序的更多相关文章

  1. keil程序在外部RAM中调试的问题总结(个人的一点经验总结)

    keil程序在内部RAM调试的基本步骤网上已经有非常多了,我就不再赘述,大家能够在网上搜到非常多. 可是有些时候内部RAM并不够用,这就须要将程序装入外部RAM中调试,而在这个过程中可能会出现各种各样 ...

  2. 【神经网络与深度学习】如何在Caffe中配置每一个层的结构

    如何在Caffe中配置每一个层的结构 最近刚在电脑上装好Caffe,由于神经网络中有不同的层结构,不同类型的层又有不同的参数,所有就根据Caffe官网的说明文档做了一个简单的总结. 1. Vision ...

  3. CocosCreator游戏开发---菜鸟学习之路(三)如何在CocosCreator中使用Pomelo

    PS(废话): 这段时间都在研究网易的Pomelo框架,作为新手小白,自然遇到了不少坑爹的事情.(当然也有可能是因为自己技术不过关的原因所以导致在很多基础的问题上纠结了很久.)网上也搜索了好久,但是基 ...

  4. 如何在 apache 中设置缓存有效时间

    今天学习了下如何在 apache 中设置缓存时间,记之以备忘. 在 http 报文头中,与缓存时间有关的两个字段是 Expires 以及 Cache-Control 中的 max-age,Expire ...

  5. 如何在Vue2中实现组件props双向绑定

    Vue学习笔记-3 前言 Vue 2.x相比较Vue 1.x而言,升级变化除了实现了Virtual-Dom以外,给使用者最大不适就是移除的组件的props的双向绑定功能. 以往在Vue1.x中利用pr ...

  6. 如何在MyEclipse中通过hibernate使用jtds驱动连接数据库,并向数据库添加数据的方法

    最近学习了下如何在MyEclipse中通过hibernate使用jtds驱动连接数据库,并向数据库添加数据的方法,虽然MyEclipse中自带了连接数据库的方法,我也尝试了下其他方法,如有不当之处请指 ...

  7. vs2013如何在C++中调用Lua(二)

    Lua学习笔记 vs2013如何在C++中调用Lua (此为转载教程) 本人试过完全可行 一.准备工作 1.下载Lua源码,地址:http://www.lua.org/download.html(我用 ...

  8. 如何在Dreamweaver中使用emmet

    by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=3666 一.emmet ...

  9. 如何在.Net中使用Redis

    Redis是一个key-value存储系统.和Memcached类似,但是解决了断电后数据完全丢失的情况,而且她支持更多无化的value类型,除了和string外,还支持lists(链表).sets( ...

随机推荐

  1. Python 的元类设计起源自哪里?

    一个元老级的 Python 核心开发者曾建议我们( 点击阅读),应该广泛学习其它编程语言的优秀特性,从而提升 Python 在相关领域的能力.在关于元编程方面,他的建议是学习 Hy 和 Ruby.但是 ...

  2. 基于nginx的rtmp直播服务器(nginx-rtmp-module实现)

    首先,在搭建服务之前先了解下目前主流的几个直播协议: 1.RTMP: 实时消息传输协议,Real Time Messaging Protocol,是 Adobe Systems 公司为 Flash 播 ...

  3. 常用故障排查监控shell脚本

    #!/bin/bash #ping_monitor.sh IP_ADDRESS=$1 if [ -n "$IP_ADDRESS" ] ; then while : do PING_ ...

  4. Centos7使用Docker启动elasticsearch服务秒退

    首先查看docker启动日志 docker logs -f 容器id 查看报错信息 OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepG ...

  5. 【九度OJ】题目1023:EXCEL排序 解题报告

    [九度OJ]题目1023:EXCEL排序 解题报告 标签(空格分隔): 九度OJ [LeetCode] http://ac.jobdu.com/problem.php?pid=1023 题目描述: E ...

  6. 【LeetCode】998. Maximum Binary Tree II 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 日期 题目地址:https://leetcod ...

  7. 【LeetCode】123. Best Time to Buy and Sell Stock III 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  8. delete、truncate、drop

    DELETE DELETE属于数据库DML操作语言,只删除数据不删除表的结构,会走事务,执行时会触发trigger:每次从表中删除一行,并且同时将该行的的删除操作记录在redo和undo表空间中以便进 ...

  9. KMM

    目录 概 主要内容 Huang J., Smola A., Gretton A., Borgwardt K. & Scholkopf B. Correcting Sample Selectio ...

  10. Capstone CS5265替代龙迅LT8711|设计TYPEC转HDMI2.0投屏方案|替代龙迅LT8711方案

    LT8711是一款高性能C型/DP1.2至HDMI2.0转换器,设计用于将USB typec或DP1.2源连接至HDMI2.0接收器.LT8711集成了兼容DP1.2的接收机和兼容HDMI2.0的发射 ...