?? init4510.s
字號:
;/*************************************************************************/
;/* init.s XZH001 Board version 1.0 */
;/* This file contains the target processor dependent initialization */
;/* routines (boot code) and data. */
;/* This file modified by Hury */
;/* hefei university of technology 06-15-2006 */
;/*************************************************************************/
GET memory.S
GET 4510b.s
DownloadFLASH EQU 0
STACK_BASE EQU 0xFFDF00 ;//16M-256Byte-8KByte,SDRAM區調試
;//STACK_BASE EQU 0x11FDF00 ;//18M-256Byte-8KByte,下載到FLASH時用
AREA Init, CODE, READONLY
ENTRY
B Reset_Handler
B Undefined_Handler
B SWI_Handler
B Prefetch_Handler
B Abort_Handler
NOP ; Reserved vector
B IRQ_Handler
B FIQ_Handler
;==========================================================
; The Default Exception Handler Vector Entry Pointer Setup
;==========================================================
Reset_Handler ;/* Reset Entry Point */
LDR R0,=0x3FF0000
LDR R1,=0xE7FFFF80 ;//對應的內部靜態4K的SRAM的起始地址0x3FE0000
STR R1,[R0]
IF DownloadFLASH = 1
;//map: FLASH 0-2M SDRAM 2-18M
;//
LDR r1, =rEXTDBWTH_F ;//EXTDBWTH
LDR r2, =rROMCON0_F ;//ROMCON0 @ 0M ~ 2M
LDR r3, =rROMCON1_F ;//ROMCON1 @ DISABLED
LDR r4, =rROMCON2_F ;//ROMCON1 @ DISABLED
LDR r5, =rROMCON3_F ;//ROMCON1 @ DISABLED
LDR r6, =rROMCON4_F ;//ROMCON1 @ DISABLED
LDR r7, =rROMCON5_F ;//ROMCON1 @ DISABLED
LDR r8, =rSDRAMCON0_F ;//SDRAMCON0 @ 2M ~ 18M
LDR r9, =rSDRAMCON1_F ;//SDRAMCON1 @ DISABLED
LDR r10,=rSDRAMCON2_F ;//SDRAMCON2 @ DISABLED
LDR r11,=rSDRAMCON3_F ;//SDRAMCON3 @ DISABLED
LDR r12,=rSREFEXTCON_F
LDR r0, =ARM7_EXTDBWTH
STMIA r0, {r1-r12} ;//從R0指示的地址,依次把R1-R12存入...
;//導入一些鏈接器預定義的關鍵變量
IMPORT |Image$$RO$$Base|
IMPORT |Image$$RO$$Limit|
IMPORT |Image$$RW$$Base|
IMPORT |Image$$RW$$Limit|
IMPORT |Image$$ZI$$Base|
IMPORT |Image$$ZI$$Limit|
;//把代碼自己全部拷貝到SDRAM里面去。
LDR r0, =|Image$$RO$$Base|
LDR r1, =|Image$$RO$$Limit|
LDR r2, =|Image$$RW$$Base|
LDR r3, =|Image$$RW$$Limit|
SUB r1, r1, r0 ;//r1=r1-r0
SUB r3, r3, r2 ;//r3=r3-r2
ADD r1, r1, r3 ;//r1=r1+r3
LDR r2, =0x200000 ;@2M
COPY
LDR r3, [r0], #4 ;//r3<-[r0]、r0=r0+4
STR r3, [r2], #4 ;//r3->[r2]、r2=r2+4
SUBS r1, r1, #4 ;//r1=r1-4
BNE COPY
;//rmap: SDRAM 0-16M FLASH 16-18M
;//
LDR r1, =rEXTDBWTH_R ;//EXTDBWTH
LDR r2, =rROMCON0_R ;//ROMCON0 @ 16M ~ 18M
LDR r3, =rROMCON1_R ;//ROMCON1 @ DISABLED
LDR r4, =rROMCON2_R ;//ROMCON1 @ DISABLED
LDR r5, =rROMCON3_R ;//ROMCON1 @ DISABLED
LDR r6, =rROMCON4_R ;//ROMCON1 @ DISABLED
LDR r7, =rROMCON5_R ;//ROMCON1 @ DISABLED
LDR r8, =rSDRAMCON0_R ;//SDRAMCON0 @ 0M ~ 16M
LDR r9, =rSDRAMCON1_R ;//SDRAMCON1 @ DISABLED
LDR r10,=rSDRAMCON2_R ;//SDRAMCON2 @ DISABLED
LDR r11,=rSDRAMCON3_R ;//SDRAMCON3 @ DISABLED
LDR r12,=rSREFEXTCON_R
LDR r0, =ARM7_EXTDBWTH
STMIA r0, {r1-r12} ;//從R0指示的地址,依次把R1-R12存入...
;//把RW段拷貝到RW BASE指定的位置上去,
;//并且把RW段里的ZI段初始化為零。
LDR r0, =|Image$$RO$$Limit| ;//ro的最高地址
LDR r1, =|Image$$RW$$Base| ;//rw的base
LDR r3, =|Image$$ZI$$Base| ;//zi的base
CMP r0, r1
BEQ %1
0 CMP r1, r3 ;// Copy init data
LDRCC r2, [r0], #4 ;//在ARM里,LDRCC是一條條件執行指令。當前面的運算沒有設C標志的時候,執行LDR。否則LDRCC就等效于NOP
STRCC r2, [r1], #4
BCC %0
1 LDR r1, =|Image$$ZI$$Limit| ; Top of zero init segment
MOV r2, #0
2 CMP r3, r1 ; Zero init
STRCC r2, [r3], #4
BCC %2
ENDIF
;====================================================
; Now change to user mode and set up user mode stack.
;====================================================
MRS r0, cpsr
BIC r0, r0, #LOCKOUT | MODE_MASK
;//清除I(7)、F(6)和低5位模式位,只保留了State bit
ORR r1, r0, #UDF_MODE ;//未定義模式
MSR cpsr_cf, r1
LDR sp, =UDF_STACK+0x200
ORR r1, r0, #ABT_MODE ;//中止模式
MSR cpsr_cf, r1
LDR sp, =ABT_STACK+0x200
ORR r1, r0, #SUP_MODE ;//管理模式
MSR cpsr_cf, r1
LDR sp, =SUP_STACK+0x800
ORR r1, r0, #IRQ_MODE ;//IRQ 模式
MSR cpsr_cf, r1
LDR sp, =IRQ_STACK+0x800
ORR r1, r0, #FIQ_MODE ;//FIQ 模式
MSR cpsr_cf, r1
LDR sp, =FIQ_STACK+0x800
ORR r1, r0, #USR_MODE ;//用戶模式
MSR cpsr_cf, r1
LDR sp, =USR_STACK+0x400
; /* Call C_Entry application routine with a pointer to the first */
; /* available memory address after ther compiler's global data */
; /* This memory may be used by the application. */
;===========================
; Now we enter the C Program
;===========================
IMPORT Main
BL Main
B .
;//-*******************************************************************-//
;// 異常入口
;//-*******************************************************************-//
IMPORT ISR_FiqHandler
FIQ_Handler
STMFD sp!, {r0-r7, lr} ;//中斷棧保存
BL ISR_FiqHandler ;//中斷C處理函數
LDMFD sp!, {r0-r7, lr} ;//恢復中斷棧
SUBS pc, lr, #4 ;//返回中斷前的程序指針
IMPORT ISR_IrqHandler
IRQ_Handler
STMFD sp!, {r0-r12, lr} ;//中斷棧保存
BL ISR_IrqHandler ;//中斷C處理函數
LDMFD sp!, {r0-r12, lr} ;//恢復中斷棧
SUBS pc, lr, #4 ;//返回中斷前的程序指針
IMPORT ISR_PreHandler ;//預取錯誤中斷處理函數
Prefetch_Handler B ISR_PreHandler
IMPORT ISR_AbtHandler ;//中止模式中斷處理函數
Abort_Handler B ISR_AbtHandler
IMPORT ISR_UdefHandler ;//未定義指令中斷處理函數
Undefined_Handler B ISR_UdefHandler
IMPORT ISR_SwiHandler ;//用戶軟中斷處理函數
SWI_Handler B ISR_SwiHandler
;//***************************************************/ ____________________0x1200000-1
AREA SYS_STACK, NOINIT,READWRITE ;// | 256字節中斷向量表 |
;//**************************************************/ |__________________|_0x11FFF00
; % USR_STACK_SIZE ;//1024 | SUP stack 2K |
;USR_STACK ;// |____________________|_0x11FF700
; % UDF_STACK_SIZE ;//512 | FIQ stack 2K |
;UDF_STACK ;// |____________________|_0x11FEF00
; % ABT_STACK_SIZE ;//512 | IRQ stack 2K |
;ABT_STACK ;// |____________________|_0x11FE700
; % IRQ_STACK_SIZE ;//2048 | ABT stack 0.5K |
;IRQ_STACK ;// |____________________|_0x11FE500
; % FIQ_STACK_SIZE ;//2048 | UDF stack 0.5K |
;FIQ_STACK ;// |____________________|_0x11FE300
; % SUP_STACK_SIZE ;//2048 | USR stack 1K |
;SUP_STACK ;// |____________________|_0x11FDF00
^ STACK_BASE
USR_STACK # USR_STACK_SIZE
UDF_STACK # UDF_STACK_SIZE
ABT_STACK # ABT_STACK_SIZE
IRQ_STACK # IRQ_STACK_SIZE
FIQ_STACK # FIQ_STACK_SIZE
SUP_STACK # SUP_STACK_SIZE
;/***************************************************/
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -