因为STM32的FLASH擦写次数有限(大概为1万次),所以为了延长FLASH的使用时间,我们平时调试时可以选择在SRAM中进行硬件调试。除此之外,SRAM 存储器的写入速度比在内部 FLASH 中要快得多,所以下载程序到SRAM中的速度较快。

所以我们很有必要建立两个版本的工程配置,在SRAM中调试程序完毕后,再把代码下载到FLASH中即可。这篇笔记主要分享在keil5中配置FLASH调试与SRAM调试的详细配置方法及如何切换两种配置。

本篇笔记以STM32F103ZET6为例。其FLASH大小为512KB,SRAM的大小为64KB。FLASH基地址为0x08000000,SRAM基地址为0x20000000。在STM32F10XXX里,可以通过BOOT1、BOOT0引脚来选择三种不同的模式:

我们要在FLASH中进行硬件仿真调试还是在RAM中进行硬件仿真调试需要对这两个boot脚进行对应的设置以及程序下载的地址进行设置。

在FLASH中进行硬件仿真调试

1、硬件设置

BOOT0配置为0,BOOT1随意设置。

2、keil设置

本文以keil5为例。步骤如下:

(1)点击如下按钮,修改target的名称:

target的名称是可以随意更改的,我们这里改为FLASH。

(2)点击Project->Options for Target Flash...(也可以点击魔术棒那个图标)进行配置。首先对Target选项卡设置:

设置IROM1的起始地址为0x8000000,大小为0x80000,即FLASH的基地址与大小。设置IRAM1为0x20000000,大小为0x10000,即SRAM的基地址与大小。

(3)Debug选项设置:

调试器根据实际进行选择,我们这里使用的调试器是ULINK2。其它的按默认设置即可,然后点击Settings:

(4)编译,然后按Ctrl+F5进入调试界面:

然后点击全速运行:

在Disassembly窗口中可看到地址为0x0800xxxx,说明代码烧进了FLASH中,这时候就可以像使用其他C语言IDE调试C语言程序一样打断点、单步运行我们的STM32程序啦。

在SRAM中进行硬件仿真调试

在SRAM的仿真调试配置比FLASH中的配置要麻烦一点,我配置的时候遇到不少问题~

1、硬件设置

BOOT0配置为1,BOOT1配置为1。

2、keil设置

(1)新建一个target,并修改名称为SRAM:

(2)切换至SRAM Target

(3)点击Project->Options for Target SRAM ...(也可以点击魔术棒那个图标)Target选项卡设置:

设置IROM1的起始地址为0x2000000,大小为0x8000(32KB);设置IRAM1的起始地址为0x2008000,大小为0x8000(32KB)。即把64KB的SRAM分为32KB的FLASH(当然这是SRAM虚拟出来的FLASH,掉电易失)和16KB的RAM。

(4)C/C++选项设置:

为什么在RAM中调试要设置这个宏而在FLASH中调试却不需要?这是因为我们的中断向量表默认位于FLASH中,而此时我们要在RAM中进行调试,所以需要把中断向量表拷贝到RAM中,相关代码在system_stm32f10x.cSystemInit函数中:

其实system_stm32f10x.c文件中也有宏VECT_TAB_SRAM相关的代码:

把这行代码打开即可把中断向量表拷贝到RAM中。但是这里选择在C/C++选项选项里添加宏,因为这样可以保证SRAM版本与FLASH版本代码的一致性。

(5)Debug设置:

与在FLASH中调试不同的是,这里需要加入.ini文件:

这个.ini可以自己创建(也可以在芯片支持包里找到),这里我们建为Dbg_RAM.ini。文件里的内容如下:

其中这里的第11行是需要根据实际进行修改的,需要把工程编译得出的.axf格式文件的路径及其文件名填到这里。这里因为我们这里的的.ini文件在.axf的上一级目录:

所以此处以./Objects来表示。如果觉得麻烦的话,可以把.axf文件与.ini放在同一个目录下。

