DSP篇--C6701功能调试系列之Bootloader程序自引导

Posted nanke_yh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DSP篇--C6701功能调试系列之Bootloader程序自引导相关的知识,希望对你有一定的参考价值。

目录

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: 0x1400000
	ProgramFlash (DRAM, 0x01420000 + i*0x40000, 0x160); //boot:0x1410000
	ProgramFlash (SRAM, 0x01424000 + i*0x40000, 0x40); //boot: 0x1412000

        此处的flash读写和can测试boot的功能部分参考:

DSP篇--C6701功能调试系列之 FLASH测试_nanke_yh的博客-CSDN博客

DSP篇--C6701功能调试系列之CAN总线测试_nanke_yh的博客-CSDN博客

以上是关于DSP篇--C6701功能调试系列之Bootloader程序自引导的主要内容,如果未能解决你的问题,请参考以下文章

DSP篇--C6701功能调试系列之 UART串口测试

DSP篇--C6701功能调试系列之 UART串口测试

DSP篇--C6701功能调试系列之 FLASH测试

DSP篇--C6701功能调试系列之 FLASH测试

DSP篇--C6701功能调试系列之CAN总线测试

DSP篇--C6701功能调试系列之CAN总线测试