3654|0

6892

帖子

0

TA的资源

五彩晶圆(高级)

楼主
 

【ATMEL技术问题】ADS平台AT91R4008的FLASH引导程序 [复制链接]

在ADS平台下,对AT91R40008进行FLASH程序引导,目前问题运行,现在把BOOT_FLASH.S 分享给大家,程序如下

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;  boot from FLASH: initialization       ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


 GET option_boot.h
 GET memcfg.h

;interrupt controller
INTPND EQU 0x01e00004
INTMOD EQU 0x01e00008
INTMSK EQU 0x01e0000c
I_ISPR EQU 0x01e00020
I_CMST EQU 0x01e0001c
I_PMST EQU 0x01e00014

;Watchdog timer
WTCON EQU 0x01d30000

;Clock Controller
PLLCON EQU 0x01d80000
CLKCON EQU 0x01d80004
LOCKTIME EQU 0x01d8000c

;Memory Controller
REFRESH EQU 0x01c80024

;BDMAhdog timer
BDIDES0 EQU 0x1f80008
BDIDES1 EQU 0x1f80028

;Pre-defined constants
USERMODE EQU 0x10
FIQMODE EQU 0x11
IRQMODE EQU 0x12
SVCMODE EQU 0x13
ABORTMODE EQU 0x17
UNDEFMODE EQU 0x1b
MODEMASK EQU 0x1f
NOINT EQU 0xc0

;port config register
PCONA EQU 0x01d20000
PCONB EQU 0x01d20008
PCONC EQU 0x01d20010

;mem controller
BWSCON EQU 0x01c80000


 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

 MACRO
