您的位置 首页 开关

对ARM7 LPC2210的Bootloader源码剖析

对周立功公司开发板EasyARMLPC2210开发板Chenmingji写的Bootlaoder进行分析和解读。一、变(常)量声明首先声明堆栈大小;definethe…

对周建功公司开发板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

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/dianyuan/kaiguan/275704.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部