对ARM7 LPC2210的Bootloader源码分析

发布者:EuphoricVoyage最新更新时间:2016-07-20 来源: eefocus关键字:ARM7  LPC2210  Bootloader 手机看文章 扫描二维码
随时随地手机看文章
对周立功公司开发板EasyARM LPC2210开发板Chenmingji写的Bootlaoder进行分析和解读。

一、变(常)量声明
    首先声明堆栈大小
          ;define the stack size
    ;定义堆栈的大小
    SVC_STACK_LEGTH         EQU         0
    FIQ_STACK_LEGTH         EQU         0
    IRQ_STACK_LEGTH         EQU         256    ;IRQ中断堆栈
    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 __use_no_semihosting_swi
    IMPORT __use_two_region_memory

    ;The imported labels
;引入的外部标号在这声明
    IMPORT  FIQ_Exception                   ;Fast interrupt exceptions handler 快速中断异常处理程序
    IMPORT  __main                          ;The entry point to the main function C语言主程序入口 
    IMPORT  TargetResetInit                 ;initialize the target board 目标板基本初始化

;The emported labels
;给外部使用的标号在这声明
    EXPORT  bottom_of_heap                  ;heap的底部
    EXPORT  bottom_of_Stacks                ;stack的底部
    EXPORT  top_of_heap                     ;heap的顶部
    EXPORT  StackUsr                        
    
    EXPORT  Reset                           ;复位
    EXPORT __user_initial_stackheap         ;用户初始化堆栈和堆