$HandlerLabel VHANDLER $HandleLabel
$HandlerLabel
 sub sp,sp,#4
 stmfd sp!,{r0}
 ldr r0,=I_ISPR ;INTMSK work-around
 ldr r0,[r0]
 cmp r0,#0x0
 beq %F0
 ldr r0,=$HandleLabel
 ldr r0,[r0]
 str r0,[sp,#4]
 ldmfd sp!,{r0,pc}
0  stmfd sp!,{r1}
 ldr r0,=I_PMST
 ldr r1,[r0]
 str r1,[r0]
 ldmfd sp!,{r0,r1}
 add sp,sp,#4
 subs pc,lr,#4
 MEND
 
 
 IMPORT |Image$$RO$$Limit|  ; End of ROM code (=start of ROM data)
 IMPORT |Image$$RW$$Base|  ; Base of RAM to initialise
 IMPORT |Image$$ZI$$Base|  ; Base and limit of area
 IMPORT |Image$$ZI$$Limit|  ; to zero initialise 

 ;IMPORT main    ; The main entry of mon program

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;  coding area
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 AREA boot,CODE,READONLY
 ENTRY

 b ResetHandler   ;system init
 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 instruction should
 ;be changed like below, to work-around with H/W bug of S3C44B0X interrupt controller.
 ;If INTCON I,F bit is changed, this case may be occurred.
 ; 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
 ldr pc,=HandlerDef
 ldr pc,=HandlerDef
 
 ldr pc,=HandlerZDMA0 ;mGB
 ldr pc,=HandlerZDMA1 ;
 ldr pc,=HandlerBDMA0 ;
 ldr pc,=HandlerBDMA1 ;
 ldr pc,=HandlerWDT ;
 ldr pc,=HandlerUERR01 ;mGB
 ldr pc,=HandlerDef
 ldr pc,=HandlerDef
 
 ldr pc,=HandlerTIMER0 ;mGC
 ldr pc,=HandlerTIMER1 ;
 ldr pc,=HandlerTIMER2 ;
 ldr pc,=HandlerTIMER3 ;
 ldr pc,=HandlerTIMER4 ;
 ldr pc,=HandlerTIMER5 ;mGC
 ldr pc,=HandlerDef
 ldr pc,=HandlerDef
 
 ldr pc,=HandlerURXD0 ;mGD
 ldr pc,=HandlerURXD1 ;
 ldr pc,=HandlerIIC ;
 ldr pc,=HandlerSIO ;
 ldr pc,=HandlerUTXD0 ;
 ldr pc,=HandlerUTXD1 ;mGD
 ldr pc,=HandlerDef
 ldr pc,=HandlerDef
 
 ldr pc,=HandlerRTC ;mGKA
 ldr pc,=HandlerDef
 ldr pc,=HandlerDef
 ldr pc,=HandlerDef
 ldr pc,=HandlerDef
 ldr pc,=HandlerDef
 ldr pc,=HandlerDef
 ldr pc,=HandlerDef
 
 ldr pc,=HandlerADC ;mGKB
 ldr pc,=HandlerDef
 ldr pc,=HandlerDef
 ldr pc,=HandlerDef
 ldr pc,=HandlerDef
 ldr pc,=HandlerDef
 ldr pc,=HandlerDef
 ldr pc,=HandlerDef


 LTORG
 
HandlerFIQ  HANDLER HandleFIQ
HandlerIRQ  HANDLER HandleIRQ
HandlerUndef  HANDLER HandleUndef
HandlerSWI  HANDLER HandleSWI
HandlerDabort  HANDLER HandleDabort
HandlerPabort  HANDLER HandlePabort

;The following is used for the vectored interrupt.
HandlerADC  VHANDLER HandleADC
HandlerRTC  VHANDLER HandleRTC
HandlerUTXD1  VHANDLER HandleUTXD1
HandlerUTXD0  VHANDLER HandleUTXD0
HandlerSIO  VHANDLER HandleSIO
HandlerIIC  VHANDLER HandleIIC
HandlerURXD1  VHANDLER HandleURXD1
HandlerURXD0  VHANDLER HandleURXD0
HandlerTIMER5  VHANDLER HandleTIMER5
HandlerTIMER4  VHANDLER HandleTIMER4
HandlerTIMER3  VHANDLER HandleTIMER3
HandlerTIMER2  VHANDLER HandleTIMER2
HandlerTIMER1  VHANDLER HandleTIMER1
HandlerTIMER0  VHANDLER HandleTIMER0
HandlerUERR01  VHANDLER HandleUERR01
HandlerWDT  VHANDLER HandleWDT
HandlerBDMA1  VHANDLER HandleBDMA1
HandlerBDMA0  VHANDLER HandleBDMA0
HandlerZDMA1  VHANDLER HandleZDMA1
HandlerZDMA0  VHANDLER HandleZDMA0
HandlerTICK  VHANDLER HandleTICK
HandlerEINT4567 VHANDLER HandleEINT4567
HandlerEINT3  VHANDLER HandleEINT3
HandlerEINT2  VHANDLER HandleEINT2
HandlerEINT1  VHANDLER HandleEINT1
HandlerEINT0  VHANDLER HandleEINT0

HandlerDef ;INTMSK work-around
 stmfd sp!,{r0,r1}
 ldr r0,=I_PMST
 ldr r1,[r0]
 str r1,[r0]
 ldmfd sp!,{r0,r1}
 subs pc,lr,#4
IsrIRQ
 sub sp,sp,#4 ;reserved for PC
 stmfd sp!,{r8-r9}
 ldr r9,=I_ISPR
 ldr r9,[r9]
 cmp r9, #0x0 ;In some case, I_ISPR may be 0.
 beq %F2
 mov r8,#0x0
0
 movs r9,r9,lsr #1
 bcs %F1
 add r8,r8,#4
 b %B0
1
 ldr r9,=HandleADC
 add r9,r9,r8
 ldr r9,[r9]
 str r9,[sp,#8]
 ldmfd sp!,{r8-r9,pc}
2
 ldr r8,=I_PMST ;INTMSK work-around.
 ldr r9,[r8]
 str r9,[r8]
 ldmfd sp!,{r8-r9}
 add sp,sp,#4
 subs pc,lr,#4


IsrFIQ
 sub sp,sp,#4 ;reserved for PC
 stmfd sp!,{r8-r9}
 ldr r9,=I_ISPR
 ldr r9,[r9]
 cmp r9, #0x0 ;In some case, I_ISPR may be 0.
 beq %F2
 mov r8,#0x0
0
 movs r9,r9,lsr #1
 bcs %F1
 add r8,r8,#4
 b %B0
1
 ldr r9,=HandleADC
 add r9,r9,r8
 ldr r9,[r9]
 str r9,[sp,#8]
 ldmfd sp!,{r8-r9,pc}
2
 ldr r8,=I_PMST ;INTMSK work-around.
 ldr r9,[r8]
 str r9,[r8]
 ldmfd sp!,{r8-r9}
 add sp,sp,#4
 subs pc,lr,#4
  
 
;****************************************************
;* START         *
;****************************************************
ResetHandler
    ldr     r0,=WTCON     ;watch dog disable
    ldr     r1,=0x0   
    str     r1,[r0]

    ldr     r0,=INTMSK
    ldr     r1,=0x07ffffff  ;all interrupt disable
    str     r1,[r0]

    ;****************************************************
    ;* Set clock control registers   *
    ;****************************************************
    ldr r0,=LOCKTIME
    ldr r1,=0xfff
    str r1,[r0]

   
    ldr r0,=PLLCON    ;temporary setting of PLL
    ldr r1,=((M_DIV<<12)+(P_DIV<<4)+S_DIV) ;Fin=10MHz,Fout=60MHz
    str r1,[r0]


    ldr r0,=CLKCON  
    ldr r1,=0x7ff8     ;All unit block CLK enable 
    str r1,[r0]

    ;****************************************************
    ;* Port Initialization    *
    ;****************************************************
    ldr r0,=PCONA
    ldr r1,=0x3ff
    str r1,[r0]   ;config GPIOA as addr. bus
   
    ldr r0,=PCONB
    ldr r1,=0x7ff
    str r1,[r0]   ;config GPIOB as mem controller interface
   
    ldr r0,=PCONC
    ldr r1,=0xaaaaaaaa
    str r1,[r0]   ;config GPIOC as data bus high bits

    ;****************************************
    ;*  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]
  

    ;****************************************************
    ;* Set memory control registers   *  
    ;****************************************************
    ldr     r0,=SMRDATA
    ldmia   r0,{r1-r13}
    ldr     r0,=BWSCON   ;memory controller
    stmia   r0,{r1-r13}
 
    ;****************************************************
    ;* Clear LED display        *  
    ;****************************************************
    ldr     r0,=0x02000000
    ldr  r1,=0x0
    str  r1,[r0]
   
 ldr  r0,=0x1d20040 ;GPOIOG
 ldr  r1,=0xff55  ;
 str  r1,[r0]
 ldr  r0,=0x1d20044
 ldr  r1,=0xfe  ;light D4
 str  r1,[r0]

    ;****************************************************
    ;* Initialize stacks    *
    ;****************************************************
    ;ldr     sp, =SVCStack ;
    ;bl     InitStacks
    mrs     r0,cpsr
    bic     r0,r0,#MODEMASK
    orr     r1,r0,#UNDEFMODE|NOINT
    msr     cpsr_cxsf,r1   ;UndefMode
    ldr     sp,=UndefStack
 
    orr     r1,r0,#ABORTMODE|NOINT
    msr     cpsr_cxsf,r1       ;AbortMode
    ldr     sp,=AbortStack

    orr     r1,r0,#IRQMODE|NOINT
    msr     cpsr_cxsf,r1       ;IRQMode
    ldr     sp,=IRQStack
 
    orr     r1,r0,#FIQMODE|NOINT
    msr     cpsr_cxsf,r1       ;FIQMode
    ldr     sp,=FIQStack

    orr     r1,r0,#SVCMODE|NOINT
    msr     cpsr_cxsf,r1       ;SVCMode
    ldr     sp,=SVCStack

    ;****************************************************
    ;* Setup IRQ handler    *
    ;****************************************************
    ldr     r0,=HandleIRQ  ;This routine is needed
    ldr     r1,=IsrIRQ   ;if there isn't 'subs pc,lr,#4' at 0x18, 0x1c ???
    str     r1,[r0]

    ldr     r0,=HandleFIQ  ;
    ldr     r1,=IsrFIQ   ;
    str     r1,[r0]
   
   
 ;***************************************************
 ; END
 ;***************************************************
 ;BL  main     ; jump to C program
 ;BL  __main  ;
 ldr  pc,=0x0d000000
 B .      

 


    LTORG

SMRDATA DATA
;*****************************************************************
;* Memory configuration has to be optimized for best performance *
;* The following parameter is not optimized.                     *
;*****************************************************************

 DCD 0x22222220 ;Bank0=OM[1:0], Bank1~Bank7=32bit

 DCD ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC)) ;GCS0
 DCD ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC)) ;GCS1
 DCD ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC)) ;GCS2
 DCD ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC)) ;GCS3
 DCD ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC)) ;GCS4
 DCD ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC)) ;GCS5
