1. ARM的寄存器架构
ARM共有37个32位的寄存器。其中有31个通用寄存器,6个状态寄存器(1个CPSR和对应另外5种模式下的SPSR)。这些寄存器无法同时访问,具体取决于CPU处于的工作模式。在任何时候,R0-R14,PC,一个或两个状态寄存器都是可访问的,只不过可能映射为不同的物理寄存器。
(ARM的工作模式说明:usr, sys, fiq , irq, svc, abt, und; 其中usr 和sys不属于异常模式)
1.1未备份寄存器
未备份寄存器是指R0-R7。对于未备份寄存器,在所有的工作模式下,寄存器Ri均指向同一个物理寄存器。该类寄存器没有被系统用于特殊用途。
1.2备份寄存器
备份寄存器是指R8-R14。其中对于R8-R12,每个寄存器对应于两个不同的物理寄存器(usr/sysm模式下指向一个,fiq模式下指向另一个)。对于R13-R14,每个寄存器对应于6个不同的物理寄存器。(usr/sys下共用一个,另外5种模式分别对应5种)
1.3程序计数器
理解PC总是指向当前执行指令的+8字节:由于ARM采用流水线的机制(前一条指令进入译码后pc开始移位到下一指令),不管芯片为几级流水,“取指”和“执行”之间总相差两级,故相差两个字长。
理解写入R15(PC)的地址值必须保证bit[1,0]=00:
此处需要先理解下ARM指令的对齐概念:字对齐,半字对齐,和字节对齐。
ARM指令为32位,故其存储时按4字节对齐存储,即指令的地址必须为4的倍数。
统一Thunb指令为16位,存储按2字节存储,其指令的地址须为2的倍数。保证PC的最低两位为0可以保证地址为4的倍数。同理对于Thumb来说,地址末位需为0。这一点在进行PC的相关操作时需特别注意。
1.4程序状态寄存器CPSR( R16 )
CPSR,当前程序状态寄存器,可在任何模式下被访问。异常模式下存在SPSR,备份程序状态寄存器。当异常发生时,用于存放和恢复CPSR。CPSR的高4位为条件标志位,低8位为3个标志位+5个模式选择位。具体各位的含义可参考其他书籍。
2. ARM的GPIO
GPIO意为通用输入输出端口,简单说就是一些引脚,引脚的操作一般有三种:输出高低电平,检测引脚状态,产生中断。S3C2440有130个I/O端口,分为A-J共9组:GPA、GPB、、、、GPJ,可以通过设置寄存器来确定某个引脚用于输入、输出还是特殊功能。
2.1GPxCON
ARM通过寄存器来实现对GPIO的操作,分别是GPxCON,GPxDAT,GPxUP。其中GPACON较为特殊,其每一位对应一根引脚(23根),只能做输出或复用。相应位设置为0时,对应引脚为输出。相应位设置为1时,做地址线或控制线,此时GPADAT失效。GPACON共控制23个引脚,故GPADAT的低23位分别对GPA0-22读写。
其余GPxCON均为每2位控制一引脚,00表示输入,01表示输出,10表示特殊功能,11保留不用。故相应的GPxDAT低16位分别对GPX0-15进行读写。
2.2GPxDAT
用于读写引脚,当引脚被设为输入时,读此寄存器得到对应引脚的电平状态是高还是低;当引脚被设为输出时,写此寄存器相应位可令此引脚输出高低电平。
2.3GPxUP
GPxUP,某位为1时,相应引脚无内部上拉电阻;为1时,相应引脚使用内部上拉电阻上拉电阻、下拉电阻的作用在于,当GPIO引脚出于第三态(非高低电平,而是高阻态,即相当于没接芯片)时,它的电平状态由上拉电阻和下拉电阻确定。
2.4简单的例程
#define GPBCON (*(volatile unsigned long *) 0x56000010)
附对该语句的解释:
首先,0x56000010可以理解为指针,因