`
huozheleisi
  • 浏览: 1238081 次
文章分类
社区版块
存档分类
最新评论

F2812的Flash烧写程序要求

 
阅读更多

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();

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics