博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

Aquarius

积累是思考的基石,思考是智慧的源泉。 我思故我为
  Aquarius.cublog.cn

关于作者
Name :Aaron Wong
Age  :25
City :Shanghai
Prof :Wimax SW Engineer
Intro:Farewell, my dream of an Embedded SW enginner! Just live a brand new life of communication people.
|| << >> ||
我的分类


ARM JTAG仿真器调试方法之SDRAM篇

       之前介绍了使用ARM JTAG仿真器将映像文件加载到ARM处理器内部SRAM中进行程序调试的方法,而在实际操作中,将映像文件加载到外部SDRAM中进行调试的方式更为常见。

       要把映像文件加载到SDRAM中,除了要正确设置好映像文件的RO段基地址外(对于一个加载时域和运行时域相同的映像文件来说,RO段基地址实际上就是该映像文件在存储空间的起始地址),更关键的是要对SDRAM进行初始化。因为在上电时,SDRAM是没有被初始化的,所谓初始化SDRAM,就是要设置处理器的SDRAM空间以及读写SDRAM的时序参数,因而SDRAM在初始化之前是不能进行读写操作的。

       对于PXA270处理器,初始化SDRAM的工作通过配置存储控制器寄存器来完成,这些寄存器包括MDCNFGMDREFRMDMRS

       由于这些寄存器都映射到了某一存储空间地址,因而可以在AXD的命令行窗口(System Views->Command Line Interface [Alt+L])中使用setmem命令来对寄存器进行配置。setmem命令(简写为smem)可以为存储空间的某一地址单元指定值。例如“setmem 0x48000000 0xac9 32的含义就是将常数0xac9保存到地址为0x48000000的字中(一个字32bit)。实际上,通过查阅Intel PXA27x Processor Family Developer’s Manual可知,0x48000000正是寄存器MDCNFG的地址,因而这条命令实质上完成了对MDCNFG寄存器的配置,使能SDRAM partition 0,使用32bit宽的SDRAM数据总线,9位列地址,13位行地址,SDRAM内部采用4 bank设计,tRP=3CL=3tRCD=3tRAS7tRC10,采用普通寻址模式;不使用SDRAM partition 2/3。具体设置要根据实际所使用的SDRAM芯片进行。

       因此,可使用34setmem命令初始化SDRAM,之后就可以正确地将映像文件加载到SDRAM中运行了。顺便提一句,PXA270有两种SDRAM存储模式,一种是小空间模式,支持464Mpartition共计256M字节,起始地址为0xa0000000;另一种是大空间模式,支持4256Mpartition共计1GB,起始地址为0x80000000。应根据实际情况设置正确的RO BASE地址。

       

    关于使用ob命令自动初始化SDRAM

       由于每次上电后往SDRAM加载映像时都需要对其进行初始化,手工输入多条命令有时是很繁琐的。这时,可以把初始化SDRAM的命令序列保存在一个*.ini文本文件中(也可以是*.txt文件),每条命令占一行。然后在AXD命令行窗口使用obey命令调用该*.ini文件,就可以将文件中的命令顺序执行,继而完成SDRAM的初始化。

       例如,将SDRAM初始化命令序列保存在PXA270.ini文件中,执行命令:

       ob $PATH/PXA270.ini

       就可自动执行初始化SDRAM的命令。其中,obobey的简写,$PATHPXA270.ini文件的绝对路径。

       更多AXD命令和内容可以参考ADS手册之《AXD and armsd Debuggers Guide》。

 

       启动AXD时自动初始化SDRAM

       感谢网友Garfield的指点,他提出了在硬件平台不变的情况下,在启动AXD时自动初始化SDRAM的一劳永逸的办法,经笔者证实,该方法确实是可行的。

具体办法如下:

将初始化SDRAM的命令序列保存为一个*.txt文本文件(可以直接将上述的*.ini文件后缀改为.txt),然后在AXD的主窗口下选择菜单Options>Configure Interface...,在Session File一页中选择“Run Configuration Script”,将该.txt文本文件作为一个脚本加进来,确定。这样以后每次启动AXD时,就会自动运行该脚本来完成对SDRAM的初始化。


 TAG ARM ADS JTAG
