初学tms320C6748。最近在工程上遇到一些问题,所以总结下来,和大家一起交流。
tms320C6748 的 片内SRAM包括L1 SRAM L2 SRAM 和on-chip SRAM(SHARED SRAM)。除此之外可以通过DDR2 接口外接 SDRAM 或者通过EMIFA 接口外接 FLASH等存储器来拓展存储空间。这里我就把 FLASH 理解成操作系统的 ROM,把 L2 SRAM 和 SDRAM 当成内存,把 L1 SRAM 理解成 高速缓存。片内 SRAM 的空间很小,总共加起来448KB。但是DDR2 外接的SDRAM可以很大,手册里指出可以连接:16-Bit DDR2 SDRAM With 256-MB Address Space。我现在在用的板子是之前实验室师兄自己做的。一开始我们都是把程序放到L2 SRAM 或者 SHARED SRAM里,也就是在cmd 文件当中把 .text 指向 SRAM 的地址空间。但是由于程序的不断扩展和不够优化,慢慢的 程序 放到SRAM里不够放了,因此想把程序放到DDR2接口连接的SDRAM里。这个时候就 遇到了两个问题。
第一个问题:
DDR2连接的SDRAM的读写速率 和 程序放到 SRAM中的 读写速率有什么不同?
为了回答这个问题,我主要参考了这个链接:
e2e.ti.com/…/279617
这个链接是有人遇到了 SDRAM 比 shared SRAM 读写更快的问题。TI的几个员工做了 很好的回答。大致意思就是:
(1) SHARED SRAM 和 DDR2 SDRAM 本质上都属于外设:
(2)SHARED SRAM 和 DDR2 SDRAM 的 数据总线时钟 是同一时钟:
(3)对SDRAM的访问路径比 对 shared SRAM的访问路径还少了一个 BR:
所以 得出的结论是 对 shared sram的访问 和 对 DDR2 SDRAM的访问速度应该基本相同。至于L2 SRAM ,这个肯定是最快的。我们之前的程序都是放在shared sram里的,所以我认为包括目前把程序放到SDRAM来跑,还没发现问题。
第二个问题:
怎么才能在cmd里把.text放到 DDR 去跑?
现在手里没有cmd文件,反正就是在memory里划分了DDR的起始地址 和长度,6748 DDR的起始地址 是0xC0000000h,然后把.text 指向 DDR。之前把程序放到SDRAM就是这么做的,但是这次却不管用,这次出现的问题是,程序可以编译,但是 利用CCS调试的时候 resume是灰色的,我看网上也有很多同学遇到同样的问题,大家的描述也是五花八门,反正就是一种 找不到main函数,直接就开始跑的状态。这个问题的产生是因为我没有对DDR做初始化。当时主要是参考了这个链接:
e2echina.ti.com/…/106085
TI员工提出了 用 gel文件 对DDR进行配置,下面的回复中也给出了帮助设置DDR寄存器参数的excel文件。
但是这时候我产生了一个疑惑,和这个帖子中的朋友遇到的问题一样:
e2echina.ti.com/…/148657
我在target configuration 里发现 应该放置gel文件的位置是空的。也就是说我压根没有gel文件,但是TI老师说gel文件是用来帮助初始化的,那我就很费解了。一开始我以为是CCS5 集成了默认的gel文件,当时也回复了上个帖子,后来仔细研读实验室师兄的代码才发现 师兄在程序里 写了包含 设置PLL0 PLL1 时钟 和 打开PSC 电源 的函数,实际上也是参考了 gel文件来写的。也就是说 我们既可以在gel文件中初始化(比如设置主频,设置PLL1 频率,打开PSC),也可以在程序中初始化,但是因为我们想把程序放到DDR中,这个时候就不可能说在程序中初始化DDR了,必须在程序运行前把DDR初始化好。(事实上也有人在程序中初始化DDR,然后load两次,第一次load初始化DDR,第二次跑程序,有TI老师说这样应该也行,但是不建议)。所以接下来就是在target configuration中添加一个 gel 文件初始化DDR。这时候又遇到两个问题:
第一个问题
gel文件会不会和师兄之前留下的代码冲突?
这个确实可能冲突,后面再说。
第二个问题
如何初始化DDR?
首先参考这个老师的帖子
e2echina.ti.com/…/8082
下载对应的excel工具,结合你选择的SDRAM datasheet 填写参数,生成5个寄存器的值。然后我是从ccs的安装路径中获取6748 开发板的 gel文件,根据excel生成的值来更改gel 文件 DEVICE_DDRConfig函数当中寄存器的值。再在target configuration中导入gel文件,实现对DDR的配置。配置后 编译通过后,发现resume是绿色的了,不再呈现一上来就跑飞的情况。但是却发现还有问题,点击resume之后 程序跑飞,而且没办法restart。
这个原因就是gel文件和师兄的代码冲突。gel文件中 也有设置PLL0的函数,师兄的代码中也有,寄存器相当于全局变量,而且又存在或操作,所以在gel文件中一个寄存器或上 0x01,然后在师兄的代码中再或上0x10,并不是后者覆盖了前者的操作,相当于寄存器或上0x11,所以导致冲突。后来我注释了师兄的设置主频函数,在gel文件中设置自己的主频,程序跑起来目前还没发现问题。
这就是最近对这个问题的一点浅薄的看法和总结。请各位大神和老师指点我理解的不到位的地方。
PS 真的希望大家提问了问题有了解决方案之后都能总结下自己的解决方案互相交流
Shine:
首先要理解的是GEL文件只是在CCS调试环境下使用,connect板子时,会自动加载target configuration file里设置的gel文件,这个文件gel文件可以不用默认的文件,改成客户的gel文件,如果脱机运行,就用不到gel文件,这时就需要把GEL文件的初始化配置放到应用程序或者在Aisgen工具里配置。因为gel文件只在connect板子时自动加载,所以客户可以在自己的应用根据自己的需要在程序中重新初始化一些外设,两者不会冲突。
对于DDR的配置要根据您外挂DDR芯片的参数来配置,验证是否配置成功,可以通过回读的方式,最好再做个压力测试,看DDR是否稳定。
e2echina.ti.com/…/121580