其它的按默认设置即可,然后点击Settings,并进行如下设置:

图中我们需要勾选Verify Code DownloadDownload to FLASH选项,也就是说点击调试按钮后,本工程的程序会被下载到内部 SRAM 中,只有勾选了这两个选项才能正常仿真。 (至于为什么 FLASH 版本的程序不需要勾选,不太清楚) 。

Download Function中的擦除选项配置为Do not Erase。这是因为数据写入到内部 SRAM 中不需要像 FLASH 那样先擦除后写入。 Programming Algorithm 的地址要与我们Target选项卡里设置的地址一致,否则可能会出现如下错误:

(6)编译,然后按Ctrl+F5进入调试界面,然后点击全速运行:

在Disassembly窗口中可看到地址为0x2000xxxx,说明代码烧进了SRAM中,这时候就可以像使用其他C语言IDE调试C语言程序一样打断点、单步运行我们的STM32程序啦。

以上就是在FLASH中调试与在SRAM中调试的设置方法,调试代码时可以选择SRAM版本的配置,调试完成再切换回FLASH版本的配置,把程序下载到FLASH中。切换方法:

在RAM中调试的优缺点

以下来自《【野火】零死角玩转STM32—F429挑战者V2.pdf》。

优点:

1、载程序非常快。 RAM 存储器的写入速度比在内部 FLASH 中要快得多,且没有擦除过程,因此在 RAM 上调试程序时程序几乎是秒下的,对于需要频繁改动代码的调试过程,能节约很多时间,省去了烦人的擦除与写入 FLASH 过程。另外,STM32 的内部 FLASH 可擦除次数为 1 万次,虽然一般的调试过程都不会擦除这么多次导致 FLASH 失效,但这确实也是一个考虑使用 RAM 的因素。

2、不改写内部 FLASH 的原有程序。

3、对于内部 FLASH 被锁定的芯片,可以把解锁程序下载到 RAM 上,进行解锁。

缺点:

1、存储在 RAM 上的程序掉电后会丢失,不能像 FLASH 那样保存。

2、SRAM空间较小。

以上就是本次分享的关于RAM调试与FLASH调试的笔记,更多的相关原理、细节可查阅《【野火】零死角玩转STM32—F429挑战者V2.pdf》。可在本公众号嵌入式大杂烩聊天界面回复关键字:调试,进行获取本笔记对应工程及《【野火】零死角玩转STM32—F429挑战者V2.pdf》。本篇笔记如有错误欢迎指出!谢谢

我的个人博客:https://zhengnianli.github.io/

我的微信公众号:嵌入式大杂烩

在SRAM、FLASH中调试代码的配置方法(附详细步骤)的更多相关文章

  1. 第49章 在SRAM中调试代码—零死角玩转STM32-F429系列

    第49章     在SRAM中调试代码 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fir ...

  2. Entity Framework入门教程(18)---EF6中基于代码进行配置方式

    EF6中基于代码进行配置方式 我们以前对EF进行配置时是在app.config/web.config下的<entityframework>节点下进行配置的,EF6引进了基于代码的配置方法. ...

  3. 详解OJ(Online Judge)中PHP代码的提交方法及要点【举例:ZOJ 1001 (A + B Problem)】

    详解OJ(Online Judge)中PHP代码的提交方法及要点 Introduction of How to submit PHP code to Online Judge Systems  Int ...

  4. XAMPP中proftpd的简明配置方法

    XAMPP中proftpd的简明配置方法   用LAMPP的安装方法可以开一个默认的nobody用户,用lampp security就可以初始设置相应的默认用户密码.如果要有多用户,又怎样管理.目录怎 ...

  5. OpenStack中的rabbitmq的配置方法

    OpenStack中的rabbitmq的配置方法 author:headsen chen   2017-10-11  17:24:58 个人原创,允许转载,转载请注明作者,出处,否则依法追究法律责任 ...

  6. Windows Server 2016 配置 IIS 的详细步骤

    Ø  简介 本文主要记录 Windows Server 2016 环境下,安装配置 IIS 的详细步骤.需要说明的是,在选择"功能"或"角色服务"时不建议将所有 ...

  7. 配置WebLogic的详细步骤

    配置WebLogic的详细步骤 1.安装好WebLogic后,进入配置阶段,点击"Getting started with WebLogic Server 10.3.6" 2.进入 ...

  8. 在idea中调试spark程序-配置windows上的 spark local模式

    spark程序大致有如下运行模式: standalone模式:spark自带的模式 spark on yarn:利用hadoop yarn来做集群的资源管理 local模式:主要在测试的时候使用, 这 ...

  9. [转]Android通过NDK调用JNI,使用opencv做本地c++代码开发配置方法

    原文地址:http://blog.csdn.net/watkinsong/article/details/9849973 有一种方式不需要自己配置所有的Sun JDK, Android SDK以及ND ...

