首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

STM32在flash中调试和在RAM中调试

STM32在flash中调试和在RAM中调试

今天调试STM32的一个例程时时遇到一个非常奇怪的现象,就是程序可以仿真,但是并没有真正下载到芯片中,每次复位之后都是以前的程序,我非常奇怪,查看MDK的设置,发现程序烧入的地址和之前的程序不太相同,我怀疑是烧写地址有问题,就改到以前烧写程序的地址中,但仿真程序的时候竟然发现有error。上网搜也没有搜到答案。
最后我想到是不是调试的方式和以前不同。我记起仿真可以在flash中,也可以在RAM中,我以前在flash中仿真,程序下载到flash中,所以复位后仍然可以运行程序,但在RAM中仿真的话程序不会下载进去,故复位后运行的程序还是之前的,因为flash中的程序并没有改变。
我查了一下,发现STM32f103VC的RAM起始地址为0x20000000,48k,flash的起始地址为0x4002 2000,256k,果然和我想的一样。
       查找了DX32顶级学习手册,发现如下方法设置在RAM中调试,非常方便。
下面转一篇电子白菜关于RAM中调试相关的文章。
转:

.MDK J-LINK STM32 RAM .
(这个在RAM调试方式经历了一些大虾的精简操作,在2009 年10月8 日改为以下版本)
STM32 支持程序在FLASH 上调试,并且用J-LINK 的话,可以设置无数断点.但似乎大家都
对下载代码到FLASH上感到心痛(都担心FLASH下载过多就烧坏了呵呵)于是就有了这一
节,在RAM 调试了.
DX32 上用的是103VC 芯片,有48K 的 RAM,对于一般学习型的代码来说,分出40K 走程
序,8K作RAM,那已经是相当的足够了.至少光盘上的例程,除了实用篇的部分超级例程外,
剩下的都可以在那48K RAM 内调试.
在进行调试前,得先教大家如何在同一个工程内搞出两种不同配置的目标项出来.也就
是说,工程是同样的工程,代码是同样的代码,但通过简单的设置,就可以让他们选择在
RAM 运行还是在FLASH 运行,也可以让这些代码有不同的优化等级和可以使用不同的仿
真器等的功能.
sanhope , lhzw2001
, , , ” ”
, RAM , .
DX32 , , J
看下图,假设你本来的工程目标名叫STM32F103VC Flash,那么就Manage Components:
出现下图,下图就是你的项目管理了,在目标栏目建立一个新的目标,名字叫
STM32F103VC RAM,然后点击这个STM32F103VC RAM,按下下面的那个Set as Current
Target 按键
如此,你再看看你的工程栏目,就已经不再是之前的那个STM32F103VC Flash 了,而是你
刚才建立的那个STM32F103VC RAM.当然,这些名字都是随意改的啦,只是方便大家了解
而已.
然后还记得那个魔术棒么?现在要开始用它来变魔术了:
如何设置MDK,在之前已经说过了,
这里只说一下特别要设置的地方,首先是下面的界面,看看已经被圈出来的地方,是不是
跟以前有点不同呢?
实际上,这就是程序的定位了,把程序的CODE 区定义到0x20000000 为起始,大小为
0xa000,也就是40K 了,然后RAM 区则定义到0x2000a000为起始,大小为0x2000,即8K.
刚才说了,103VC的RAM是48K,地址从0x20000000开始的,那你明白为什么这么设了吧?
为了方便让两个目标之间完全没有任何牵连,还需要设置Output,Listing页的文件夹定
位,之前的设置大家还记得吧,定义到一个叫LIST的目录里,现在,我们在LIST目录里建
立一个RAM 目录,把Output 和Listing 的文件夹都定位到那个LIST/RAM 内.这里注意,
要把 Debug Information 选上,其实无论如何调试,只要你调试,这个都该选的.
当然这样还是不够的,还要设置一个特别的地方,就是这里:
Load Application at Startup和Run to main()都选上,然后还要添加一个RAM.ini 文件,这个
文件内容非常简单,其实就是定位了一些程序入口,书写格式还是类似C语言的呢.它的内
容如下:
SP = _RDWORD(0x20000000); // Setup Stack Pointer
PC = _RDWORD(0x20000004); // Setup Program Counter
_WDWORD(0xE000ED08, 0x20000000); // Setup Vector Table Offset Register
以上东西你可以不去理解,直接把上面代码COPY,然后建立一个RAM.ini 文件,把代码粘
贴下去.而且这个RAM.ini 对于别的需要设置在RAM调试的工程,也是通用的.
接着,设置下图,Update Target before Debugging.然后按下Settings 进入设置界面.
设置界面上当然地也需要选择CPU的类型,就和第二章的设置MDK一样,但这里要注意下
面圈出来的三个地方:
1. .2. RAM .3. FLASH
其中改RAM 地址和改FLASH 地址大家都明白要改成什么了吧J CPU 的型号别忘了选上!
只有点击CPU 的型号,才可以让你设置那个所谓FLASH 地址.
好了,一切都搞好了, , ,在调试过程中,不要点击那个
FLASH 下载功能哦~以上设置必须丝毫莫差,设置过程请大家仔细一点就可以了.光盘上
的技巧篇中会有一个设置好的简易工程供大家参考.
到此,RAM 调试的方式就设置完成了,尽情享受无穷刷写的乐趣吧.到真正要在FALSH 运
行的时候,记得把工程目标转回去那个STM32F103VC Flash ,这时你会发现,两个目标都
保存着各自的独特设置.相互间除了源代码外,没有其它任何联系
要验证这个在RAM 调试是否正确,很简单,首先,烧写一个A 程序到DX32 上,然后,用在
RAM调试的方式在板上调试B程序.当你成功调试了B程序后,按下板上的复位键,这时候,
板子跑起来的就是之前下载到FALSH 的A 程序.如此,你的设置就完全正确了,因为B 程
序能在RAM调试了,并且完全没有改变到FLASH上原先的A 程序~.
如果大家还记得ISP跳线,一定记得有一个跳线模式是跳成芯片复位后在RAM启动的吧?
注意到,我们讲的是在RAM 调试,这与芯片复位后在RAM 启动是两个概念,也就是说,在
RAM调试,是不需要动那个ISP跳线的.那你一定会问,ISP跳线成在RAM启动究竟是干什
么的?白菜会跟你说:偶也不知道啥用~J
继承事业,薪火相传
返回列表