发表于: 2007-03-11,修改于: 2007-04-17 19:43,已浏览4682次,有评论14条 推荐 投诉


网友评论
网友: Garfield 时间:2007-04-17 17:10:06 IP地址:59.108.97.★
博主写的很到位啊,精辟而准确~ 你现在应该是就在从事PXA270方面的研发吧?不过有一点我不太明白,为什么要将SDRAM初始化命令放在ini文件中,用ob命令执行呢? 直接写成一个txt文档,然后在Options -> Configure Interface -> Session File 中添加进去,这样不就可以在硬件SDRAM芯片不变的情况下一劳永逸了吗?  

Blog作者的回复:
谢谢指点:)以前总是要手工输入ob命令来初始化SDRAM,虽然只有一条命令,但还是感觉繁琐(主要是复制配置文件的路径比较繁),现在使用你介绍的办法,确实是一劳永逸啦.


网友: Garfield 时间:2007-04-18 09:10:52 IP地址:59.108.97.★
呵呵,你客气了~ 我现在还是一个刚刚进入嵌入式研发领域的小字辈,还有很多东西不明白,希望以后能有机会和你多探讨啊! :)
我的QQ:83318325 
    MSN:couragemaster@gmail.com

网友: Garfield 时间:2007-04-20 09:59:24 IP地址:59.108.97.★
昨天又仔细的看了看我们现在要做的SDRAM初始化,发现还是有些不明白的地方:
对于SDRAM芯片,一般的初始化流程都是标准的,即:开机上电 -> 200us稳定期 -> 所有Bank Precharge -> Auto-refresh -> MRS Command -> 进入正常模式,那也就是说在这个过程中,主MPU的SDRAM控制器中MR寄存器(我用的是9200,估计应该对应你的270中的MDMRS)的值是一直在变化的,并且每个步骤间都是由严格的时序和延时要求的。我现在的问题就在这里:固然
tRP、CL、tRCD和tRC等可以由Config寄存器进行配置,但开机上电后的200us稳定期是如何体现出来的?另外既然要修改MR的值,那又怎么能在脚本文件中一次性配置呢? 唉,彻底倒塌了……  盼解答!

Blog作者的回复:
个人愚见:
(1)上电后200us稳定期是为了等待SDRAM的输入时钟稳定下来,只要干等即可(上电后等我们启动AXD对SDRAM执行初始化命令序列时已经大大超过了200us等待)。
(2)所有bank precharge,通过片上SDRAM控制器发出PALL(precharge all banks)命令来实现,可以参考SDRAM控制器状态图,对于PXA270,上电时处于NOP状态,此时如果发出新的MRS命令(即写寄存器MDMRS)会自动转入PALL状态进行所有BANK的预充电,然后才由SDRAM控制器将控制信号置MRS命令状态,将地址信号置MDMRS内容,对SDRAM芯片的模式寄存器进行设置。另外,在NOP状态下,其他一些操作如置位MDREFR[SLFRESH]也会导致PALL。
(3)因此,在初始化SDRAM时,使用简单的命令配置寄存器MDCNFG,MDREFR和MDMRS时,SDRAM控制器是会自动进入PALL状态对所有BANK进行预充电的。
(4)至于auto-refresh,是指通常的CBR吧,在infineon的HYB25L256160AC(mobile-RAM)的datasheet中指出,该步骤可以在MRS命令之前,也可以在其之后。在PXA27X的manual中指出,初始化SDRAM时要根据具体的SDRAM芯片来决定进行CBR的次数,具体做法是对SDRAM进行非突发式的通常的读写操作(而且在首次进行CBR时,也会自动转入PALL先进行预充电)。
(5)因此,SDRAM控制器的状态机实际上保证了在用简单命令序列进行SDRAM初始化时,SDRAM所需要的初始化流程。(由于命令序列通过JTAG仿真器上位机程序控制目标处理器执行,所以执行速度较慢,而在启动代码中初始化SDRAM时,通常需要在配置寄存器的操作之间插入NOP操作或适当延时,保证SDRAM初始化流程中的必要时延。)
(6)使用简单命令序列来初始化SDRAM,其目的仅仅是为了将映像文件加载到SDRAM中,而在启动代码中初始化SDRAM时,实际上不仅仅是初始化SDRAM芯片,之前还要初始化SDRAM控制器,使两者之间的配置相匹配,目的是为了在目标系统运行阶段,保证目标处理器能无差错地对SDRAM进行读写操作,因此必须严格按照目标处理器的datasheet描述的上电复位初始化流程和步骤执行,包括严格的时序要求。
(7)以上只是个人愚见,纰漏之处有待指正。这样使用简单命令序列来初始化SDRAM的内部过程如下:上电等待200us以上->写控制寄存器(实际上进行了所有BANK的预充电),包括写MDMRS(发MRS命令,设置SDRAM芯片工作模式)->auto-refresh->正常模式。
不过,auto-refresh这一步似乎没有找到合理的对应点,因为写控制寄存器的命令序列并没有对SDRAM进行读写操作(或者是在加载映像文件到SDRAM时对其进行了写操作而进行了auto-refresh?)。