随机推荐

  1. 洛谷 P1181数列分段Section I

    星爆气流(弃疗)斩!                                            ——<刀剑神域> 题目:https://www.luogu.org/proble ...

  2. jenkins在windows上自动化部署.Net(.Net Core)项目

    前言 什么是持续集成呢?Continuous integration(CI).持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员至少集成一次,也就意味着每天可能会发生多次集成. ...

  3. Mybatis多数据源读写分离(注解实现)

    #### Mybatis多数据源读写分离(注解实现) ------ 首先需要建立两个库进行测试,我这里使用的是master_test和slave_test两个库,两张库都有一张同样的表(偷懒,喜喜), ...

  4. 新手学习FFmpeg - 调用API完成两个视频的任意合并

    本次尝试在视频A中的任意位置插入视频B. 在上一篇中,我们通过调整PTS可以实现视频的加减速.这只是对同一个视频的调转,本次我们尝试对多个视频进行合并处理. Concat如何运行 ffmpeg提供了一 ...

  5. 微信支付JSAPI支付

    1.介绍 JSAPI支付是用户在微信中打开商户的H5页面,商户在H5页面通过调用微信支付提供的JSAPI接口调起微信支付模块完成支付.应用场景有:    ◆ 用户在微信公众账号内进入商家公众号,打开某 ...

  6. MySQL之增删改查之

    MySQL之增删改查   前言:以下是MySQL最基本的增删改查语句,很多IT工作者都必须要会的命令,也是IT行业面试最常考的知识点,由于是入门级基础命令,所有所有操作都建立在单表上,未涉及多表操作. ...

  7. 夯实Java基础系列6:一文搞懂抽象类和接口,从基础到面试题,揭秘其本质区别!

    目录 抽象类介绍 为什么要用抽象类 一个抽象类小故事 一个抽象类小游戏 接口介绍 接口与类相似点: 接口与类的区别: 接口特性 抽象类和接口的区别 接口的使用: 接口最佳实践:设计模式中的工厂模式 接 ...

  8. 在vue中使用[provide/inject]实现页面reload

    在vue中实现页面刷新有不同的方法: 如:this.$router.go(0),location.reload()等,但是或多或少会存在问题,如页面会一闪等 所以建议使用[provide/inject ...

  9. 读《深入理解Elasticsearch》点滴-查询二次评分

    理解二次评分 二次评分是指重新计算查询返回文档中指定个数文档的得分,es会截取查询返回的前N个,并使用预定义的二次评分方法来重新计算他们的得分 小结 有时候,我们需要显示查询结果,并且使得页面上靠前文 ...

  10. webservice传输文件的三种方式

    1, 在接口中不定义,直接以附件形式传输. 2, 在接口参数中定义byte[]类型,文件在xml中以base64编码传输. 3, 在接口参数中定义DataHandler类型,然后使用MTOM形式来进行 ...