原创 [转]LPC2142板子上的ARM7的启动文件编写

2008-2-27 08:51 3102 5 5 分类: MCU/ 嵌入式
在嵌入式开发中,有个启动文件,也叫作boot程序,是系统启动进入操作系统之前,最先开始执行的那一段小程序,它主要负责系统的这些初始化:中断向量初始化,各处理器模式的堆栈初始化,各硬件设备初始化。

   在ARM7系统开发中,这个boot文件都是用汇编写的,用ARM标准汇编指令集,是最底层的硬件相关的东西,编写这个文件之前,要对板上的硬件资源相当了解,特别是CPU的datasheet,还要了解需要你需要哪些功能,再按需设置硬件的初始化。譬如,要用COM口监视程序的运行情况,那么肯定要先配置好COM口的初始化。  
   系统加电或复位后,所有的 CPU 通常都从某个由 CPU 制造商预先安排的地址上取指令。基于 ARM7TDMI core 的CPU在复位时通常都从地址 0x00000000 取它的第一条指令。而基于 CPU 构建的嵌入式系统通常都有某种类型的固态存储设备(比如:ROM、EEPROM 或 FLASH 等)被映射到这个预先安排的地址上。因此在系统加电后,CPU 将首先执行 Boot程序。 LPC2142处理器内集成了一个64k大小的FLASH,用来放置程序。 


   本人参考了别人的一些boot程序,自己写了一个boot loader,并在自己的LPC2142的板子上成功的跑了uC/OS-II操作系统,如下:


;LPC2142 BOOT LOADER


;定义堆栈的大小
FIQ_STACK_LEGTH         EQU         0   ;屏蔽快速中断;
IRQ_STACK_LEGTH         EQU         9*8 ;每层嵌套需要9个字堆栈,允许8层嵌套;
ABT_STACK_LEGTH         EQU         0   ;异常中断屏蔽;
UND_STACK_LEGTH         EQU         0   ;为定义指令中断屏蔽;


NoInt       EQU 0x80    ;中断禁止宏定义,被用在CPU的CSPR寄存器,即CPU程序状态寄存器;        


USR32Mode   EQU 0x10    ;ARM中的用户模式;
SVC32Mode   EQU 0x13    ;管理模式
SYS32Mode   EQU 0x1f    ;系统模式
IRQ32Mode   EQU 0x12    ;中断模式;
FIQ32Mode   EQU 0x11    ;快速中断模式;ARM7共7种模式,但是我只用到这几种.


IMPORT __use_no_semihosting_swi ;编译器相关的函数或者变量的导入,必须这样做,否则编译器不认识;
   
;The imported labels   
;引入的外部标号在这声明
    IMPORT  FIQ_Exception                ; 快速中断异常处理程序
    IMPORT  __main                       ;C语言主程序入口;当boot运行完后,再进入main,开始导入操作


                                         ;系统和用户任务程序;
    IMPORT  TargetResetInit              ;目标板基本初始化;把所有的硬件初始化封装在这个函数中;
    IMPORT  SoftwareInterrupt            ;软中断;因为必须为操作系统提供一个软中断函数,便于任务切换;


;The emported labels   
;给外部使用的标号在这声明
 EXPORT  bottom_of_heap
    EXPORT  StackUsr
   
    EXPORT  Reset
    EXPORT  __user_initial_stackheap
   


    CODE32


    AREA    vectors,CODE,READONLY
        ENTRY


;interrupt vectors
;中断向量表 
Reset
        LDR     PC, ResetAddr    ;中断向量表从地址0x00000000开始放,因为CPU复位就会从此地址开始执行
        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
       
;取指令中止
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


;/*********************************************************************************************************
;** unction name  函数名称:  InitStack
;** Descriptions  功能描述:  Initialize the stacks  初始化堆栈
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
InitStack   
        MOV     R0, LR
       
;Build the IRQ stack
;设置中断模式堆栈
        MSR     CPSR_c, #0xd2
        LDR     SP, StackIrq
;Build the FIQ stack
;设置快速中断模式堆栈
        MSR     CPSR_c, #0xd1
        LDR     SP, StackFiq
;Build the DATAABORT stack
;设置中止模式堆栈
        MSR     CPSR_c, #0xd7
        LDR     SP, StackAbt
;Build the UDF stack
;设置未定义模式堆栈
        MSR     CPSR_c, #0xdb
        LDR     SP, StackUnd
;Build the SYS stack
;设置系统模式堆栈
        MSR     CPSR_c, #0xdf
        LDR     SP, =StackUsr


        MOV     PC, R0


;/*********************************************************************************************************
;** unction name  函数名称:  ResetInit
;** Descriptions  功能描述:  RESET  复位入口
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
ResetInit


        BL      InitStack               ; Initialize the stack 初始化堆栈
        BL      TargetResetInit         ; Initialize the target board 目标板基本初始化
                                        ; Jump to the entry point of C program 跳转到c语言入口
        B       __main



;/*********************************************************************************************************
;** unction name  函数名称:  __user_initial_stackheap
;** Descriptions  功能描述:  Initial the function library stacks and heaps, can not deleted!   库函数初始化堆和栈,不能删除
;** input parameters  输 入:    reference by function library 参考库函数手册
;** Returned value    输 出 :   reference by function library 参考库函数手册
;** Used global variables 全局变量:  None 无
;** Calling modules  调用模块:  None 无
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/


__user_initial_stackheap   
    LDR   r0,=bottom_of_heap 
;    LDR   r1,=StackUsr  
    MOV   pc,lr   
       
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


;/*********************************************************************************************************
;** unction name  函数名称:  CrpData
;** Descriptions  功能描述:  encrypt the chip
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
 IF :DEF: EN_CRP
        IF  . >= 0x1fc
        INFO    1,"\nThe data at 0x000001fc must be 0x87654321.\nPlease delete some source before this line."
        ENDIF
CrpData
    WHILE . < 0x1fc
    NOP
    WEND
CrpData1
    DCD     0x87654321          ;/*When the Data is 为0x87654321,user code be protected. 当此数为0x87654321时,用户程序被保护 */
    ENDIF


;/* 分配堆栈空间 */
        AREA    MyStacks, DATA, NOINIT, ALIGN="2"


IrqStackSpace      SPACE   IRQ_STACK_LEGTH * 4  ;中断模式堆栈空间
FiqStackSpace      SPACE   FIQ_STACK_LEGTH * 4  ;快速中断模式堆栈空间
AbtStackSpace      SPACE   ABT_STACK_LEGTH * 4  ;中止义模式堆栈空间
UndtStackSpace     SPACE   UND_STACK_LEGTH * 4  ;未定义模式堆栈



        AREA    Heap, DATA, NOINIT
bottom_of_heap    SPACE   1


        AREA    Stacks, DATA, NOINIT
StackUsr


    END
;/*********************************************************************************************************
;**                            End Of File
;********************************************************************************************************/

文章评论0条评论)

登录后参与讨论
我要评论
0
5
关闭 站长推荐上一条 /2 下一条