网友: Garfield 时间:2007-04-23 19:08:06 IP地址:59.108.97.★
首先谢谢博主这么认真地帮我分析这个问题,你的这种严谨治学的态度真的让我很感谢!
你说的PXA270由写MR寄存器而自动触发所有Bank预充电的情况给我了很大的启发,对照着Atmel的9200说明书,看到在它的SDRAM控制器启动流程中明确写着在CBR之前“ Previously, an “All Banks Precharge” command must be issued. ” 也就是说,在这个启动过程中,的确是每一个SDRAM模式变化都需要人工去修改SDRAMC的对应寄存器的。  看来,还是Intel比Atmel要更牛一些,难怪能成PC处理器的老大…… :)

那现在就是在脚本文件中如何简单命令序列来进行配置的问题了,首先毫无疑问应该先配置Config寄存器,以确定tRP、CL、tRCD和tRC对应的时钟周期;接下来就是按标准化流程由 PALL -> CBR(8 SDclock) -> MRS -> Normal 依次修改MPU片内SDRAMC_MR寄存器的模式选择位,以实现模式的切换。
在这个过程中可能会出现两种情况:
一种是正像博主所说的,由于JTAG仿真速度较慢,不同setmem命令直接执行的时延已经足够,那么就万事大吉;
另一种情况是不同setmem命令对同一个SDRAMC_MR寄存器进行多次修改,造成了时许的混乱,那就跟你说的一样:需要在中间加入<NOP>以保证时延;
具体结果如何,就等着过两天Demo板回来就真相大白了!  嘿嘿~~

网友: 本站网友 时间:2007-05-12 18:11:25 IP地址:219.137.161.★
哥们,你这文章对我帮助太大了,我在44b0上练“点灯大法”,弄了两天才看到你这文章,一下解决问题。。太感谢你了。。

网友: 本站网友 时间:2007-05-17 17:30:07 IP地址:202.118.71.★
奇文共欣赏,疑义共与析。大家共同讨论,共同提高。我也受益匪浅,感谢!^-^

网友: richardvip 时间:2007-05-23 19:38:35 IP地址:58.208.252.★
你好,看了你的文章很受启发,我有个问题想请教一下你,你在文中说了SDRAM初始化的问题,我用的是三星的44B0,在它的初始化程序44binit.s中已经有了对SDRAM的初始化,包括对有关的13个寄存器的初始化。请问这样还用在AXD下初始化SDRAM吗,为什么,谢谢

Blog作者的回复:
在程序中初始化SDRAM是为了程序正常运行时能正常访问SDRAM,而把映像文件加载到SDRAM中进行调试时在AXD下初始化SDRAM是为了在加载映像文件时能正常访问SDRAM,以便把映像文件暂时写入SDRAM。两者是两码事。
所以,要在SDRAM中调试程序,就必须先初始化SDRAM。


网友: richardvip 时间:2007-05-26 11:39:09 IP地址:218.4.234.★
你好,感谢你的回复,还有个问题请教一下你,是不是每次运行程序都要在AXD下初始化SDRAM,还是只要在第一次使用时初始化一下就可以了,先 谢谢了

