1.LPC2200的发动进程:
(1) 芯片发动时,是从0地址开端,可是这时引导程序被映射到了地址0,所以这时发动的便是引导程序。
(2) 引导程序查看ISP引脚的状况和BOOT【1】和BOOT【0】,依据不同的状况,将不同的内容映射到地址0,例如
0x80000000或许0x40000000,这个要看你的装备了,然后进行从头映射。
(3) 从头映射后,就跳转到0再运转,这时候实践上运转的是0x80000000或许0x40000000的程序了。
留意:设置RW和RO的意图是为了告知编译器把生成的代码放在存储器的什么当地。代码实践是存在0x80000000或许0x40000000那里的,仅仅经过映射的方法,将前面的中止向量表部分映射到地址0去了。、
2.bootLoader 的功用:
(1) 功用: 舱位串口下载
(2)进程:首要,是经过检测P0.14口的状况。假如为低电平,则运转ISP的程序,它是BOOTLOADER的一部分,这段程序是引导串口接纳数据并放进片内FLASH中;假如P0.14口的状况不为0,那么它就检测你是运转片内FLASH的程序仍是外部FLASH的。
先说说片外的FLASH,我们咱们下载片外FLASH时是把BIN文件烧进去的,一切的代码都是在一起的,这是什么意思呢,最开端是RO段的程序,紧接着是RW段的程序,可是碑文时为了进步碑文速度,把RO段放ROM区,RW段放RAM区,这动作是怎样完成的呢,其实便是在进行运转复位程序前就现已重映射了,详细是怎样完成的呢,其实便是一段程序转移程序,由硬件完成,呵呵。假如是片内的,个人认为应该是相同的进程,仅仅速度快些罢了。
不管怎样样,复位,PC必定指向0x00000000,可是它从这个地址取出了一个跳转指令,跳到了bootloader区,为什么这么说呢,分明这一区域放的是中止向量表吗?呵呵,不错,可是这个向量表它源于bootloader区,所以相当于碑文它的bootloader相同拉,接下来就要检测是否要下载(对P0.14进行检测,看是否是低电平),假如不下载就碑文用户程序。
详细的重映射进程,上电复位后,我们ARM晒干的FLASH和RAM它是没有地址编码的,所以要经过一次重映射,FLASH映射到0x80000000开端,RAM映射到0x40000000,体系依据BOOT[1:0]这两个脚主动把代码映射,也便是这段时刻该怎样映射就怎样映射。不过很短,我们是由硬件完成的。
3.存储器的重映射
(1)存储器映射: 为存储器分配地址的进程称为存储器映射
(2)存储器重映射:为了增加体系的灵活性,体系中有部分地址能够一起出现在不同的地址上,这就叫做存储器重映射。
(3)重映射的内容:首要包括引导块“Boot Block”重映射和反常向量表的重映射。
4.引导块“Boot Block”及其重映射
(1)Boot Block 界说: Boot Block是芯片规划厂商在LPC2000系列ARM内部固化的一段代码,用户无法对其进行修正或许删去;
这段代码在复位时被首要运转。
(2)Boot Block 效果: a. 要用来判别运转哪个存储器上面的程序
b. 查看用户代码是否有用
c. 判别芯片是否被加密
d. 体系的在使用编程(IAP)以及在体系编程功用(ISP)
(3)Boot Block的方位:存在于内部Flash,LPC2200系列巨细为8kb,它占用了用户的Flash空间;但也有其他的LPC系列不占
FLash空的, 而部分没有内部Flash空间的ARM处理器依然存在Boot Block。
(4)Boot Block的重映射原因: Boot Block中有些程序可被用户调用,如擦写片内Flash的IAP代码。为了增加用户代码的可移植性,
所以最好把Boot Block的代码固定的某个地址上。但我们各芯片的片内Flash巨细不尽相同,假如把Boot Block的地址组织在内部
Flash完毕的方位上,那就无法固定Boot Block的地址。
为了处理上面的问题,所以芯片厂家将Boot Block的地址重映射到片内存储器空间的最高端,即挨近2Gb的当地,这样不管片内存储器的巨细怎么,都不会影响Boot Block的地址。因而当Boot Block中包括可被用户调用的IAP操作的代码时,不必修正IAP的操作地址就能够在不同的LPC系列的ARM上运转了。
5. 中止反常向量表的重映射
ARM内核在产生反常后,会使程序跳转到坐落0x0000~0x001C的反常向量表处,再经过向量跳转到反常服务程序。但ARM单条指令的寻址规模有限,无法用一条指令完成4G规模的跳转,所以应在这以后面的0x0020~0x003F地址上放置跳转方针,这样就能够完成4G规模内的恣意跳转,因而一个反常向量表实践上占用了16个字的存储单元。以下为一张中止向量表:
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
重映射的原因:
我们ARM处理器的存储器结构比较复杂,或许一起存在片内存储器和片外存储器等,他们在存储器映射上的开始地址都不相同,因而ARM内核要拜访的中止向量表或许不在0x0000~0x003F地址上,因而采用了存储器重映射来完成将存在与不同当地的中止向量表都映射到0x0000~0x003F地址上。
留意:Boot Block 也存在中止向量表,并且复位后这段代码首要映射到 0x0000~0x003F地址上,也便是说复位后首要运转的是Boot Block程序。各个存储区域的中止向量表也不尽相同。
从上面能够看出中止向量表能够来自4个不同的存储区域。经过下图的激活方法,能够在0x0000~0x003F地址处拜访到从其他存储区域重映射过来的中止向量表。
留意:除了“用户片内FLASH形式”外,其他形式下都无法拜访片内FLASH的0x0000~0x003F区域。
6.体系发动代码
从体系上电到正式运转用户的main函数之前,要运转一段代码,这段代码称为“发动代码”。
发动代码大部分是由汇编指令构成,它能够完成向量表界说,仓库的初始化,体系变量初始化,中止体系初始化,I/O初始化,外围初始
化,地址重映射等操作。
发动代码与ARM的Boot Block不同,Boot Block是芯片厂家固化在芯片中的,不能对其进行修正,而发动代码是用户增加的。体系上
电后首要运转的是Boot Block,然后才运转发动代码。