我做的bootload的方法不是标准的方法。方案大致是先load要烧的主程序,然后load烧
写程序,把主程序的代码当作数据写到FLASH中。然后利用DSP固化的程序把flash中的代
码搬到DSP中,实现自举运行。
我采用的DSP是VC33,FLASH是AM29LV800B
硬件连接如下:
我硬件接是: DSP FLASH
page1\ cs\
r/w\ we\
(非r/w\)或strb\ oe\
reset\接3.3V
/RDY 非ry/by\
BOOT采用中断INT1,即INT1接地。DSP复位后检测到INT1后,从外部地址400000H进行搬
移。由于FLASH是16位的,所以两个地址写入一个DSP代码。
以下是我下入FLASH中的代码
0x400000 0010 ;表明FLASH长度为16位
0x400001 0000
0x400002 00f8 ;设置总线控制寄存器
0x400003 0000
0x400004 0100 ;程序区块的长度
0x400005 0000
0x400006 1000 ;程序区块的起始地址,即入口地址
0x400007 0080
............. ;程序块的代码
0x400208 0100 ;数据区块的长度
0x400209 0000
0x400210 6000
0x400211 0080 ;数据区块的起始地址
................ ;数据块的代码
0x400412 003f ;向量区块的长度
0x400413 0000
0x400414 9fc1
0x400415 0080 ;向量区块的起始地址
................ ;向量表的代码
0x400492 0000
0x400493 0000 ;结束标志
对FLASH擦除和编程的方式在FLASH的说明上有,就不多说了。这里需注意几点:
1、 对FLASH的操作应该是先复位,再擦除,然后编程
2、 根据DSP的固化程序,BOOT后的入口地址是BOOT时的第一个块的起始地址,所以必须
将程序区块作为第一个块写入
3、 在执行擦除时需要加比较长的等待时间,这个可以根据FLASH说明中的时序图得知
4、 写完最后一个块后,写入0表明结束。因为在DSP的BOOT程序中,当搬到0长度块时,
BOOT程序就会跳到第一个块的起始地址运行。
5、 写入块的代码时,长度须与前面写入的块的长度匹配
6、 由于对FLASH的写入时,FLASH内部有一个编程的时间,所以写完一个后加一定延时
。
7、 主程序和烧写程序的.cmd中的地址空间不能冲突,不然load烧写程序时复盖掉要烧
入FLASH中的主程序的代码。
我用了一个测试的小程序烧写,BOOT后可以正常运行。可能烧大程序时还会遇到些问题
但思路应该差不多。
以上算是这两天这BOOT的一些心得,由于刚学DSP,属于菜鸟水平(实话,呵呵),有错
的地方希望多多指点。另外,现在用的是VC33,做这款DSP的同学比较少,资料也不多,
希望有做VC33的多多交流。
我的目标是:每天进步一小点,呵呵
最后,谢过这几天帮助过我的各位大虾,谢谢你们的指点。
1楼
0
0
回复