F2812的Flash烧写程序要求

    技术2022-05-17  32

     F2812的Flash烧写程序要求

    1、cmd文件要用符合flash烧写的cmd文件,不同于sram用的cmd文件;

    2812_flash.cmd文件如下:

     

    MEMORY

    {     

           PAGE 0 :          

             

                  OTP          : origin = 0x3D7800, length = 0x000800   

                  FLASHJ     : origin = 0x3D8000, length = 0x002000   

                  FLASHI     : origin = 0x3DA000, length = 0x002000   

                  FLASHH    : origin = 0x3DC000, length = 0x004000   

                  FLASHG    : origin = 0x3E0000, length = 0x004000   

                  FLASHF     : origin = 0x3E4000, length = 0x004000   

                  FLASHE     : origin = 0x3E8000, length = 0x004000   

                  FLASHD     : origin = 0x3EC000, length = 0x004000   

                  FLASHC     : origin = 0x3F0000, length = 0x004000   

                  FLASHB     : origin = 0x3F4000, length = 0x002000    

                  FLASHA     : origin = 0x3F6000, length = 0x001F80   

                  CSM_RSVD   : origin = 0x3F7F80, length = 0x000076   

                  BEGIN      : origin = 0x3F7FF6, length = 0x000002   

                

                  CSM_PWL    : origin = 0x3F7FF8, length = 0x000008

                

          

                  ROM        : origin = 0x3FF000, length = 0x000FC0   

                  RESET      : origin = 0x3FFFC0, length = 0x000002   

                  VECTORS    : origin = 0x3FFFC2, length = 0x00003E   

                

                

                  RAML0      : origin = 0x008000, length = 0x001000        

                   

                       

           PAGE 1 :

                

                  ZONE0        : origin = 0x002000, length = 0x002000 

                  ZONE1        : origin = 0x004000, length = 0x002000 

                  ZONE2        : origin = 0x080000, length = 0x080000 

                  ZONE6        : origin = 0x100000, length = 0x080000 

     

                    

                  RAMM0      : origin = 0x000000, length = 0x000400   

                  RAMM1      : origin = 0x000400, length = 0x000400   

                  RAML1      : origin = 0x009000, length = 0x001000           

                  DRAMH0     : origin = 0x3f9000, length = 0x001000      

                                            

                

                  DEV_EMU    : origin = 0x000880, length = 0x000180

                  FLASH_REGS : origin = 0x000A80, length = 0x000060

                  CSM        : origin = 0x000AE0, length = 0x000010

                  XINTF      : origin = 0x000B20, length = 0x000020

                  CPU_TIMER0 : origin = 0x000C00, length = 0x000008

                  CPU_TIMER1 : origin = 0x000C08, length = 0x000008           

                  CPU_TIMER2 : origin = 0x000C10, length = 0x000008           

                  PIE_CTRL   : origin = 0x000CE0, length = 0x000020

                  PIE_VECT   : origin = 0x000D00, length = 0x000100

                

                

                  ECAN_A     : origin = 0x006000, length = 0x000100

                  ECAN_AMBOX : origin = 0x006100, length = 0x000100

                

                

                  SYSTEM     : origin = 0x007010, length = 0x000020

                  SPI_A      : origin = 0x007040, length = 0x000010

                  SCI_A      : origin = 0x007050, length = 0x000010

                  XINTRUPT   : origin = 0x007070, length = 0x000010

                  GPIOMUX    : origin = 0x0070C0, length = 0x000020

                  GPIODAT    : origin = 0x0070E0, length = 0x000020

                  ADC        : origin = 0x007100, length = 0x000020

                  EV_A       : origin = 0x007400, length = 0x000040

                  EV_B       : origin = 0x007500, length = 0x000040

                  SPI_B      : origin = 0x007740, length = 0x000010

                  SCI_B      : origin = 0x007750, length = 0x000010

                  MCBSP_A    : origin = 0x007800, length = 0x000040                 

    }

     

     

     

    SECTIONS

    {

         

           .cinit            : > FLASHC,      PAGE = 0                  

           .pinit            : > FLASHC,      PAGE = 0         

           .text            : > FLASHC,      PAGE = 0         

           codestart    : > BEGIN,       PAGE = 0              

      

      

        ramfuncs        

                            : LOAD = FLASHC, PAGE = 0         

                            RUN = RAML0,   PAGE = 0         

                            RUN_START(_RamfuncsRunStart),

                            LOAD_START(_RamfuncsLoadStart),

                            LOAD_END(_RamfuncsLoadEnd)

     

     

      

      

           .delayasmpage   

                             : LOAD = FLASHC, PAGE = 0         

                            RUN = RAML0,   PAGE = 0         

                            RUN_START(_DelayasmRunStart),

                            LOAD_START(_DelayasmLoadStart),

                            LOAD_END(_DelayasmLoadEnd)

     

      

           .xintfwrasmpage

                                         : LOAD = FLASHC, PAGE = 0         

                            RUN = RAML0,   PAGE = 0         

                            RUN_START(_XintfwrasmRunStart),

                            LOAD_START(_XintfwrasmLoadStart),

                            LOAD_END(_XintfwrasmLoadEnd)

     

      

           .xintfmemcpyasmpage

                                         : LOAD = FLASHC, PAGE = 0         

                            RUN = RAML0,   PAGE = 0         

                            RUN_START(_XintfmemcpyasmRunStart),

                            LOAD_START(_XintfmemcpyasmLoadStart),

                            LOAD_END(_XintfmemcpyasmLoadEnd)

     

      

           .xintfrdasmpage

                                         : LOAD = FLASHC, PAGE = 0         

                            RUN = RAML0,   PAGE = 0         

                            RUN_START(_XintfrdasmRunStart),

                            LOAD_START(_XintfrdasmLoadStart),

                            LOAD_END(_XintfrdasmLoadEnd)

                                     

         

           .stack            : > RAMM1,       PAGE = 1         

           .bss              : > RAML1,       PAGE = 1         

           .ebss             : > RAML1,       PAGE = 1         

        .cio              : > RAML1,       PAGE = 1

           .sysmem           : > RAML1,       PAGE = 1         

           .esysmem          : > RAML1,       PAGE = 1         

         

         

         

           .const            : > FLASHA,      PAGE = 0         

           .econst           : > FLASHA,      PAGE = 0         

           .switch           : > FLASHA,      PAGE = 0         

         

         

           DevEmuRegsFile    : > DEV_EMU,     PAGE = 1

           FlashRegsFile     : > FLASH_REGS,  PAGE = 1

           CsmRegsFile       : > CSM,         PAGE = 1

           XintfRegsFile     : > XINTF,       PAGE = 1

           CpuTimer0RegsFile : > CPU_TIMER0,  PAGE = 1    

           CpuTimer1RegsFile : > CPU_TIMER1,  PAGE = 1    

           CpuTimer2RegsFile : > CPU_TIMER2,  PAGE = 1    

           PieCtrlRegsFile   : > PIE_CTRL,    PAGE = 1    

           PieVectTable      : > PIE_VECT,    PAGE = 1

         

         

           ECanaRegsFile     : > ECAN_A,      PAGE = 1 

           ECanaMboxesFile   : > ECAN_AMBOX   PAGE = 1

         

         

           SysCtrlRegsFile   : > SYSTEM,      PAGE = 1

           SpiaRegsFile      : > SPI_A,       PAGE = 1

           SciaRegsFile      : > SCI_A,       PAGE = 1

           XIntruptRegsFile  : > XINTRUPT,    PAGE = 1

           GpioMuxRegsFile   : > GPIOMUX,     PAGE = 1

           GpioDataRegsFile  : > GPIODAT      PAGE = 1

           AdcRegsFile       : > ADC,         PAGE = 1

           EvaRegsFile       : > EV_A,        PAGE = 1

           EvbRegsFile       : > EV_B,        PAGE = 1

           ScibRegsFile      : > SCI_B,       PAGE = 1

           McbspaRegsFile    : > MCBSP_A,     PAGE = 1

         

           csm_rsvd          : > CSM_RSVD,    PAGE = 0

         

           CsmPwlFile        : > CSM_PWL,     PAGE = 0

         

         

           IQmath            : > FLASHA,      PAGE = 0                

           IQmathTables      : > ROM,         PAGE = 0, TYPE = NOLOAD 

         

         

           .reset            : > RESET,       PAGE = 0, TYPE = DSECT

           vectors           : > VECTORS,     PAGE = 0, TYPE = DSECT

    }

    2、添加文件DSP281x_CodeStartBranch.asm,用于复位后调转到_c_int00(在库文件rts2800_ml.lib中);

    ;// TI File $Revision: /main/2 $

    ;// Checkin $Date: April 29, 2005   11:11:32 $

    ;//###########################################################################

    ;//

    ;// FILE:  DSP281x_CodeStartBranch.asm

    ;//

    ;// TITLE: Branch for redirecting code execution after boot.

    ;//

    ;//###########################################################################

    ;// $TI Release:$

    ;// $Release Date:$

    ;//###########################################################################

     

    ***********************************************************************

     

    WD_DISABLE       .set  1            ;set to 1 to disable WD, else set to 0

     

        .ref _c_int00

     

    ***********************************************************************

    * Function: codestart section

    *

    * Description: Branch to code starting point

    ***********************************************************************

     

        .sect "codestart"

     

    code_start:

        .if WD_DISABLE == 1

            LB wd_disable       ;Branch to watchdog disable code

        .else

            LB _c_int00         ;Branch to start of boot.asm in RTS library

        .endif

     

    ;end codestart section

     

     

    ***********************************************************************

    * Function: wd_disable

    *

    * Description: Disables the watchdog timer

    ***********************************************************************

        .if WD_DISABLE == 1

     

        .text

    wd_disable:

        SETC OBJMODE        ;Set OBJMODE for 28x object code

        EALLOW              ;Enable EALLOW protected register access

        MOVZ DP, #7029h>>6  ;Set data page for WDCR register

        MOV @7029h, #0068h  ;Set WDDIS bit in WDCR to disable WD

        EDIS                ;Disable EALLOW protected register access

        LB _c_int00         ;Branch to start of boot.asm in RTS library

     

        .endif

     

    ;end wd_disable

     

     

     

           .end

         

    ; end of file CodeStartBranch.asm

    3、添加InitFlash.c文件;

     

    //InitFlash.c

     

     

     

     

     

    #include "DSP28_Device.h"

     

     

     

    #pragma CODE_SECTION(InitFlash, "ramfuncs");

     

     

    //                   CAUTION

    // This function MUST be executed out of RAM. Executing it

    // out of OTP/Flash will yield unpredictable results

     

     

     

     

     

     

     

     

    void InitFlash(void)

    {

           EALLOW;

     

        //Pump and bank set to active mode   

           FlashRegs.FPWR.bit.PWR = 3;  

     

           //Clear the 3VSTAT bit

           FlashRegs.FSTATUS.bit.V3STAT = 1;                     

         

          

         

          

     

           //设置处理器由睡眠状态转换到独立运行状态过程的等待状态

           FlashRegs.FSTDBYWAIT.bit.STDBYWAIT = 0x01FF;     

           //设置处理器由独立运行状态到睡眠状态过程的等待状态

           FlashRegs.FACTIVEWAIT.bit.ACTIVEWAIT = 0x01FF; 

           //设置Flash的随机访问等待状态(Random Waitstate)

           FlashRegs.FBANKWAIT.bit.RANDWAIT = 1;

           //设置页切换等待状态(Paged Waitstate)

           FlashRegs.FBANKWAIT.bit.PAGEWAIT = 1;

           //OTP waitstates

           FlashRegs.FOTPWAIT.bit.OPTWAIT = 1;   //必须大于等于1                      

         

           //使能Flash流水线操作,提高处理器程序在Flash中执行时系统的性能

           FlashRegs.FOPT.bit.ENPIPE = 1; //此时,RANDWAIT >= PAGEWAIT >=1

         

           EDIS;

         

           //等待流水线操作完成,保证最后一个设置操作完成后才从该函数返回

           asm(" RPT #7 || NOP");

    }   

     

     

         

    //===========================================================================

    // No more.

    //===========================================================================

    4、将InitFlash()程序从flash搬运到sram中运行,该程序不能在flash中运行,搬运步骤如下:

    (1)cmd文件中定义相应的段:

     

        ramfuncs        

                                      : LOAD = FLASHC, PAGE = 0        

                           RUN = RAML0,   PAGE = 0        

                           RUN_START(_RamfuncsRunStart),

                           LOAD_START(_RamfuncsLoadStart),

                           LOAD_END(_RamfuncsLoadEnd)

    (2)声明变量:

    //InitFlash()

    extern unsigned int RamfuncsRunStart;

    extern unsigned int RamfuncsLoadStart;

    extern unsigned int RamfuncsLoadEnd;

    (3)将函数InitFlash()定位到定义的段ramfuncs中:

    #pragma CODE_SECTION(InitFlash, "ramfuncs");

    (4)执行InitFlash()程序前将其从flash中搬运到sram中:

         

           //将InitFlash()程序从Flash搬到RAM中运行

           memcpy(&RamfuncsRunStart,&RamfuncsLoadStart,&RamfuncsLoadEnd - &RamfuncsLoadStart);

           //初始化Flash

           InitFlash();


    最新回复(0)