;"SDRAM"
 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)+(Trc<<18)+(Tchr<<16)+REFCNT) ;REFRESH RFEN=1, TREFMD=0, trp=3clk, trc=5clk, tchr=3clk,count=1019
 DCD 0x17   ;SCLK power down mode, BANKSIZE 16MB/16MB
 DCD 0x20   ;MRSR6 CL=2clk
 DCD 0x20   ;MRSR7

 ALIGN

 AREA RamData, DATA, READWRITE
 

 ^ (_ISR_STARTADDRESS-0x500) ;0x500 = 256*5  _ISR_STARTADDRESS = 0xdff_ff00
    
UserStack # 256 ;c1(c7)ffa00
SVCStack # 256 ;c1(c7)ffb00
UndefStack # 256 ;c1(c7)ffc00
AbortStack # 256 ;c1(c7)ffd00
IRQStack # 256 ;c1(c7)ffe00
FIQStack # 0 ;c1(c7)fff00

  ^ _ISR_STARTADDRESS
  
HandleReset # 4
HandleUndef # 4
HandleSWI # 4
HandlePabort # 4
HandleDabort # 4
HandleReserved # 4
HandleIRQ # 4
HandleFIQ # 4

;Don't use the label 'IntVectorTable',
;because armasm.exe cann't recognize this label correctly.
;the value is different with an address you think it may be.
;IntVectorTable
HandleADC # 4
HandleRTC # 4
HandleUTXD1 # 4
HandleUTXD0 # 4
HandleSIO # 4
HandleIIC # 4
HandleURXD1 # 4
HandleURXD0 # 4
HandleTIMER5 # 4
HandleTIMER4 # 4
HandleTIMER3 # 4
HandleTIMER2 # 4
HandleTIMER1 # 4
HandleTIMER0 # 4
HandleUERR01 # 4
HandleWDT # 4
HandleBDMA1 # 4
HandleBDMA0 # 4
HandleZDMA1 # 4
HandleZDMA0 # 4
HandleTICK # 4
HandleEINT4567 # 4
HandleEINT3 # 4
HandleEINT2 # 4
HandleEINT1 # 4
HandleEINT0 # 4  

 

 

  END

 
点赞 关注
个人签名一个为理想不懈前进的人,一个永不言败人!
http://shop57496282.taobao.com/
欢迎光临网上店铺!

回复
举报
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表