1. 7种工作模式:
fiq/irq/abt/und/sys/usr/svc。通过"MSR cpsr_c,#0xdx"切换。上电时进入svc模式。svc和usr的区别是:svc可以通过"MSR cpsr_c,#0xdx"自由切换到其它任何模式,但是usr不可以。各模式下有自己的堆栈。要在程序启动后依次进入各个模式分别设置自己的堆栈,最后进入usr模式。
2. Prefetch Abort和Data Abort模式:
Prefetch Abort通常会发生在自修改指令之后。而Data Abort发生于向无效内存中取操作数时,通常是数据指针越过边界了。如果在scatter文件中不指定边界,若编译时内存分配超过了实际物理内存,一定会有Data Abort或Prefetch Abort发生。 Data Abort这个异常会经常出现,要注意。
3. 存储器映射:
0
-1G
(0x0000,0000 - 0x3fff,ffff): 片内Flash.
1
-2G
(0x4000,0000 - 0x7fff,ffff): 片内RAM.
2
-3.5G
(0x8000,0000 - 0xbfff,ffff - 0xdfff,ffff): 片外存储器。
3.5G
-
3.75G
(0xe000,0000 - 0xefff,ffff): VPB外设。
3.75G
-
4G
(0xf000,0000 - 0xffff,ffff): AHB外设。
虽然ARM7的寻址空间为
4G
,但是LPC2200系列只提供A0~A23总共
16M
的地址。片选信号CS0 - CS3是A24和A25的译码输出,将片外存储区0x8000,0000 - 0x83ff,ffff划分为bank0 - bank3,共
16M
*4=
64M
. 这4个bank可以被分别配置为
8/16/32
位总线宽度。复位时,bank0的总线宽度由Boot1:0引脚决定, bank1为32位,bank2为16位,bank3为8位。
4. Boot Block
LPC2114/2214的BootBlock被固化在最高的Flash块中,运行时被映射到0x7FFF,E000 - 0x7FFFF,FFFF的区域。而LPC2210没有片内Flash,但它有8K片内ROM存储了BootBlock,也被映射到0x7FFF,E000处。BootBlock是上电以后芯片最早自动运行的程序,被固化在LPC22XX中,相当于LPC22xx自身的bootloader。
5. 分散加载描述文件.scf的设置
Metrowerks Code Warrior V1.2的"Edit->Debug In ExRAM Settings",然后在"Linker->ARM Linker"的Output页中,选中Scatter选项。在Scatter的编辑框中选择写好的.scf文件。(Scatter-Loading description file).
简单应用时可以不写.scf文件。而在"Output"页中选择"Simple".然后填写"RO Base"和"RW Base"的起始地址。在"Lay Out"页中,填写Object/Symble: Startup.o, Section: Start.编写启动文件:Startup.s.在"Option"页里的"Image Entry Point"填入起始地址。
在Scatter文件中最好每一个Region都加一个Maximum参数,这样当编译时如果实际使用的空间大于Maximum Size,会有Error:16220E: Excution region xxx size (xxx bytes) exceeds limit (xx bytes)。如果地址有重复,会有Error: 16221E: Excution region xxx overlaps with excution region xxx。前一个Region的首地址 + Maximum > 后一个Region的首地址时不一定有Error。只有当一分配的内存出现覆盖时才会有Error。
mem_c.scf,是使程序在FLASH运行
mem_a.scf,使程序在FLASH运行,并且加密。
mem_b.scf,使程序在RAM中运行
6. LPC2106/2105/2104 将ARM7TDMI-S 配置为小端(little-endian)字节顺序。
7. LPC2131基于ARM7TDMI-S核,采用冯.诺依曼结构,数据和指令混合编址,只有加载,存储和交换指令可以访问存储器中的数据。