LPC2114启动代码(最近玩的板子)

启动代码是芯片复位后进入C语言的main()函数前执行的一段代码,主要为运行C语言程序提供基本运行环境。启动代码可划分为四个文件:startup.sstack.sheap.starget.c。其中startup.s包含异常向量表和系统初始化代码,stack.sheap.s保存C语言使用的堆和栈的开始位置,target.c包括异常处理程序和目标板特殊的代码。

 

1、异常向量表(代码位于startup.s中,无需修改)

 

   异常是有内部或外部源产生的,以引起处理器处理的一个事件,异常出现后,CPU强制从异常类型对应的固定存储地址开始执行程序。这个固定的地址称为异常向量。如当IRQ中断产生后,CPU强制跳转到0x00000018处执行代码,我们要做的就是在这个代码地址处编写相应的指令,让它顺利执行IRQ中断程序.通常我们会在这里放置一条转移指令,因为0x00000018只给你一个字的编程空间.

异常向量表代码如下:

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

 

2、系统初始化代码(代码位于startup.s中,无需修改)

 

ResetInit
                BL      InitStack                ;
初始化堆栈     

            BL      TargetResetInit         ;目标板基本初始化          

              B       __main               ;跳转到c语言入口

 

当系统复位后,程序跳转到0x00000000处执行指令,那么就执行  LDR     PC, ResetAddr,及执行ResetInit地址处的代码,这里放置了BL     InitStack指令,负责初始化各种模式的堆栈,接着执行BL      TargetResetInit ,完成目标板基本初始化,最后跳转到ADS提供的启动代码__main,它初始化库并最终引导CPU进入main函数.

 

3、初始化CPU堆栈(代码位于startup.s中,一般不需要修改)

 

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


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

 

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  ;
未定义模式堆栈

 

    因为程序需要切换模式,而且程序退出时CPU的模式已经不再是管理模式而是系统模式,LR已经不再保存返回程序地址,所以程序首先把返回地址保持到R0中,同时使用R0返回。然后程序把处理器模式转化为管理模式,并设置管理模式的堆栈指针。其中变量StackSvc保存着管理模式的堆栈指针的初始值,SvcStackSpace是分配给管理模式的堆栈空间的开始地址,而SVC_STACK_LEGTH是用户定义的常量,用于设置管理模式的堆栈空间的大小,其代码在文件startup.s的开始处,用户可以根据需要改变它。程序使用同样的方法对其他模式进行设置。

 

4、系统基本的初始化工作(代码位于target.c中,用户根据需要修改)

 

    为了使系统能够工作,必须在进入main()函数前进行一些基本的初始化工作,如地址重映射,PLL时钟初始化,存储器加速模块初始化,VIC中断初始化等,这些工作由函数TargetResetInit()完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值