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

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

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

本篇笔记以STM32F103ZET6为例。其FLASH大小为512KB,SRAM的大小为64KB。FLASH基地址为0x08000000,SRAM基地址为0x20000000。在STM32F10XXX里,能够经过BOOT一、BOOT0引脚来选择三种不一样的模式:sass

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

在FLASH中进行硬件仿真调试

一、硬件设置函数

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

二、keil设置调试

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

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

target的名称是能够随意更改的,咱们这里改成FLASH。get

(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中的配置要麻烦一点,我配置的时候遇到很多问题~

一、硬件设置

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

二、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》。

优势:

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

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

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

缺点:

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

二、SRAM空间较小。

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

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

个人微信公众号:嵌入式大杂烩

相关文章
相关标签/搜索