我的硬件系统是44b0+sst39vf1601,使用h-jtag调试时正常,但使用H-flasher将程序下载到flash中程序不能运行。我下载开发板提供的目标代码正常。<br />我ads中的arm linker中的ro-base中设置为0x0(flash起始地址),rw-base中设置为0X0C000000(我的开发板中的sdram的起始地址是0X0C000000)。<br />并在layout中设置起止部分为44binit.o,section为init<br />附启动程序,请大家帮忙看看,谢谢!<br /> INCLUDE ..\inc\option.s<br /> INCLUDE ..\inc\memcfg.s<br /> EXPORT START<br /><br />;****************************************************************************<br />;存储器空间<br />;GCS6 64M 16bit(8MB) DRAM/SDRAM(0xc000000-0xc7fffff)<br />;APP RAM=0xc000000~0xc7effff <br />;44BMON RAM=0xc7f0000-0xc7fffff<br />;STACK =0xc7ffa00 <br /><br />;****************************************************************************<br />;中断控制预定义<br />INTPND EQU 0x01e00004<br />INTMOD EQU 0x01e00008<br />INTMSK EQU 0x01e0000c<br />I_ISPR EQU 0x01e00020<br />I_CMST EQU 0x01e0001c<br /><br />;****************************************************************************<br />;看门狗定时器预定义<br />WTCON EQU 0x01d30000<br /><br />;****************************************************************************<br />;系统时钟预定义<br />PLLCON EQU 0x01d80000<br />CLKCON EQU 0x01d80004<br />LOCKTIME EQU 0x01d8000c<br /> <br />;****************************************************************************<br />;存储器控制预定义<br />REFRESH EQU 0x01c80024<br /><br />;****************************************************************************<br />;BDMA目的寄存器<br />BDIDES0 EQU 0x1f80008<br />BDIDES1 EQU 0x1f80028<br /><br />;****************************************************************************<br />;预定义常数(常量)<br />USERMODE EQU 0x10<br />FIQMODE EQU 0x11<br />IRQMODE EQU 0x12<br />SVCMODE EQU 0x13<br />ABORTMODE EQU 0x17<br />UNDEFMODE EQU 0x1b<br />MODEMASK EQU 0x1f<br />NOINT EQU 0xc0<br /><br />;****************************************************************************<br />;检查是否使用tasm.exe进行编译<br /> GBLL THUMBCODE<br /> [ {CONFIG} = 16 <br />THUMBCODE SETL {TRUE}<br /> CODE32<br /> | <br />THUMBCODE SETL {FALSE}<br /> ]<br /><br /> [ THUMBCODE<br /> CODE32 ;for start-up code for Thumb mode<br /> ]<br /><br /> MACRO<br />$HandlerLabel HANDLER $HandleLabel<br /><br />;****************************************************************************<br />$HandlerLabel<br /> sub sp,sp,#4 ;decrement sp(to store jump address)<br /> stmfd sp!,{r0} ;PUSH the work register to stack(lr does't push because it return to original address)<br /> ldr r0,=$HandleLabel;load the address of HandleXXX to r0<br /> ldr r0,[r0] ;load the contents(service routine start address) of HandleXXX<br /> str r0,[sp,#4] ;store the contents(ISR) of HandleXXX to stack<br /> ldmfd sp!,{r0,pc} ;POP the work register and pc(jump to ISR)<br /> MEND<br /><br /> IMPORT |Image$$RO$$Limit| ; End of ROM code (=start of ROM data)<br /> IMPORT |Image$$RW$$Base| ; Base of RAM to initialise<br /> IMPORT |Image$$ZI$$Base| ; Base and limit of area<br /> IMPORT |Image$$ZI$$Limit| ; to zero initialise<br /><br /> IMPORT Main ; The main entry of mon program <br /><br /> AREA Init,CODE,READONLY<br /><br />;****************************************************************************<br /> ENTRY ;汇编程序入口<br />START<br /> b ResetHandler ;for debug<br /> b HandlerUndef ;handlerUndef<br /> b HandlerSWI ;SWI interrupt handler<br /> b HandlerPabort ;handlerPAbort<br /> b HandlerDabort ;handlerDAbort<br /> b . ;handlerReserved<br /> b HandlerIRQ<br /> b HandlerFIQ<br /> ;***IMPORTANT NOTE***<br /> ;If the H/W vectored interrutp mode is enabled, The above two instructions should<br /> ;be changed like below, to work-around with H/W bug of S3C44B0X interrupt controller. <br /> ; b HandlerIRQ -> subs pc,lr,#4<br /> ; b HandlerIRQ -> subs pc,lr,#4<br /><br />;****************************************************************************<br />VECTOR_BRANCH<br /> ldr pc,=HandlerEINT0 ;mGA H/W interrupt vector table<br /> ldr pc,=HandlerEINT1 ; <br /> ldr pc,=HandlerEINT2 ;<br /> ldr pc,=HandlerEINT3 ;<br /> ldr pc,=HandlerEINT4567 ;<br /> ldr pc,=HandlerTICK ;mGA<br /> b .<br /> b .<br /> ldr pc,=HandlerZDMA0 ;mGB<br /> ldr pc,=HandlerZDMA1 ;<br /> ldr pc,=HandlerBDMA0 ;<br /> ldr pc,=HandlerBDMA1 ;<br /> ldr pc,=HandlerWDT ;<br /> ldr pc,=HandlerUERR01 ;mGB<br /> b .<br /> b .<br /> ldr pc,=HandlerTIMER0 ;mGC<br /> ldr pc,=HandlerTIMER1 ;<br /> ldr pc,=HandlerTIMER2 ;<br /> ldr pc,=HandlerTIMER3 ;<br /> ldr pc,=HandlerTIMER4 ;<br /> ldr pc,=HandlerTIMER5 ;mGC<br /> b .<br /> b .<br /> ldr pc,=HandlerURXD0 ;mGD<br /> ldr pc,=HandlerURXD1 ;<br /> ldr pc,=HandlerIIC ;<br /> ldr pc,=HandlerSIO ;<br /> ldr pc,=HandlerUTXD0 ;<br /> ldr pc,=HandlerUTXD1 ;mGD<br /> b .<br /> b .<br /> ldr pc,=HandlerRTC ;mGKA<br /> b . ;<br /> b . ;<br /> b . ;<br /> b . ;<br /> b . ;mGKA<br /> b .<br /> b .<br /> ldr pc,=HandlerADC ;mGKB<br /> b . ;<br /> b . ;<br /> b . ;<br /> b . ;<br /> b . ;mGKB<br /> b .<br /> b .<br />;0xe0=EnterPWDN<br /> ldr pc,=EnterPWDN<br /><br /> LTORG <br /><br />;****************************************************************************<br />HandlerFIQ HANDLER HandleFIQ<br />HandlerIRQ HANDLER HandleIRQ<br />HandlerUndef HANDLER HandleUndef<br />HandlerSWI HANDLER HandleSWI<br />HandlerDabort HANDLER HandleDabort<br />HandlerPabort HANDLER HandlePabort<br /><br />HandlerADC HANDLER HandleADC<br />HandlerRTC HANDLER HandleRTC<br />HandlerUTXD1 HANDLER HandleUTXD1<br />HandlerUTXD0 HANDLER HandleUTXD0<br />HandlerSIO HANDLER HandleSIO<br />HandlerIIC HANDLER HandleIIC<br />HandlerURXD1 HANDLER HandleURXD1<br />HandlerURXD0 HANDLER HandleURXD0<br />HandlerTIMER5 HANDLER HandleTIMER5<br />HandlerTIMER4 HANDLER HandleTIMER4<br />HandlerTIMER3 HANDLER HandleTIMER3<br />HandlerTIMER2 HANDLER HandleTIMER2<br />HandlerTIMER1 HANDLER HandleTIMER1<br />HandlerTIMER0 HANDLER HandleTIMER0<br />HandlerUERR01 HANDLER HandleUERR01<br />HandlerWDT HANDLER HandleWDT<br />HandlerBDMA1 HANDLER HandleBDMA1<br />HandlerBDMA0 HANDLER HandleBDMA0<br />HandlerZDMA1 HANDLER HandleZDMA1<br />HandlerZDMA0 HANDLER HandleZDMA0<br />HandlerTICK HANDLER HandleTICK<br />HandlerEINT4567 HANDLER HandleEINT4567<br />HandlerEINT3 HANDLER HandleEINT3<br />HandlerEINT2 HANDLER HandleEINT2<br />HandlerEINT1 HANDLER HandleEINT1<br />HandlerEINT0 HANDLER HandleEINT0<br /><br /><br />;****************************************************************************<br />;下面两个程序中的一个可以用作无向量中断<br />IsrIRQ ;using I_ISPR register.<br /> sub sp,sp,#4 ;reserved for PC<br /> stmfd sp!,{r8-r9} <br /><br /> ;IMPORTANT CAUTION<br /> ;if I_ISPC isn't used properly, I_ISPR can be 0 in this routine.<br /><br /> ldr r9,=I_ISPR<br /> ldr r9,[r9]<br /><br /> cmp r9, #0x0 ;If the IDLE mode work-around is used,<br /> ;r9 may be 0 sometimes.<br /> beq %F2<br /><br /> mov r8,#0x0<br />0<br /> movs r9,r9,lsr #1<br /> bcs %F1<br /> add r8,r8,#4<br /> b %B0<br /><br />1<br /> ldr r9,=HandleADC<br /> add r9,r9,r8<br /> ldr r9,[r9]<br /> str r9,[sp,#8]<br /> ldmfd sp!,{r8-r9,pc}<br /><br />2<br /> ldmfd sp!,{r8-r9}<br /> add sp,sp,#4<br /> subs pc,lr,#4<br /><br />;****************************************************************************<br />;初始化程序开始<br />ResetHandler<br /> ldr r0,=WTCON ;禁止看门狗<br /> ldr r1,=0x0 <br /> str r1,[r0]<br /><br /> ldr r0,=INTMSK<br /> ldr r1,=0x07ffffff ;禁止所有中断<br /> str r1,[r0]<br /><br /> ;设定时钟控制寄存器<br /> ldr r0,=LOCKTIME<br /> ldr r1,=0xfff<br /> str r1,[r0]<br /><br /> [ PLLONSTART<br /> ldr r0,=PLLCON ;锁相环倍频设定<br /> ldr r1,=((M_DIV<<12)+(P_DIV<<4)+S_DIV) ;设定系统主时钟频率<br /> str r1,][r0]<br /> ]<br /><br /> ldr r0,=CLKCON <br /> ldr r1,=0x7ff8 ;所有功能单元块时钟使能<br /> str r1,[r0]<br /><br />;****************************************************************************<br />;为BDMA改变BDMACON的复位值<br /> ldr r0,=BDIDES0 <br /> ldr r1,=0x40000000 ;BDIDESn reset value should be 0x40000000 <br /> str r1,[r0]<br /><br /> ldr r0,=BDIDES1 <br /> ldr r1,=0x40000000 ;BDIDESn reset value should be 0x40000000 <br /> str r1,[r0]<br /><br />;****************************************************************************<br />;设定存储器控制寄存器<br /> ldr r0,=SMRDATA<br /> ldmia r0,{r1-r13}<br /> ldr r0,=0x01c80000 ;BWSCON Address<br /> stmia r0,{r1-r13}<br /><br />;****************************************************************************<br />;初始化堆栈<br /> ldr sp, =SVCStack<br /> bl InitStacks<br /><br />;****************************************************************************<br />;设置中断处理<br /> ldr r0,=HandleIRQ ;This routine is needed<br /> ldr r1,=IsrIRQ ;if there isn't 'subs pc,lr,#4' at 0x18, 0x1c<br /> str r1,[r0]<br /><br />;****************************************************************************<br />;Copy and paste RW data/zero initialized data<br /><br /> LDR r0, =|Image$$RO$$Limit| ; Get pointer to ROM data<br /> LDR r1, =|Image$$RW$$Base| ; and RAM copy<br /> LDR r3, =|Image$$ZI$$Base| <br /> ;Zero init base => top of initialised data<br /> <br /> CMP r0, r1 ; Check that they are different<br /> BEQ %F1<br />0 <br /> CMP r1, r3 ; Copy init data<br /> LDRCC r2, [r0], #4 ;--> LDRCC r2, [r0] + ADD r0, r0, #4 <br /> STRCC r2, [r1], #4 ;--> STRCC r2, [r1] + ADD r1, r1, #4<br /> BCC %B0<br />1 <br /> LDR r1, =|Image$$ZI$$Limit| ; Top of zero init segment<br /> MOV r2, #0<br />2 <br /> CMP r3, r1 ; Zero init<br /> STRCC r2, [r3], #4<br /> BCC %B2<br /><br /> [ :LNOT:THUMBCODE<br /> BL Main ;从汇编进入C语言代码空间,不要使用main()<br /> B . <br /> ]<br /><br /> [ THUMBCODE ;for start-up code for Thumb mode<br /> orr lr,pc,#1<br /> bx lr<br /> CODE16<br /> bl Main ;从汇编进入C语言代码空间,不要使用main()<br /> b .<br /> CODE32<br /> ]<br /><br />;****************************************************<br />;本函数用来初始化堆栈<br />;****************************************************<br />InitStacks<br /> ;Don't use DRAM,such as stmfd,ldmfd......<br /> ;SVCstack is initialized before<br /> ;Under toolkit ver 2.50, 'msr cpsr,r1' can be used instead of 'msr cpsr_cxsf,r1'<br /><br /> mrs r0,cpsr<br /> bic r0,r0,#MODEMASK<br /> orr r1,r0,#UNDEFMODE|NOINT<br /> msr cpsr_cxsf,r1 ;UndefMode<br /> ldr sp,=UndefStack<br /> <br /> orr r1,r0,#ABORTMODE|NOINT<br /> msr cpsr_cxsf,r1 ;AbortMode<br /> ldr sp,=AbortStack<br /><br /> orr r1,r0,#IRQMODE|NOINT<br /> msr cpsr_cxsf,r1 ;IRQMode<br /> ldr sp,=IRQStack<br /> <br /> orr r1,r0,#FIQMODE|NOINT<br /> msr cpsr_cxsf,r1 ;FIQMode<br /> ldr sp,=FIQStack<br /><br /> bic r0,r0,#MODEMASK|NOINT<br /> orr r1,r0,#SVCMODE<br /> msr cpsr_cxsf,r1 ;SVCMode<br /> ldr sp,=SVCStack<br /><br /> ;USER mode is not initialized.<br /> mov pc,lr ;The LR register may be not valid for the mode changes.<br /><br />;****************************************************<br />;本函数用来进入掉电模式<br />;****************************************************<br />;void EnterPWDN(int CLKCON);<br />EnterPWDN<br /> mov r2,r0 ;r0=CLKCON<br /> ldr r0,=REFRESH <br /> ldr r3,[r0]<br /> mov r1, r3<br /> orr r1, r1, #0x400000 ;self-refresh enable<br /> str r1, [r0]<br /><br /> nop ;Wait until self-refresh is issued. May not be needed.<br /> nop ;If the other bus master holds the bus, ...<br /> nop ; mov r0, r0<br /> nop<br /> nop<br /> nop<br /> nop<br /><br />;enter POWERDN mode<br /> ldr r0,=CLKCON<br /> str r2,[r0]<br /><br />;wait until enter SL_IDLE,STOP mode and until wake-up<br /> mov r0,#0xff<br />0 subs r0,r0,#1<br /> bne %B0<br /><br />;exit from DRAM/SDRAM self refresh mode.<br /> ldr r0,=REFRESH<br /> str r3,[r0]<br /> mov pc,lr<br /><br /> LTORG<br /><br />SMRDATA DATA<br />;*****************************************************************<br />;存储器最好配置成最优的性能,下面的参数不是最优化的<br />;*****************************************************************<br /><br />;*** memory access cycle parameter strategy ***<br />; 1) Even FP-DRAM, EDO setting has more late fetch point by half-clock<br />; 2) The memory settings,here, are made the safe parameters even at 66Mhz.<br />; 3) FP-DRAM Parameters:tRCD=3 for tRAC, tcas=2 for pad delay, tcp=2 for bus load.<br />; 4) DRAM refresh rate is for 40Mhz. <br /><br />;bank0 16bit BOOT ROM SST39VF160/SST39VF320<br />;bank1 8bit Nand Flash K9F2808U0A/K9F5608U0A<br />;bank2 16bit USB1.1 PDIUSBD12<br />;bank3 RTL8019<br />;bank4 No Uesed<br />;bank5 No Uesed<br />;bank6 16bit SDRAM<br />;bank7 16bit SDRAM<br /> [ BUSWIDTH=16<br />; DCD 0x11111111 ;Bank0=OM][1:0], Bank0~Bank7=16bit<br /> DCD 0x11111001 ;Bank0=OM[1:0] 16bit BootRomSST39VF160/SST39VF320) :0x0<br />; |||||||- Bank1=8bit Nand Flash<br />; |||||--- Bank2=8bit PDIUSBD12<br />; ||||---- Bank3=16bit RTL8019<br />; |||----- Bank4~5=16bit No Uesd<br />; -------- Bank6~7=16bit SDRAM<br /> | ;BUSWIDTH=32<br /> DCD 0x22222220 ;Bank0=OM[1:0], Bank1~Bank7=32bit<br /> ]<br /> DCD ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC)) ;GCS0<br /> DCD ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC)) ;GCS1 <br /> DCD ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC)) ;GCS2<br /> DCD ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC)) ;GCS3<br /> DCD ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC)) ;GCS4<br /> DCD ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC)) ;GCS5<br /> [ BDRAMTYPE="DRAM" <br /> DCD ((B6_MT<<15)+(B6_Trcd<<4)+(B6_Tcas<<3)+(B6_Tcp<<2)+(B6_CAN)) ;GCS6 check the MT value in parameter.a<br /> DCD ((B7_MT<<15)+(B7_Trcd<<4)+(B7_Tcas<<3)+(B7_Tcp<<2)+(B7_CAN)) ;GCS7<br /> | ;"SDRAM"<br /> DCD ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN)) ;GCS6<br /> DCD ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN)) ;GCS7<br /> ]<br /> DCD ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT) ;REFRESH RFEN=1, TREFMD=0, trp=3clk, trc=5clk, tchr=3clk,count=1019<br /> DCD 0x10 ;SCLK power down mode, BANKSIZE 32M/32M<br /> DCD 0x20 ;MRSR6 CL=2clk<br /> DCD 0x20 ;MRSR7<br /><br /> ALIGN<br /><br /><br /> AREA RamData, DATA, READWRITE<br /><br /> ^ (_ISR_STARTADDRESS-0x500)<br /> <br />UserStack # 256 ;c1(c7)ffa00<br />SVCStack # 256 ;c1(c7)ffb00<br />UndefStack # 256 ;c1(c7)ffc00<br />AbortStack # 256 ;c1(c7)ffd00<br />IRQStack # 256 ;c1(c7)ffe00<br />FIQStack # 0 ;c1(c7)fff00<br /><br /><br /> ^ _ISR_STARTADDRESS<br />HandleReset # 4<br />HandleUndef # 4<br />HandleSWI # 4<br />HandlePabort # 4<br />HandleDabort # 4<br />HandleReserved # 4<br />HandleIRQ # 4<br />HandleFIQ # 4<br /><br />;Don't use the label 'IntVectorTable',<br />;because armasm.exe cann't recognize this label correctly.<br />;the value is different with an address you think it may be.<br />;IntVectorTable<br />HandleADC # 4<br />HandleRTC # 4<br />HandleUTXD1 # 4<br />HandleUTXD0 # 4<br />HandleSIO # 4<br />HandleIIC # 4<br />HandleURXD1 # 4<br />HandleURXD0 # 4<br />HandleTIMER5 # 4<br />HandleTIMER4 # 4<br />HandleTIMER3 # 4<br />HandleTIMER2 # 4<br />HandleTIMER1 # 4<br />HandleTIMER0 # 4<br />HandleUERR01 # 4<br />HandleWDT # 4<br />HandleBDMA1 # 4<br />HandleBDMA0 # 4<br />HandleZDMA1 # 4<br />HandleZDMA0 # 4<br />HandleTICK # 4<br />HandleEINT4567 # 4<br />HandleEINT3 # 4<br />HandleEINT2 # 4<br />HandleEINT1 # 4<br />HandleEINT0 # 4 ;0xc1(c7)fff84<br /><br /> END<br />;**************************************************************************** |
|