良许Linux教程网 干货合集 在SRAM、FLASH中调试代码的配置方法(附详细步骤)

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

STM32的FLASH存储器的擦写次数是有限的,大约为1万次。为了延长FLASH的使用寿命,在平时进行硬件调试时,可以选择在SRAM中进行调试。此外,相比于内部FLASH存储器,SRAM存储器的写入速度更快,因此将程序下载到SRAM中的速度也更快。

因此,我们有必要建立两个版本的工程配置,一种用于在SRAM中调试程序,另一种则将代码下载到FLASH中。本篇笔记将详细介绍在keil5中配置FLASH调试和SRAM调试的方法,并说明如何在这两种配置之间进行切换。

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

image-20231009213146743
image-20231009213146743

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

在FLASH中进行硬件仿真调试

1、硬件设置

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

2、keil设置

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

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

image-20231009213153534
image-20231009213153534

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

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

image-20231009213156326
image-20231009213156326

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

(3)Debug选项设置:

image-20231009213159117
image-20231009213159117

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

image-20231009213201759
image-20231009213201759
image-20231009213204504
image-20231009213204504
image-20231009213206792
image-20231009213206792
image-20231009213209285
image-20231009213209285

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

image-20231009213212715
image-20231009213212715

然后点击全速运行:

image-20231009213215348
image-20231009213215348

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

在SRAM中进行硬件仿真调试

在SRAM的仿真调试配置比FLASH中的配置要麻烦一点~

1、硬件设置

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

2、keil设置

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

image-20231009213218266
image-20231009213218266

(2)切换至SRAM Target

image-20231009213221142
image-20231009213221142

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

image-20231009213224208
image-20231009213224208

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

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

image-20231009213227108
image-20231009213227108

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

image-20231009213230815
image-20231009213230815

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

image-20231009213233166
image-20231009213233166

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

(5)Debug设置:

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

image-20231009213235871
image-20231009213235871

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

image-20231009213238177
image-20231009213238177

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

image-20231009213240807
image-20231009213240807

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

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

image-20231009213243255
image-20231009213243255

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

image-20231009213245730
image-20231009213245730

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

image-20231009213248410
image-20231009213248410

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

image-20231009213250824
image-20231009213250824

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

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

image-20231009213253443
image-20231009213253443

在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》。

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部