请选择 进入手机版 | 继续访问电脑版

你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
mizhinian 发布时间:2019-10-21 19:44
因为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引脚来选择三种不同的模式:
001.png
我们要在FLASH中进行硬件仿真调试还是在RAM中进行硬件仿真调试需要对这两个boot脚进行对应的设置以及程序下载的地址进行设置。
在FLASH中进行硬件仿真调试
1、硬件设置
BOOT0配置为0,BOOT1随意设置。
2、keil设置
本文以keil5为例。步骤如下:
(1)点击如下按钮,修改target的名称:
101.png
102.png
target的名称是可以随意更改的,我们这里改为FLASH。
(2)点击Project->Options for Target Flash...(也可以点击魔术棒那个图标)进行配置。首先对Target选项卡设置:
002.png
设置IROM1的起始地址为0x8000000,大小为0x80000,即FLASH的基地址与大小。设置IRAM1为0x20000000,大小为0x10000,即SRAM的基地址与大小。
(3)Debug选项设置:
003.png
调试器根据实际进行选择,我们这里使用的调试器是ULINK2。其它的按默认设置即可,然后点击Settings:
004.png
005.png
006.png
007.png
(4)编译,然后按Ctrl+F5进入调试界面:
008.png
然后点击全速运行:
009.png
在Disassembly窗口中可看到地址为0x0800xxxx,说明代码烧进了FLASH中,这时候就可以像使用其他C语言IDE调试C语言程序一样打断点、单步运行我们的STM32程序啦。

$ |1 |0 U$ n- W0 f4 Q: s在SRAM中进行硬件仿真调试
在SRAM的仿真调试配置比FLASH中的配置要麻烦一点,我配置的时候遇到不少问题~
1、硬件设置
BOOT0配置为1,BOOT1配置为1。
2、keil设置
(1)新建一个target,并修改名称为SRAM:
103.png
(2)切换至SRAM Target:
104.png
(3)点击Project->Options for Target SRAM ...(也可以点击魔术棒那个图标)Target选项卡设置:
010.png
设置IROM1的起始地址为0x2000000,大小为0x8000(32KB);设置IRAM1的起始地址为0x2008000,大小为0x8000(32KB)。即把64KB的SRAM分为32KB的FLASH(当然这是SRAM虚拟出来的FLASH,掉电易失)和16KB的RAM。
(4)C/C++选项设置:
011.png
为什么在RAM中调试要设置这个宏而在FLASH中调试却不需要?这是因为我们的中断向量表默认位于FLASH中,而此时我们要在RAM中进行调试,所以需要把中断向量表拷贝到RAM中,相关代码在system_stm32f10x.c的SystemInit函数中:
012.png
其实system_stm32f10x.c文件中也有宏VECT_TAB_SRAM相关的代码:
105.png
把这行代码打开即可把中断向量表拷贝到RAM中。但是这里选择在C/C++选项选项里添加宏,因为这样可以保证SRAM版本与FLASH版本代码的一致性。
(5)Debug设置:
与在FLASH中调试不同的是,这里需要加入.ini文件:
013.png
这个.ini可以自己创建(也可以在芯片支持包里找到),这里我们建为Dbg_RAM.ini。文件里的内容如下:
014.png
其中这里的第11行是需要根据实际进行修改的,需要把工程编译得出的.axf格式文件的路径及其文件名填到这里。这里因为我们这里的的.ini文件在.axf的上一级目录:
015.png
所以此处以./Objects来表示。如果觉得麻烦的话,可以把.axf文件与.ini放在同一个目录下。
其它的按默认设置即可,然后点击Settings,并进行如下设置:
016.png
图中我们需要勾选Verify Code Download及Download to FLASH选项,也就是说点击调试按钮后,本工程的程序会被下载到内部 SRAM 中,只有勾选了这两个选项才能正常仿真。 (至于为什么 FLASH 版本的程序不需要勾选,不太清楚) 。
017.png
Download Function中的擦除选项配置为Do not Erase。这是因为数据写入到内部 SRAM 中不需要像 FLASH 那样先擦除后写入。 Programming Algorithm 的地址要与我们Target选项卡里设置的地址一致,否则可能会出现如下错误:
201.png
(6)编译,然后按Ctrl+F5进入调试界面,然后点击全速运行:
018.png
在Disassembly窗口中可看到地址为0x2000xxxx,说明代码烧进了SRAM中,这时候就可以像使用其他C语言IDE调试C语言程序一样打断点、单步运行我们的STM32程序啦。

! I3 O; E! C( y, Z9 d1 k8 n
以上就是在FLASH中调试与在SRAM中调试的设置方法,调试代码时可以选择SRAM版本的配置,调试完成再切换回FLASH版本的配置,把程序下载到FLASH中。切换方法:

- v' k4 E% I; O, l在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空间较小。
5 V+ b/ u5 v3 M: m* k! D4 t
以上就是本次分享的关于RAM调试与FLASH调试的笔记,更多的相关原理、细节可查阅《【野火】零死角玩转STM32—F429挑战者V2.pdf》。本篇笔记如有错误欢迎指出!

: }4 N/ [2 J/ X7 z9 h2 j  Q3 \& `! |
7 n9 u6 o& k# O$ m0 `, s% P
收藏 2 评论4 发布时间:2019-10-21 19:44

举报

4个回答
goyhuan 回答时间:2019-10-22 14:32:00
goyhuan 回答时间:2019-10-22 14:38:20
可以发点QSPI FLASH启动的例程吗?
mizhinian 回答时间:2019-10-23 14:23:48
乐天乐 发表于 2019-10-22 14:383 z: M" |3 x2 Q0 v
可以发点QSPI FLASH启动的例程吗?

0 A9 G' s7 ~+ \& P这个我没用过呀
七哥 回答时间:2019-10-25 09:26:34
写的不错 & g7 T. C  u  ^5 a+ _- h$ m1 v& @
以前没注意过VECT_TAB_SRAM宏定义选项,Verify Code Download,Download to FLASH这两个也没在意有没有勾选。
9 a. |) g3 _3 v; A) ABOOT0、BOOT1选项也没管,前提是我的Debug接口没有复用,可以通过JTAG软复位或接上硬件Reset复位信号,JTAG(SWD)优级级最高,复位后,不管BOOT0、BOOT1是什么,都能进入调试模式。

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版