admin 管理员组

文章数量: 887017

摘要:本文的主要内容是关于PHILIP公司ARM7系列LPC2214芯片的调试报告,以及在其基础上的网络通信程序设计的调试报告和KEIL公司的开源RTL操作系统下TCPNET不开源协议栈的工作报告;在具体论述我的调试过程的时候,我会把我查询的一些我认为正确的资料附在合适的位置,以供参考。

转载请注明出处

LPC2214启动代码部分

启动代码-汇编代码--c语言的准备工作。包括向量表定义,堆栈初始化,系统变量初始化,中断系统初始化,i/o初始化,外围初始化,地址重映射等操作。

在开始之前我建议首先把ARM的指令系统熟悉一遍,然后结合启动代码熟悉指令的含义和具体操作,尤其需要的是要比较明确的知道startup.s文件中的伪指令的含义,这将给你以后堆栈的大小等带来一个概念;

 

基本结构

下面是关于启动文件一个说明,模仿于UV3软件提供PHILIP LPC2000系列芯片的startup文件;在说明之前你有必要先熟悉ARM指令集,注意他的模块化的结构;VPBDIVPLL

MAMEMCBCG0-3等的设置比较模式化,熟悉下datasheet说明后,比较容易设置好,

要留意的就是PINSEL0-2的设置,根据自己的外部接口配置PINSEL

 

LPC2114启动代码的编写主要包括:

    1.异常向量表的建立  

    2.MCU各种模式堆栈的初始化

    3.系统基本的初始化工作

    下面分别进行介绍.

()ARM相关指令及伪指令

     LDR PC,ResetAddr

     ResetAddr标号地址所指的内容传送给PC寄存器

     LDR PC,=ResetAddr

     ResetAddr标号地址传送给PC寄存器

     ResetAddr DCD ResetInit

     ResetAddr分配一个字的地址空间,ResetInit初始化,ResetAddr地址所指的内容为ResetInit标号地址

     SvcStackSpace Space SVC_STACK_LENGTH*4

     SvcStackSpace分配一块SVC_STACK_LENGTH*4大小的地址区域,并以0初始化区域内容

()异常向量表的建立

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

     程序如下:

AREA    vectors,CODE,READONLY

ENTRY

;interrupt vectors

;中断向量表

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

 IRQ_Addr            DCD     0

FIQ_Addr            DCD     FIQ_Handler

   **

        **

ResetInit

       

        BL      InitStack               ;初始化堆栈 Initialize the stack

        BL      TargetResetInit         ;目标板基本初始化 Initialize the target board

                                        ;跳转到c语言入口 Jump to the entry point of C program

        B       __main

      我们可以看到,每种异常都有相应的处理程序,:当系统复位后,程序跳转到0x00000000处执行指令,那么就执行  LDR     PC, ResetAddr,及执行ResetInit地址处的代码,这里放置了BL     InitStack指令,负责完成各种模式下堆栈的初始化,接着执行BL      TargetResetInit ,完成目标板基本初始化,最后进入c语言入口,执行main函数.

()MCU各种模式堆栈的初始化

    由于各种异常模式下都有自身的SP堆栈指针,因此就必须先进入各自的异常模式进行SP的设置,各种模式的切换可以通过改变CPSR来实现,程序如下:

InitStack   

        MOV     R0, LR

;Build the SVC stack

 

;设置管理模式堆栈

        MSR     CPSR_c, #0xd3  

        LDR     SP, StackSvc 

;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, #0x5f

        LDR     SP, =StackUsr


        MOV     PC, R0

 

**

**

StackSvc           DCD     SvcStackSpace + (SVC_STACK_LEGTH - 1)* 4

StackIrq           DCD     IrqStackSpace + (IRQ_STACK_LEGTH - 1)* 4

本文标签: 芯片 报告 系列