二、建立中断向量表(向量表所有数据32位累加和为0)
    Reset
        LDR     PC, ResetAddr               ;复位后开始的执行地址
        LDR     PC, UndefinedAddr           ;未定义指令异常           
        LDR     PC, SWI_Addr                ;软件中断
        LDR     PC, PrefetchAddr            ;预取中止
        LDR     PC, DataAbortAddr           ;预取数据中止
        DCD     0xb9205f80                  ;保留的异常
        LDR     PC, [PC, #-0xff0]           ;IRQ ( 该指令会读取VICVectAddr寄存器的值,然后放入PC指针 )
        LDR     PC, FIQ_Addr                ;FIQ

    ;给每一个向量分配连续的字存储单元
    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

    ;发生以下异常时程序暂停( 除了FIQ )
    ;未定义指令
    Undefined
            B       Undefined

    ;软中断
    SoftwareInterrupt   
            B       SoftwareInterrupt

    ;取指令中止
    PrefetchAbort
            B       PrefetchAbort

    ;取数据中止
    DataAbort
            B       DataAbort

    ;快速中断
    FIQ_Handler
            STMFD   SP!, {R0-R3, LR}            ;把R0-R3,LR的值存入堆栈
            BL      FIQ_Exception               ;跳转到FIQ中断程序
            LDMFD   SP!, {R0-R3, LR}            ;恢复R0-R3,LR的值
            SUBS    PC,  LR,  #4                ;PC指针跳转到LR-4

三、复位程序
    根据外部存储器控制器的引脚接法,对GPIO进行设置(外部存储器所接引脚与P1,P2,P3口的GPIO功能复用),之后对用到的四组存储器组进行设置.
    ResetInit
    ;Initial extenal bus controller.
    ;初始化外部总线控制器,根据目标板决定配置

            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               ;初始化堆栈 Initialize the stack
            BL      TargetResetInit         ;目标板基本初始化 Initialize the target board
                                            ;跳转到c语言入口 Jump to the entry point of C program
        B       __main

四、堆栈初始化
    初始化各模式堆栈
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, #0xdf             ;修改为0x5d将打开IRQ中断
        LDR     SP, =StackUsr

        MOV     PC, R0                    ;子程序返回

五、目标板初始化
        void TargetResetInit(void)
{
// 设置存储器映射方式,这必须根据硬件来设置. 这里是ADS1.2中的设置.
#ifdef __DEBUG    
    MEMMAP = 0x3;                   //remap
#endif

#ifdef __OUT_CHIP    
    MEMMAP = 0x3;                   //remap
#endif

#ifdef __IN_CHIP    
    MEMMAP = 0x1;                   //remap
#endif

/* 设置系统各部分时钟 */
    PLLCON = 1;
#if (Fpclk / (Fcclk / 4)) == 1
    VPBDIV = 0;
#endif
#if (Fpclk / (Fcclk / 4)) == 2
    VPBDIV = 2;
#endif
#if (Fpclk / (Fcclk / 4)) == 4
    VPBDIV = 1;
#endif

#if (Fcco / Fcclk) == 2
    PLLCFG = ((Fcclk / Fosc) - 1) | (0 << 5);
#endif
#if (Fcco / Fcclk) == 4
    PLLCFG = ((Fcclk / Fosc) - 1) | (1 << 5);
#endif
#if (Fcco / Fcclk) == 8
    PLLCFG = ((Fcclk / Fosc) - 1) | (2 << 5);
#endif
#if (Fcco / Fcclk) == 16
    PLLCFG = ((Fcclk / Fosc) - 1) | (3 << 5);
#endif
    PLLFEED = 0xaa;
    PLLFEED = 0x55;
    while((PLLSTAT & (1 << 10)) == 0);
    PLLCON = 3;                                // 按照特定的设置方式对PLL控制寄存器进行设置
    PLLFEED = 0xaa;
    PLLFEED = 0x55;
    
    /* 设置存储器加速模块 */
    MAMCR = 0;
#if Fcclk < 20000000
    MAMTIM = 1;
#else
#if Fcclk < 40000000
    MAMTIM = 2;
#else
    MAMTIM = 3;
#endif
#endif
    MAMCR = 2;
    
    /* 初始化VIC */
    /* initialize VIC*/
    VICIntEnClr = 0xffffffff;
    VICVectAddr = 0;
    VICIntSelect = 0;

}

六、其它

;/*********************************************************************************************************
;** 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
    LDR   r2,=top_of_heap
    LDR   r3,=bottom_of_Stacks
    MOV   pc,lr


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

;/*********************************************************************************************************
;** unction name  函数名称:  CrpData
;** Descriptions  功能描述:  encrypt the chip
;** input parameters  输 入:    None 无
;** Returned value    输 出 :   None 无
;** Used global variables 全局变量:  None 无
;** Calling modules  调用模块:  None 无
;********************************************************************************************************/
    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
SvcStackSpace      SPACE   SVC_STACK_LEGTH * 4  ;Stack spaces for Administration Mode 管理模式堆栈空间
IrqStackSpace      SPACE   IRQ_STACK_LEGTH * 4  ;Stack spaces for Interrupt ReQuest Mode 中断模式堆栈空间
FiqStackSpace      SPACE   FIQ_STACK_LEGTH * 4  ;Stack spaces for Fast Interrupt reQuest Mode 快速中断模式堆栈空间
AbtStackSpace      SPACE   ABT_STACK_LEGTH * 4  ;Stack spaces for Suspend Mode 中止义模式堆栈空间
UndtStackSpace     SPACE   UND_STACK_LEGTH * 4  ;Stack spaces for Undefined Mode 未定义模式堆栈


        AREA    Heap, DATA, NOINIT
bottom_of_heap      SPACE   1

        AREA    StackBottom, DATA, NOINIT
bottom_of_Stacks    SPACE   1

        AREA    HeapTop, DATA, NOINIT
top_of_heap

        AREA    Stacks, DATA, NOINIT
StackUsr

关键字:ARM7  LPC2210  Bootloader 引用地址:对ARM7 LPC2210的Bootloader源码分析

上一篇:使用MMU进行地址重映射的启动代码结构探讨
下一篇:arm(lpc22xx)存储器寻址

推荐阅读最新更新时间:2024-03-16 15:01

arm7 lpc2148力天电子 PLL实验(一)之PLL中断实验
实验采用中断方式打开PLL,。添加蜂鸣器用于指示PLL锁定。 当PLL锁定成功后,蜂鸣器蜂鸣一声。实验程序如下所示,我是在IAR下面进行的调试,出现了两个警告,但不影响程序的运行。 #include NXP/iolpc2148.h typedef unsigned char uint32; void PLL_INT(void); void Delayn(unsigned long n); IRQEnable(void); //PLL中断函数 void PLL_INT(void) { PINSEL0=0x00000000; //设置所有引脚连接GPIO IO0DIR_bit.P0_22 = 1; PLLCON
[单片机]
ARM7入门4,单键控制LED
用ADS1.2编辑的,注意添加target.c,IRQ.s,Startuo.s和mem.scf文件。 主程序: /****************************************************************************** *File:Main.c *功能: 键盘输入.当检测到有按键输入时,对发光二极管进行取反控制 * 使用I/O口输入方式对按键进行扫描 *******************************************************************************/ #include config.h #define
[单片机]
<font color='red'>ARM7</font>入门4,单键控制LED
畅学多功能ARM7实验箱LED流水灯资源详解
1. 单色流水灯测试 硬件准备:8P杜邦线1根 接线说明:使用1根8P杜邦线连接ARM核心板P019~P026接底板单色流水灯模块的JP15。 跳线说明:无 分别为:P019-I1,P020-I2,P021-I3,P022-I4,P023-I5,P024-I6,P025-I7,P026-I8. 实验现象:8个LED灯依次熄灭 源码资源如下: /*****************LPC2103 GPIO流水灯实验*************** 系统设置: Fosc、Fcclk、Fcco、Fpclk #define Fosc 12000000 #define Fcclk (Fosc * 5)
[单片机]
畅学多功能<font color='red'>ARM7</font>实验箱LED流水灯资源详解
选择ARM处理器的ARM7还是Cortex-M3
1.1 ARM处理器系列 每个ARM处理器都有一个特定的指令集架构(ISA),而一个ISA版本又可以有多种处理器实现。ISA随着嵌入式市场的需求而发展,至今已经有多个版本。ARM公司规划该发展过程,使得在较早的架构版本上编写的代码也可以在后继版本上执行(即代码的兼容性)。 1.1.1 命名规则 早期ARM使用如图1.1所示的命名规则来描述一个处理器。在 ARM 后的字母和数字表明了一个处理器的功能特性。随着更多特性的增加,字母和数字的组合可能会改变。注意:命名规则不包含体系结构(ISA)的版本信息。 ARM {x}{y}{z}{T}{D}{M}{I}{E}{J}{F}{-S} x 系列 y 存储管理/保护单元 z cache T
[单片机]
Cortex-M3 VS ARM7
要使用低成本的 32位处理器,开发人员面临两种选择,基于Cortex-M3内核或者ARM7TDMI内核的处理器。如何做出选择?选择标准又是什么?本文主要介绍了ARM Cortex-M3内核微控制器区别于ARM7的一些特点,帮助您快速选择。 1.ARM实现方法 ARM Cortex-M3是一种基于ARM V7架构的最新ARM嵌入式内核,它采用哈佛结构,使用分离的指令和数据总线;ARM7是冯诺伊曼结构 冯诺伊曼结构下,数据和指令共用一条总线 。从本质上来说,哈佛结构在物理上更为复杂,但是处理速度明显加快。根据摩尔定理,复杂性并不是一件非常重要的事,而吞吐量的增加却极具价值。 ARM公司对Cortex-M3的定位是:向专
[单片机]
BLOB启动流程与Bootloader程序可移植性研究
  在嵌入式系统应用中,通过引导程序(Bootloader)可以初始化硬件设备、建立内存空间的映射图、加载内核,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境 。Bootloader依赖于实际的硬件和应用环境,对于不同的硬件架构以及相同架构的不同 电路 板,都需要不同的Bootloader。由于单独开发Bootloader的工作量较大,因此开发人员一般针对固定体系构架开发一种可移植性的Bootloader,使之能够在少量修改后应用于同一体系构架的其他电路板。BLOB就是一种针对ARM体系定制的可移植性良好的嵌入式Linux引导程序。BLOB支持多种CPU,包括SA1100、SA1110、PXA
[单片机]
BLOB启动流程与<font color='red'>Bootloader</font>程序可移植性研究
周立功lpc21xx/lpc22xx系列ARM7启动代码分析
网上已经有人做了一个周立功lpc2000(ARM7TDMI)启动代码分析的文章, 我本来想做一个s3c2410(ARM920T)的启动代码分析的, 但是看来了一下2410的启动代码,发现有些东西还不是理解的很清楚, 我ARM9的经验比较少. 所以还是做一个ARM7的启动代码分析吧, 网上那一份相比,我这个主要关注startup.s文件.网上那个startup.s几乎是一笔带过的. 红色标记的是源码. SVC_STACK_LEGTH EQU 0 FIQ_STACK_LEGTH EQU 0 IRQ_STACK_LEGTH EQU 256 ABT_STACK_LEGTH
[单片机]
周立功lpc21xx/lpc22xx系列<font color='red'>ARM7</font>启动代码分析
基于ARM7的远程智能住宅控制装置的研制
1 总体方案设计   如图l所示。智能家电控制系统由家庭智能控制模块、家庭内部网络系统、以及GPRS模块等几部分构成。   (1)家庭智能控制器:该部分是系统的核心。采用嵌入式系统设计,能够自动运行、处理数据,通过RS485总线管理和控制家庭系统。并且控制器通过GPRS模块,实现家庭系统与外部网络的通讯,使用户可以通过短信和互联网等方式实现家庭系统的远程控制,同时,控制器还通过键盘和显示屏为用户提供人机界面,方便用户实现本地控制。   (2)家庭系统:家庭系统通过单片机组成若干小的控制系统控制各家用设备,并通过统一的控制总线将这些小的控制系统组成网络,连接到家庭智能控制器,受家庭智能控制器控制。   家庭智能控制器系
[安防电子]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved