Norflash启动代码

启动代码文件

INCLUDE .\2440addr.inc

;GPB for LED 


IMPORT |Image$$ER_ROM1$$Base|   ;ROM base       抵格开始
IMPORT |Image$$ER_ROM1$$Limit|   ;ROM limit
IMPORT |Image$$RW_RAM1$$Base|   ;RW base
IMPORT |Image$$RW_RAM1$$Limit|   ;RW limit
IMPORT |Image$$RW_RAM1$$ZI$$Limit| ;ZI limit
IMPORT |Image$$RW_RAM1$$ZI$$Base|  ;ZI base


IMPORT Main
PRESERVE8
AREA RESET,CODE,READONLY ;entry point
ENTRY
    b Reset ;reset tackle func                    空格
    b blank ; b HandleUndef
    b blank ; b HandleSWI
    b blank ; b HandlePrefetchAbort
    b blank ; b HandleDataAbort
    b blank ; b HandleNotUsed
    b blank  ; b HandleIRQ    
    b blank ; b HandleFIQ
    blank ;JUST BLANK
    b blank
Reset
    ;cpu mode
    mrs r0,cpsr   ;cpsr->r0
    bic r0,r0,#0x3f   ;0b0011 1111
    orr r0,r0,#0xd3        ;0b1101 0011 |I|F|T|M4|M3|M2|M1|M0|
    msr cpsr_cxsf,r0   ;r0->cpsr     1 1 0 1  0 0 1  1


;INT disable
    ldr r0,=INTMSK                       空格
    ldr r1,=0xffffffff
    str r1,[r0]
    ldr r0,=INTSUBMSK
    ldr r1,=0x7fff
    str r1,[r0]


;watchdog
    ldr r0,=WTCON          ;WTCON    0x53000000    R0 store WTCON addr
    mov r1,#0x0 
    str r1,[r0]            ;value in r1,that is 0x0,store in the addr,that is the content in r0, make watch dog stop working


;clk setting
    ldr r0,=0x4c000014     ;CLKDIVN
    mov r1,#0x05   ;0b0000 0101
    str r1,[r0]   ;FCLK:HCLK:PCLK=1:4:8  
    mrc p15,0,r0,c1,c0,0   ;If HDIVN is not 0 and the CPU bus mode is the fast bus mode, the CPU will operate
    orr r0,r0,#0xc0000000  ;by the HCLK.This feature can be used to change the CPU frequency as a half or more
    mcr p15,0,r0,c1,c0,0   ;without affecting the HCLKand PCLK. P7-9 in s3c2440 datasheet
    ldr r0,=0x4c000004   ;MPLLCON
    ldr r1,=0x0005c011   ;0b 0101 1100 0000 0001 0001
    str r1,[r0]   ;SDIV=1 PDIV=1 MDIV=92  FCLK=400MHZ HCLK=100MHz  PCLK=50MHz


;SDRAM init
    adrl  r0,SMRDATA   ;you should re-ensure the parameter of the SDRAM
    ldmia r0,{r1-r13}
    ldr   r0,=BWSCON
    stmia r0,{r1-r13}
;set sp
    ldr sp,=0x32fff000


;LED1 light
    LDR r0,=GPBCON
    LDR r1,=0x400
    STR r1,[r0]

    ldr r0,=GPBUP
    ldr r1,=0x0
    str r1,[r0]


    ldr r0,=GPBDAT
    ldr r1,=0x3df  ;ob11 1101 1111


;light LED1 continuous


    ldr r0,=0x2ffff ;2FFFF ;Set LED light time
delay 
    sub r0,r0,#1                ;r0=r0-1             
     cmp r0,#0x0                 ;将r0的值与0相比较 
    bne delay                 ;比较的结果不为0(r0不为0),继续调用delay,否则执行下一条语句 


;copy program to SDRAM
;RO
    adr r0,ENTRY
    ldr r2,BaseOfROM
    ldr r3,TopOfROM
0
    ldmia r0!,{r4-r7}
    stmia r2!,{r4-r7}
    cmp r2,r3
    bcc %b0


;RW
    sub r2,r2,r3   
    sub r0,r0,r2


    ldr r2,BaseOfBSS
    ldr r3,BaseOfZI
1
    cmp r2,r3
    ldrcc r1,[r0],#4
    strcc r1,[r2],#4
    bcc %b1


;ZI
    mov r0,#0x0  
    ldr r3,EndOfBSS
