在SRAM、FLASH中调试代码的配置方法(附详细步骤)

因为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/

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

原文地址:https://www.cnblogs.com/zhengnian/p/11715696.html

时间: 2024-10-13 13:55:41

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

Keil MDK使用J-LINK分别在Sram,Nor Flash以及Sdram中调试代码的原理和方法

一.概述 MDK开发ARM裸机程序时,在调试阶段通常是先让程序在SDRAM中执行,以加快调试速度,也避免频繁烧写Nor Flash,因此需要知道如何指定程序在哪个位置执行.本文以realarm 2410开发板为例,进行描述.该开发板使用S3C2410A做为CPU,有2MB的 Nor Flash,以及64MB的SDRAM,4KB的SRAM.程序可直接在Nor Flash中调试和运行,如果代码小于4KB,也可以直接在SRAM中运行,然而在SDRAM 中运行,就需要事先用脚本初始化SDRAM,才能把程

mysql中max_allowed_packet参数的配置方法(避免大数据写入或者更新失败)

这篇文章主要介绍了mysql中max_allowed_packet参数的配置方法,以及查看max_allowed_packet参数当前值的方法,需要的朋友可以参考下 MySQL根据配置文件会限制Server接受的数据包大小.有时候大的插入和更新会受 max_allowed_packet 参数限制,导致写入或者更新失败. 查看目前配置: 复制代码 代码如下: show VARIABLES like '%max_allowed_packet%'; 显示的结果为: 复制代码 代码如下: +------

XAMPP中proftpd的简明配置方法

XAMPP中proftpd的简明配置方法 用LAMPP的安装方法可以开一个默认的nobody用户,用lampp security就可以初始设置相应的默认用户密码.如果要有多用户,又怎样管理.目录怎样设置呢?具体要求如下:使用Lampp的proftpd,开通多个FTP用户,并各分配一个目录,而且需要限制用户在自己的目录里面,可以自由读写. 操作步骤:第一步:设置ftp用户组,输入命令: $ groupadd ftpusers #创建用户级ftpusers 第二步:创建用户目录\用户\密码,输入命令

华为配置SSH登陆详细步骤

理解下SSH登录的过程: 1.建立目的端口为22的TCP连接 2.协商SSH版本 3.协商密钥和算法 4.会话建立 下面为server端的详细配置步骤: 1.创建本地RSA密钥对 rsa local-key-pair creat  //产生RSA本地密钥对 2.配置vty界面支持的登录协议 user-interface vty 0 4 authentication-mode aaa    //验证方式为aaa protocol inbound {ssh|all} //这里选择ssh或ALL都可

app.config文件的configation标签中加代码引起”配置系统未能初始化“

代码中用了一个dll. 而又需要在app.config中  添加log4net的 配置,于是就出错了,提示”配置系统未能初始化“ 添加下面的代码 到configation中 <configSections>        <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral

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

spark程序大致有如下运行模式: standalone模式:spark自带的模式 spark on yarn:利用hadoop yarn来做集群的资源管理 local模式:主要在测试的时候使用, 这三个模式先大致了解,目前我用到的就是local和yarn.其中,我们写spark程序,一般在idea上写,若每次都要将程序打包,再上传到集群,再运行,将严重影响我们效率,所以在调试代码的时候,一般用local模式,在windows的idea上直接操作. 环境配置步骤如下:只做简要说明,各个步骤的具体

IntelliJ IDEA 2018.2.2远程调试Tomcat的配置方法

公司项目放在远程服务器上,之前都是将项目打包放上去运行后在log中查看相关调试信息,发现问题后在本地编辑器修改后再次打包上传调试,但是这种方式实在是让人抓狂,一则不断的在大量的log中查看有效信息太累,而且log中的信息也有限:再则一直重复编辑-打包-上传-调试很折磨人,所以才想到了远程调试.搜索了网上的方法要么就是设置界面跟我不一样,要么就是即使跟他们设置的一样依然不起作用,不进断点,在尝试了多次以后终于调通,在这里记录一下,也给大家做个参考! 大前提:本地工程和发布到远程服务器上的工程代码要

yum源包管理器配置方法的详细总结

yum是红帽软件包管理器,可以查询有关可用的软件包的信息,使用来自yum仓库的rpm包,安装和卸载,并更新整个系统的最新版本.yum执行自动依赖解析更新时,安装或删除软件包,从而能够自动判断.获取和安装所有可用的依赖包. yum可以配置新的,额外的yum仓库或者包的来源,也提供了很多插件,增强和扩展其功能.同时yum还能够执行许多rpm包管理软件能够执行的工作:此外,许多命令行选项是相似的.yum是容易简单的包管理器在单一的机器. 下面的部分假设您的系统在安装过程中注册了红帽订阅管理,如红帽企业

在VS2010 C++中调试DLL工程的方法

1.在"Solution Explorer"中找到要调试的dll项目,点击右键,选择Set as StartUp Project,将dll设置为调试启动项目:然后选择dll项目,点击右键,选择Properties,打开属性页设置页面; 2.在Properties 页面的中,选择Configuration Properties下拉菜单,然后选择Debugging: 3.在Debugging的页面中,在第一行Debugger to launch的下拉菜单中,如果是本地调试选择Local W