LPC2210啟動代碼步驟(周立功版)

  LPC2210系統啟動代碼步驟:

1.初始化外部總線控制器;
主要工作是:
1. 初始化引腳鏈接模塊的值,即PINSEL2;
2. 配置外部第0個存儲區和第1個存儲區,設置16位總線寬度,總線速度調到最慢
 
 
2.初始化堆棧;
 
3.初始化目標板;
主要工作是:
1.設置存儲器影射控制模式;
2.設置時鐘;
3.設置存儲器加速模塊;
4.初始化向量中斷控制器
再看看代碼:

;定義堆棧的大小
USR_STACK_LEGTH         EQU         
256
SVC_STACK_LEGTH         EQU         
0
FIQ_STACK_LEGTH         EQU         
0
IRQ_STACK_LEGTH         EQU         
256
ABT_STACK_LEGTH         EQU         
0
UND_STACK_LEGTH         EQU         
0

NoInt       EQU 
0x80

USR32Mode   EQU 
0x10
SVC32Mode   EQU 
0x13
SYS32Mode   EQU 
0x1f
IRQ32Mode   EQU 
0x12
FIQ32Mode   EQU 
0x11

PINSEL2     EQU 
0xE002C014

BCFG0       EQU 
0xFFE00000
BCFG1       EQU 
0xFFE00004
BCFG2       EQU 
0xFFE00008
BCFG3       EQU 
0xFFE0000C


;引入的外部標號在這聲明
    IMPORT  FIQ_Exception                   ;快速中斷異常處理程序
    IMPORT  __main                          ;C語言主程序入口 
    IMPORT  TargetResetInit                 ;目標板基本初始化
    IMPORT  StackUsr
    IMPORT  bottom_of_heap

;給外部使用的標號在這聲明
    EXPORT  Reset
    EXPORT __rt_div0
    EXPORT __user_initial_stackheap

    CODE32

    AREA    vectors,CODE,READONLY
        ENTRY
;中斷向量表
Reset
        LDR     PC, ResetAddr
        LDR     PC, UndefinedAddr
        LDR     PC, SWI_Addr
        LDR     PC, PrefetchAddr
        LDR     PC, DataAbortAddr
        DCD     
0xb9205f80
        LDR     PC, [PC, #
- 0xff0 ]
        LDR     PC, FIQ_Addr

ResetAddr           DCD     ResetInit
UndefinedAddr       DCD     Undefined
SWI_Addr            DCD     SoftwareInterrupt
PrefetchAddr        DCD     PrefetchAbort
DataAbortAddr       DCD     DataAbort
Nouse               DCD     
0
IRQ_Addr            DCD     
0
FIQ_Addr            DCD     FIQ_Handler

;未定義指令
Undefined
        B       Undefined

;軟中斷
SoftwareInterrupt
        B       SoftwareInterrupt

;取指令中止
PrefetchAbort
        B       PrefetchAbort

;取數據中止
DataAbort
        B       DataAbort

;快速中斷
FIQ_Handler
        STMFD   SP
! {R0-R3, LR}
        BL      FIQ_Exception
        LDMFD   SP
! {R0-R3, LR}
        SUBS    PC,  LR,  #
4


InitStack    
        MOV     R0, LR

;設置管理模式堆棧
        MSR     CPSR_c, #
0xd3
        LDR     SP, StackSvc
;設置中斷模式堆棧
        MSR     CPSR_c, #
0xd2
        LDR     SP, StackIrq
;設置快速中斷模式堆棧
        MSR     CPSR_c, #
0xd1
        LDR     SP, StackFiq
;設置中止模式堆棧
        MSR     CPSR_c, #
0xd7
        LDR     SP, StackAbt
;設置未定義模式堆棧
        MSR     CPSR_c, #
0xdb
        LDR     SP, StackUnd
;設置系統模式堆棧
        MSR     CPSR_c, #
0xdf
        LDR     SP, 
= StackUsr

        MOV     PC, R0


ResetInit
;初始化外部總線控制器,根據目標板決定配置

        LDR     R0, 
= PINSEL2
    IF :DEF: EN_CRP
        LDR     R1, 
= 0x0f814910
    ELSE
        LDR     R1, 
= 0x0f814914
    ENDIF
        STR     R1, [R0]

        LDR     R0, 
= BCFG0
        LDR     R1, 
= 0x1000ffef
        STR     R1, [R0]

        LDR     R0, 
= BCFG1
        LDR     R1, 
= 0x1000ffef
        STR     R1, [R0]

;        LDR     R0, 
= BCFG2
;        LDR     R1, 
= 0x2000ffef
;        STR     R1, [R0]

;        LDR     R0, 
= BCFG3
;        LDR     R1, 
= 0x2000ffef
;        STR     R1, [R0]
        
        BL      InitStack               ;初始化堆棧
        BL      TargetResetInit         ;目標板基本初始化
                                        ;跳轉到c語言入口
        B       __main



__user_initial_stackheap    
    LDR   r0,
= bottom_of_heap
    MOV   pc,lr


__rt_div0

        B       __rt_div0

StackSvc           DCD     SvcStackSpace 
+  (SVC_STACK_LEGTH  -   1 ) *   4
StackIrq           DCD     IrqStackSpace 
+  (IRQ_STACK_LEGTH  -   1 ) *   4
StackFiq           DCD     FiqStackSpace 
+  (FIQ_STACK_LEGTH  -   1 ) *   4
StackAbt           DCD     AbtStackSpace 
+  (ABT_STACK_LEGTH  -   1 ) *   4
StackUnd           DCD     UndtStackSpace 
+  (UND_STACK_LEGTH  -   1 ) *   4




    IF :DEF: EN_CRP
        IF  . 
>=   0x1fc
        INFO    
1 , " The data at 0x000001fc must be 0x87654321. Please delete some source before this line. "
        ENDIF
CrpData
    WHILE . 
<   0x1fc
    NOP
    WEND
CrpData1
    DCD     
0x87654321           ; /* 當此數為0x87654321時,用戶程序被保護 */
    ENDIF
;
/* 分配堆棧空間 */
        AREA    MyStacks, DATA, NOINIT, ALIGN
= 2
SvcStackSpace      SPACE   SVC_STACK_LEGTH 
*   4   ;管理模式堆棧空間
IrqStackSpace      SPACE   IRQ_STACK_LEGTH 
*   4   ;中斷模式堆棧空間
FiqStackSpace      SPACE   FIQ_STACK_LEGTH 
*   4   ;快速中斷模式堆棧空間
AbtStackSpace      SPACE   ABT_STACK_LEGTH 
*   4   ;中止義模式堆棧空間
UndtStackSpace     SPACE   UND_STACK_LEGTH 
*   4   ;未定義模式堆棧
    END

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值