在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. LuoguB2105 矩阵乘法 题解

    Content 给定一个 \(n\times m\) 的矩阵 \(A\) 和一个 \(m\times k\) 的矩阵 \(B\),求两个矩阵相乘得到的矩阵. \(n\times m\) 的矩阵 \(A ...

  2. CF1494A ABC String 题解

    Content 给定 \(T\) 个仅包含大写字母 A,B,C 的字符串 \(s\).问你是否能够通过将每个 A,B,C 换成 (,) 中的一个(同一个字母必须要换成同一个字符),使得最后得到的括号序 ...

  3. 查看服务backlog大小 Send-Q

    ss -ntl 如下图 LISTEN 状态:          Recv-Q 表示的当前等待服务端调用 accept 完成三次握手的 listen backlog 数值,也就是说,当客户端通过 con ...

  4. 前端实现list排序

    需求 针对list中某个字段,实现list的升序和降序 效果图 代码 我是用在angular1.X中项目的,根据list中的sort字段进行排序. # sort.html <style> ...

  5. React-Router(一)

    React-Router基础知识 import React from "react"; import { BrowserRouter as Router, Switch, Rout ...

  6. MySQL查找数据中相同的数据,并进行删除

    查找表中多余的重复记录,重复记录是根据某个字段来判断 select * from 表名 where 字段 in (select 字段 from 表名 group by 字段 having count( ...

  7. UDP&串口调试助手用法(1)

    一览 UDP 串口 常用 功能概述 概览 支持UDP通信协议: 广播.单播.组播 支持串口通信 配置了常用的配置,常用的进制转化: 2进制,8进制,10进制,和16进制之间的转换 配置了 计算器,加减 ...

  8. c++11之日期和时间库

    本文主要介绍 std::chrono日期和时间用法. 演示环境: vs2017 0.头文件 1 #include <chrono> 2 #include <thread>// ...

  9. 【LeetCode】666. Path Sum IV 解题报告 (C++)

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

  10. 【LeetCode】280. Wiggle Sort 解题报告 (C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 排序后交换相邻元素 日期 题目地址:https://l ...