Blog作者的回复:
每次系统重新上电或硬件复位后都需要重新初始化SDRAM才能把映像文件加载到SDRAM。可以设置在AXD启动时自动对SDRAM进行初始化,见“启动AXD时自动初始化SDRAM”部分。有时候AXD启动后需要重新配置,这是ADS自身的问题,主要是看启动后在Command Line Interface窗口有没有出现初始化SDRAM的命令,另外在AXD的源码窗口右键Interleave Disassembly,看各条代码在SDRAM中对应地址的内容是否为正确的机器码,来检查映像文件是否成功加载。


网友: richardvip 时间:2007-05-28 21:01:37 IP地址:58.209.0.★
谢谢,非常感谢你的回复,谢谢你不厌其烦的回答,再看你的帖子前,我的程序一直没有在AXD中对SDRAM初始化,也没有向你在“启动AXD时自动初始化SDRAM:”中体的那样做,就是什么也没做,可是程序也能在SDRAM中调试,这是为什么呀,还是先谢谢了,麻烦你了

Blog作者的回复:
1.确认映像文件是否真的在SDRAM中;
2.确认所用的JTAG仿真器上位机后台服务程序是否自动对SDRAM进行初始化;
3.开发板的启动ROM中是否有对SDRAM进行初始化的代码。
如果上电后SDRAM没有进行初始化,是不可能正常工作的。是否存在上电后能自动按照前次的模式寄存器设置进行初始化的SDRAM,这就不得而知了。


网友: 本站网友 时间:2007-05-29 14:19:42 IP地址:202.198.27.★
你好,看了你的文章很有收获.我刚接触AXD,很多不明白,我用的是S3C2410,我想调试bootloader,初始化SDRAM后,把bootloader加载到SDRAM,但S3C2410默认是上电后自动将NAND FLASH中的前4K复制到SRAM即从0x00000000开始启动,而我现在的bootloader在SDRAM即0x30000000开始,我该如何处理?谢谢!

Blog作者的回复:
基本知识:
1.映像文件的组成结构以及分散加载机制;
2.bootloader的结构与作用;
3.ARM的体系结构(特别是处理器模式与异常处理)的基本知识。
在解决具体问题时:
1.ARM芯片(S3C2410)的启动过程;
2.处理器的memory map图和内存管理单元,还有系统的存储器组织结构;
3.bootloader的引导过程,看它与芯片的启动过程是如何匹配的。
S3C2410我没有接触过,不过从你的描述来看,NAND FLASH中必须存在可以拷贝的启动后要执行的第一条指令,如果bootloader或操作系统中没有对地址进行重新映射(即SRAM还是0地址),那么这里必须是异常向量表,然后再是跳转到真正的bootloader的启动引导代码入口(可以是你说的SDRAM起始地址处)的跳转指令;如果是利用bootloader或操作系统进行地址重映射的,那么异常向量表可以放在别的地方再映射到0地址,这时SRAM的起始地址只需要一条跳转指令进入bootloadr入口地址也可以。
关键是整个启动过程的理解和代码段的分布与连接,以及bootloader与芯片启动过程的匹配。
个人愚见,仅供参考。


网友: 本站网友 时间:2007-11-24 20:02:45 IP地址:59.36.30.★
太感大家了,我新做了一块板,点一个LED点了二天都没有点亮,仿真加载到SDRAM就是加不进,我把板子上所有没有用的元件都焊下来了,只剩下CPU和SDRAM了,结果还是不行,同样的程序在人家开发板跑得好好的,我只好拼命的查硬件,还是没有查到原因,多亏看到这篇文章,才搞定。原来人家的开发板的FLASH内有程序,一上电就初始化了SDRAM,当我调试下载到SDRAM跑时当然没有事,但我新板子FLASH是空的所以上电没有初始化SDRAM,所以跑不起来!!

网友: 本站网友 时间:2007-12-15 11:16:54 IP地址:202.198.178.★
我的板子开始的时候能够正常的运行和调试,但是后来怎么都不能进行AXD调试了,期间也没动过板子啊,SDRAM也进行了初始化,就是不能正常加载运行调试,希望版主可以帮忙解决一下。wuleitianshi911@gmail.com
非常感谢

网友: 本站网友 时间:2009-11-24 11:20:45 IP地址:202.38.199.★
谢谢博主,读你的文章受益匪浅!!

网友: 本站网友 时间:2009-11-24 11:20:48 IP地址:202.38.199.★
谢谢博主,读你的文章受益匪浅!!

 发表评论