2010-09-28 21:40:37
寄存器和工作模式:
7种工作模式:
fiq/irq/abt/und/sys/usr/svc。通过
"MSRcpsr_c,#0xdx"切换。上电时进入
svc模式。
svc和
usr的区别是:
svc可以通过
"MSR cpsr_c,#0xdx"自由切换到其它任何模式,但是
usr不可以。
各模式下有自己的堆栈。要在程序启动后依次进入各个模式分别设置自己的堆栈,最后进入
usr模式。
好多个寄存器:
r0 - r7 (a1 - a4 / v1 - v4),
r15(pc) 在所有模式下都可见。
r8(v5),r9(sb,v6),r10(sl,v7),r11(fp,v8),r12(ip) fiq模式下有一组独立的映射。
r13(sp)/R14(lr) 在
usr和
sys模式下用同一组映射
,其它模式下各有自己的映射。
cpsr在所有模式下可见。
spsr在
usr和
sys模式下没有映射。
cpsr是一个最特殊的寄存器,结构如下:
31 30 29 28 27~8 7 6 5 4 3 2 1 0
N Z C V 保留
I F T M4 M3M2 M1 M0
其中,
N/Z/C/V分别为负
/零
/进位
/溢出的标志位。在所有模式下都可以进行读操作。
I/F为中断
/快中断禁止位,
M4~M0是工作模式控制位,它们在
USR模式下都不可操作。
T为
Thum/ARM模式位,在所有模式下不可直接操作,否则会天下大乱,预取址错误中断可以捕获这种乱局。只能用
BX指令进行
Thum/ARM的状态切换。
总之,
USR模式很不方便。在该模式下只可以通过软中断控制
I/F位。
cpsr只能够用
MSR/MRS指令来操作。
各工作模式下的
spsr: 在由突发事件引起的模式切换发生时,新模式的
spsr自动保存
cpsr的值,以备该模式退出时还原
cpsr。在程序的控制下进入某模式时,
cpsr不会自动保存到相应的
spsr。
Prefetch Abort和
Data Abort模式:
Prefetch Abort通常会发生在自修改指令之后。而
Data Abort发生于向无效内存中取操作数时,通常是数据指针越过边界了。如果在
scatter文件中不指定边界,若编译时内存分配超过了实际物理内存,一定 会有
DataAbort或
Prefetch Abort发生。
对特殊功能寄存器的操作:
通常都有两个寄存器操作同一个特殊功 能。一个是负责置位,另一个是负责清除。如
VICIntEnable和
VICIntEnClr, IOxSET和
IOxCLR等。这样就使得单独操作某一位或某几位变得非常容易,如:
IO0SET = 0x00001100;
IO0CLR
= 0x00000011等,只变动特定的位,而不影响其他位。当然也可以用
IO0PIN = 0x00001100直接设置所有的位。
--------------------------------------------------------------------------------
存储器映射:
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位。
字节定位信号
(BLS0 - BLS3)协调总线宽度和外存芯片数据线宽度。
当
Memory由
“字节宽度器件
”(如
62256)或者
“未按照字节区分的多字节器件
”组成时,应将
RBLE设置为
"0"。此时,读访问时
EMC将
BLS0~BLS3拉高。
当
Memory由
“含有字节选择输入的
16位或
32位器件
”组成时,应将
RBLE设置为
"1"。此时,读访问时
EMC将
BLS0~BLS3拉低。
所以,当
Memory由
62256组成时,由于不需要
“片内字节选择输入
”,故令
RBLE ='0',则
BLS0~BLS3只会与
nWR同步,可以代替
nWR使用。
但是,当
Memory由
IS61LV25616AL组成时,由于该芯片有
"nLB"和
"nUB"控制低
/高
8位的输入,故令
RBLE = '1',则
BLS0~BLS3与
nRD和
nWR都会同步,此时,不可以使用
BLS0~BLS3代替
nWR信号。
地址数据总线:
D0 - D31, A0 - A23, OE, WE, CS0 - CS3, BLS0 -BLS3
启动后由
P2.7/P2.6控制引导方式,然后由程序设置
MEMMAP决定中断向量的映射。
BCFG0 - BCFG3控制读写延时和总线宽度。注意复位后的默认值。
PINSEL2控制引脚功能。
Boot Block
LPC2114/2214 的
BootBlock被固化在最高的
Flash块中,运行时被映射到
0x7FFF,E000 - 0x7FFFF,FFFF的区域。而
LPC2210没有片内
Flash,但它有
8K片内
ROM存储了
BootBlock,也被映射到
0x7FFF,E000处。
--------------------------------------------------------------------------------
VPB只是
ARM内部使用的总线,它通过桥与
AHB总线连接,对用户透明。所以,不必考虑它的存在,只要知道
0xe000 - 0xffff,ffff
是外设控制器的地址就可以了。
--------------------------------------------------------------------------------
VIC:
ARM有
19个中断源,为其分配了
0 - 18号
VIC通道。
向量控制寄存器
VICVectCntl0-15记录了各个通道号及其使能位。
当中断发生时,
VICVectAddr0-15中的一个值会被
copy到
VICVectAddr.
如果是非向量中断则
VICdefaultAddr被
copy到
VICVectAddr.
程序跳转到
VICVectorAddr指向的地址。
中断返回时,写
0x00到
VICVectAddr.
非向量中断是指那些虽然已经打开(允许),但是没有在相应的
VICVectorCntl0~15和
VICVectorAddr0~15中设置的中断。