2
    cmp r2,r3
    strcc r0,[r2],#4
    bcc %b2


;to main
    ldr pc,=Main
;memory init value
SMRDATA
DCD 0x22011000                          ;BWCSON
DCD 0x00000700                          ;GCS0
DCD 0x00000700         ;GCS1
DCD 0x00000700                    ;GCS2
DCD 0x00000700 ;GCS3
DCD 0x00000700                   ;GCS4
DCD 0x00000700 ;GCS5
DCD ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN));GCS6
DCD ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN));GCS7
DCD ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Tsrc<<18)+REFCNT)
DCD 0XB1
DCD 0x30
DCD 0x30


;Bank 6 parameter 
B6_MT EQU 0x3 ;SDRAM 
B6_Trcd EQU 0x1 ;3clk 
B6_SCAN EQU 0x1 ;9bit 
 
;Bank 7 parameter 
B7_MT EQU 0x3 ;SDRAM 
B7_Trcd EQU 0x1 ;4clk 
B7_SCAN EQU 0x1 ;9bit
REFCNT      EQU 1268 
 
;REFRESH parameter 
REFEN EQU 0x1 ;Refresh enable 
TREFMD EQU 0x0 ;CBR(CAS before RAS)/Auto refresh 
Trp EQU 0x0 ;2clk 
Tsrc EQU 0x1 ;5clk 
 
BaseOfROM DCD |Image$$ER_ROM1$$Base|
TopOfROM  DCD |Image$$ER_ROM1$$Limit|
BaseOfBSS DCD |Image$$RW_RAM1$$Base|
BaseOfZI  DCD |Image$$RW_RAM1$$ZI$$Base|
EndOfBSS  DCD |Image$$RW_RAM1$$ZI$$Limit|

END

Keil设置如下:


地址配置文件2440addr.inc

;GPB for LED
GPBCON   EQU    0x56000010     ;GPB   LED1~LED4 coorespond GPB5~GPB8
GPBDAT   EQU    0x56000014 ;GPB
GPBUP    EQU    0x56000018 ;GPB


;memory address
BWSCON   EQU  0x48000000     ;Bus width & wait status 
BANKCON0 EQU  0x48000004     ;Boot ROM control 
BANKCON1 EQU  0x48000008     ;BANK1 control 
BANKCON2 EQU  0x4800000c     ;BANK2 control 
BANKCON3 EQU  0x48000010     ;BANK3 control 
BANKCON4 EQU  0x48000014     ;BANK4 control 
BANKCON5 EQU  0x48000018     ;BANK5 control 
BANKCON6 EQU  0x4800001c     ;BANK6 control 
BANKCON7 EQU  0x48000020     ;BANK7 control 
REFRESH EQU  0x48000024     ;DRAM/SDRAM refresh 
BANKSIZE EQU  0x48000028     ;Flexible Bank Size 
MRSRB6   EQU  0x4800002c     ;Mode register set for SDRAM Bank6 
MRSRB7   EQU  0x48000030     ;Mode register set for SDRAM Bank7 


;watch DOG
WTCON       EQU 0x53000000     ;WATCH DOG


;INT
INTMSK      EQU  0x4A000008
INTSUBMSK   EQU  0x4A00001C
END  

main函数文件

#define rGPBCON               (*(volatile unsigned long *) 0x56000010)
#define rGPBDAT               (*(volatile unsigned long *) 0x56000014)
#define rGPBUP                (*(volatile unsigned long *) 0x56000018)


int Main()
{
rGPBCON&=~((3<<10)|(3<<12));   //~110000000000=001111111111
rGPBCON |=(5<<10);   //10000000000
rGPBUP=0xff;     //~100000=011111
while(1)
{
rGPBDAT =0x0;    //100000
}
}

注意:1)指令前加空格

            2)伪操作抵格

            3)加END

            4) ldr r0,=INTMSK   //INTMSK的值赋给r0     

            5)ldr r0.=0xffff    //0xffff赋值给r0

            6) ldr pc,=Main    //main为地址,将main标示的地址赋给PC

            7) ldr r2,BaseOfROM   //将BaseOfROM在内存中的地址的存储的值赋给r2

             8)ldr伪指令和实指令的用法区别:实指令是将操作数2(如上的BaseOfROM

                    标示的地址所存储的内容作为操作对象,伪指令则将操作数2(如上的Main)

                    本身作为操作对象。


你可能感兴趣的:(ARM,体系结构,keil)