文件名称:ARM 44b0 初始化源代码
文件大小:6KB
文件格式:RAR
更新时间:2015-05-08 16:15:45
arm;s3c44b0;44b0x;源代码
;******************************************************** ; Name : 44BINIT.S * ; Modify : hugang, hgx2000@mail.china.com * ; Description: * ; C start up codes * ; Configure memory, Initialize ISR ,stacks * ; Initialize C-variables * ; Fill zeros into zero-initialized C-variables * ;******************************************************** GET ..\inc\option.inc GET ..\inc\memcfg.inc ;**************************************************************************** ;存储器空间 ;GCS6 64M 16bit(8MB) DRAM/SDRAM(0xc000000-0xc7fffff) ;APP RAM=0xc000000~0xc7effff ;44BMON RAM=0xc7f0000-0xc7fffff ;STACK =0xc7ffa00 ;**************************************************************************** ;中断控制预定义 INTPND EQU 0x01e00004 INTMOD EQU 0x01e00008 INTMSK EQU 0x01e0000c I_ISPR EQU 0x01e00020 I_CMST EQU 0x01e0001c I_PMST EQU 0x01e00014 ;**************************************************************************** ;看门狗定时器预定义 WTCON EQU 0x01d30000 ;**************************************************************************** ;系统时钟预定义 PLLCON EQU 0x01d80000 CLKCON EQU 0x01d80004 LOCKTIME EQU 0x01d8000c ;**************************************************************************** ;存储器控制预定义 REFRESH EQU 0x01c80024 ;**************************************************************************** ;BDMA目的寄存器 BDIDES0 EQU 0x1f80008 BDIDES1 EQU 0x1f80028 ;**************************************************************************** ;预定义常数(常量) USERMODE EQU 0x10 FIQMODE EQU 0x11 IRQMODE EQU 0x12 SVCMODE EQU 0x13 ABORTMODE EQU 0x17 UNDEFMODE EQU 0x1b MODEMASK EQU 0x1f NOINT EQU 0xc0 ;**************************************************************************** ;检查是否使用tasm.exe进行编译 GBLL THUMBCODE [ {CONFIG} = 16 THUMBCODE SETL {TRUE} CODE32 | THUMBCODE SETL {FALSE} ] [ THUMBCODE CODE32 ;for start-up code for Thumb mode ] ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Vector Macro;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MACRO $HandlerLabel HANDLER $HandleLabel $HandlerLabel sub sp,sp,#4 ;decrement sp(to store jump address) stmfd sp!,{r0} ;PUSH the work register to stack(lr does't push because it return to original address) ldr r0,=$HandleLabel;load the address of HandleXXX to r0 ldr r0,[r0] ;load the contents(service routine start address) of HandleXXX str r0,[sp,#4] ;store the contents(ISR) of HandleXXX to stack ldmfd sp!,{r0,pc} ;POP the work register and pc(jump to ISR) MEND ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IMPORT Main ; The main entry of mon program ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Code Begin;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AREA Init,CODE,READONLY ENTRY ResetEntry b ResetHandler ;for debug b HandlerUndef ;handlerUndef b HandlerSWI ;SWI interrupt handler b HandlerPabort ;handlerPAbort b HandlerDabort ;handlerDAbort b . ;handlerReserved b HandlerIRQ b HandlerFIQ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IMPORTANT NOTE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;If the H/W vectored interrutp mode is enabled, The above two instructions should ; ;be changed like below, to work-around with H/W bug of S3C44B0X interrupt controller. ; ; b HandlerIRQ -> subs pc,lr,#4 ; ; b HandlerIRQ -> subs pc,lr,#4 ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; VECTOR_BRANCH ldr pc,=HandlerEINT0 ;mGA H/W interrupt vector table ldr pc,=HandlerEINT1 ; ldr pc,=HandlerEINT2 ; ldr pc,=HandlerEINT3 ; ldr pc,=HandlerEINT4567 ; ldr pc,=HandlerTICK ;mGA b . b . ldr pc,=HandlerZDMA0 ;mGB ldr pc,=HandlerZDMA1 ; ldr pc,=HandlerBDMA0 ; ldr pc,=HandlerBDMA1 ; ldr pc,=HandlerWDT ; ldr pc,=HandlerUERR01 ;mGB b . b . ldr pc,=HandlerTIMER0 ;mGC ldr pc,=HandlerTIMER1 ; ldr pc,=HandlerTIMER2 ; ldr pc,=HandlerTIMER3 ; ldr pc,=HandlerTIMER4 ; ldr pc,=HandlerTIMER5 ;mGC b . b . ldr pc,=HandlerURXD0 ;mGD ldr pc,=HandlerURXD1 ; ldr pc,=HandlerIIC ; ldr pc,=HandlerSIO ; ldr pc,=HandlerUTXD0 ; ldr pc,=HandlerUTXD1 ;mGD b . b . ldr pc,=HandlerRTC ;mGKA b . ; b . ; b . ; b . ; b . ;mGKA b . b . ldr pc,=HandlerADC ;mGKB b . ; b . ; b . ; b . ; b . ;mGKB b . b . ;0xe0=EnterPWDN ldr pc,=EnterPWDN ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;复位中断处理函数 ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ResetHandler ldr r0,=WTCON ;禁止看门狗 ldr r1,=0x0 str r1,[r0] ldr r0,=INTMSK ldr r1,=0x07ffffff ;禁止所有中断 str r1,[r0] ;以下三段设置时钟控制寄存器 ldr r0,=LOCKTIME ldr r1,=0xfff str r1,[r0] [ PLLONSTART ldr r0,=PLLCON ;锁相环倍频设定 ldr r1,=((M_DIV<<12)+(P_DIV<<4)+S_DIV) ;设定系统主时钟频率 str r1,[r0] ] ldr r0,=CLKCON ldr r1,=0x7ff8 ;所有功能单元块时钟使能 str r1,[r0] ;**************************************************** ;change BDMACON reset value for BDMA * ;**************************************************** ldr r0,=BDIDES0 ldr r1,=0x40000000 ;BDIDESn reset value should be 0x40000000 str r1,[r0] ldr r0,=BDIDES1 ldr r1,=0x40000000 ;BDIDESn reset value should be 0x40000000 str r1,[r0] ;**************************************************** ;设定存储器控制寄存器 * ;**************************************************** adr r0, ResetHandler ldr r1, =ResetHandler sub r0, r1, r0 ldr r1, =SMRDATA sub r0, r1, r0 ldmia r0, {r1-r13} ldr r0, =0x01c80000 ;BWSCON Address stmia r0, {r1-r13} ;**************************************************** ;初始化堆栈 * ;**************************************************** ldr sp, =SVCStack bl InitStacks ;**************************************************** ;设置中断处理 * ;**************************************************** ldr r0,=HandleIRQ ;This routine is needed ldr r1,=IsrIRQ ;if there isn't 'subs pc,lr,#4' at 0x18, 0x1c str r1,[r0] ;**************************************************** ;Copy and paste RW data/zero initialized data * ;**************************************************** adr r0, ResetEntry ldr r1, BaseOfROM cmp r0, r1 ldreq r0, TopOfROM beq InitRamData ;**************************************************** ;计算拷贝程序在flash中的实际位置 * ;**************************************************** ldr r2, =CopyProcBeg sub r1, r2, r1 add r0, r0, r1 ldr r3, =CopyProcEnd ;**************************************************** ;将拷贝程序复制到ram中 * ;**************************************************** 0 ldmia r0!, {r4-r7} stmia r2!, {r4-r7} cmp r2, r3 bcc
【文件预览】:
44binit.s