目录
1、头文件法
2、一级boot
3、二级boot
4、flash程序3取2测试
调试的前期准备可以参考前面的博文:DSP篇--C6701功能调试系列之前期准备_nanke_yh的博客-CSDN博客
boot程序的大小不能超过1KB,它主要完成以下几个功能:第一是配置DSP的EMIF寄存器,然后从FLASH中把各个段中的程序和数据拷贝到用户指定的存储器物理地址中,同时跳到程序的入口点。在此应当注意:C程序的入口点并非main(),而是_c_int00,这是因为在调用main()函数之前,系统必须先建立C语言的运行环境。如为系统堆栈定义.stack段、建立初始化堆栈和祯指针、初始化全局和静态变量等。另外,由于boot程序本身也是COFF文件格式,所以也需格式转换。
1、头文件法
使用的头文件法可参考:DSP篇--C6701 BOOT(头文件烧写法)_nanke_yh的博客-CSDN博客_dsp6701重建工程
2、一级boot
目的:在CAN测试程序的基础上,利用头文件法将其一级boot烧写进flash中,并实现上电程序自启。
方法:头文件法。保存出程序段和数据段。
注意:头文件保存过程:先连接仿真器,再load .out文件,进而利用CCS软件的File->Data->Save功能保存出.dat文件,最后转换成.h即可。
3、二级boot
目的:在CAN测试程序的基础上,利用头文件法将其二级boot烧写进flash中,并实现上电程序自启。
注意:二级boot与一级boot之间的区别在于:
①在.c文件中加入代码#pragma CODE_SECTION(InitCAN, ".prog"),也就是需要将部分程序代码放置在flash以外的地址区域(这里放在的是SRAM区域)。
②在.cmd文件的MEMORY中需要增加新段:
SRAM: o = 2000000h l = 00200000h
同时,在SECTIONS中增加映射段:
.prog > SRAM
③在boot.asm文件中则需要对新增加的段进行地址映射:
_boot_loop:
ldh *B4++, B5
mvkl BOOT_SIZE,B6
add 1,A1,A1
|| mvkh BOOT_SIZE,B6
cmplt A1,B6,B0
NOP
sth B5,*A4++
[B0] B _boot_loop
NOP 5
mvkl EMIF_CE2,A4
|| mvkl EMIF_CE2_DATA,B4
mvkh EMIF_CE2,A4
|| mvkh EMIF_CE2_DATA,B4
stw B4, *A4
mvkl 0x02000000,A4
|| mvkl 0x01440000,B4
mvkh 0x02000000,A4
|| mvkh 0x01440000,B4
zero A1
_sramboot_loop:
ldw *B4++, B5
mvkl SRAM_BOOTSIZE,B6
add 1,A1,A1
|| mvkh SRAM_BOOTSIZE,B6
cmplt A1,B6,B0
NOP
stw B5,*A4++
[B0] B _sramboot_loop
NOP 5
mvkl .s2 _c_int00, B0
mvkh .s2 _c_int00, B0
B .s2 B0
nop 5
④二级boot头文件法保存出来的将会有三段:程序段、数据段以及flash地址外映射段(SRAM段)。在烧写过程中也就需要多写入一个头文件。
4、flash程序3取2测试
目的:在二级boot的CAN测试程序基础上,在 flash中烧写四份同样的数据,增加冗余以防止程序被打翻无法自启,从而设定3取2策略。如若主程序不能自启,FPGA则将主程序放置位置擦除,并比对剩下3份数据,写入正确程序以实现程序自启。
方法:头文件法。
注意:在can测试程序的boot中需要更改映射地址,然后在flash烧写程序中改成相应的地址。改动的地址需要根据硬件师FPGA中设置的大小来调整。
代码示例:
for(i = 0 ; i < 4; i++)//写四份
{ProgramFlash (PRAM, 0x01400000 + i*0x40000, 0x6E0);//boot: 0x1400000ProgramFlash (DRAM, 0x01420000 + i*0x40000, 0x160); //boot:0x1410000ProgramFlash (SRAM, 0x01424000 + i*0x40000, 0x40); //boot: 0x1412000
}
此处的flash读写和can测试boot的功能部分参考:
DSP篇--C6701功能调试系列之 FLASH测试_nanke_yh的博客-CSDN博客
DSP篇--C6701功能调试系列之CAN总线测试_nanke_yh的博客-CSDN博客