1 要了解烧写,首先要了解6437的存储器组织
存储器的硬件组织原理可以参看TMSC6000结构原理与硬件设计(北京航天航空大学);具体的存储器的硬件连接可以参照合众达的DEC6437原理图。从原理图可以知道,flash的控制信号线CE/OE/WE都是连接与板子上面的CPLD,如需要控制读写,还要参看flash的datasheet来了解其读写时序,编写CPLD的程序,这里暂且略过,S29AL032D数据线22根,相当于内部有4M*8bit的存储空间(在flash烧写的程序中会有一句
if(FillSize > 0x100000)
{
printf("The OUT file is too big!
");
}
之所以这里是1M,不是4M,是因为后面调用fread的时候是按照4字节为单位来读取的!),地址线连接于EM_BA0-1(用于bank区分) EM_A0-A19
片选是选择的cs2,因此flash用到的空间是EMIF_CS2 = 0x0x4200 0000,查看存储器映射表(详见TMS320DM6437 Digital Media Processor中table 2-3)
因此,在烧写的程序中基址被定为
#define FLASH_BASE ( EMIF_CS2_BASE )
数据总线与dsp的连接是:EM_D0-7 8位
因此,flash写数据时,指针设置为从FLASH_BASE开始的地方。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
Dsp上电或复位后,根据设定的dsp自举方式进行引导。引导方式有三种,可以参看SEED-DEC6437用户指南 (Rev.A) page27,SEED-DEC6437 所使用的启动方式是EMIFA ROM FASTBOOT 不采用AIS 模式,即BOOTMODE[3:0] = 1001b, FASTBOOT = 1,AEM[2:0] = 001b。在这种模式下,板卡上电后,先进入地址0x1000 0000(boot rom),
这里有一段出厂时就烧写好的bootloader,这段程序的功能通常是从EMIF CE1端口自动地复制一块数据到地址,实际上就是从flash首地址开始拷贝一段数据出来(具体数据放在什么地方,因为没有boot rom程序参考,因此个人认为是放在应用程序的cmd文件为bootld所指定的1k运行空间,可能是flash,也可能是ram,我自己设置的是ram)
L2ram BOOT_RAM: o = 0x10800000 l = 0x00000400
其实这里是有点疑问的:因为指导书上是这样说的:,先进入地址0x1000 0000,而后直接进入Flash 的首地址0x4200 0000,开始执行烧写在Flash 的程序。我个人认为程序具体在哪里运行应该是看boot rom中一级bootloader将程序拷贝到哪里去了。。。
一般的说法是,一级bootloader复制的数据块大小是有一定限制的,根据芯片不同而不同,许多地方提到的都是1k,有些也提到64k。具体dm6437的手册中应该也会提到,但我没有具体看。当然用1k的程序来实现flash程序的二级搬移应该是够了的。通过二级bootloader就可以实现全部用户程序到cmd指定区域的ram的搬移,搬移完成后,就跳转到c程序的入口。
反正后面的段是按照引导表COPY_TABLE来拷贝到对应的ram区,而COPY_TABLE的内容是在flash烧写时,由烧写程序根据.out文件的内容解析得到的各个段的大小、装载地址及内容而制成的,flash烧写时写入COPY_TABLE的地址就是从0x4200 0000开始后的1k偏移地址0x4200 0400开始。(也许有人会问为何设置在这个地方,因为二级bootloader是在flash开始1k空间,后面才是用户真正的应用程序,你总不能让bootloader自己拷贝自己吧,^_^)
一周热门 更多>