S3C2440学习笔记一(系统频率以及一些入门级问题)
时间:08-10
来源:互联网
点击:
①MPLL和UPLL有何不同?
对于MPLL使用到MPLLCON,而UPLL使用到UPLLCON寄存器,同属于时钟电源管理单元。MPLLCON地址是0X4C000004,UPLL地址是0X4C000008。MPLL用于CPU及其他外围器件,这里把他理解成单片机的主频就对了,UPLL用于USB。产生FCLK,HCLK,PCLK三种频率。
CLKdivN时钟分配控制寄存器,地址是0X4C000014,对FCLK分频给UCLK,PCLK,不分频或2分频,CAMdivN照相机时钟分配寄存器,地址是0X4C000018,也是做一个时钟分配。
②2440slib.s中出现mrc,bic,mcr,MOV_PC_LR是什么意思,有什么资料学习和研究?
前面三条是属于嵌入式汇编指令,
MRC 指令的格式为:MRC{条件} 协处理器编码,协处理器操作码1,目的寄存器,源寄存器1,源寄存器2,协处理器操作码2。
MRC 指令用于将协处理器寄存器中的数据传送到ARM 处理器寄存器中,若协处理器不能成功完成操作,则产生未定义指令异常。其中协处理器操作码1和协处理器操作码2 为协处理器将要执行的操作,目的寄存器为ARM 处理器的寄存器,源寄存器1 和源寄存器2 均为协处理器的寄存器。
指令示例:
MRC P3 , 3 , R0 , C4 , C5 , 6 ;该指令将协处理器 P3 的寄存器中的数据传送到 ARM 处理器寄存器中.
MCR 指令的格式为: MCR{条件} 协处理器编码,协处理器操作码1,源寄存器,目的寄存器1,目的寄存器2,协处理器操作码2。
MCR 指令用于将ARM 处理器寄存器中的数据传送到协处理器寄存器中,若协处理器不能成功完成操作,则产生未定义指令异常。其中协处理器操作码1 和协处理器操作码2为协处理器将要执行的操作,源寄存器为ARM 处理器的寄存器,目的寄存器1 和目的寄存器2 均为协处理器的寄存器。
指令示例:
MCR P3 , 3 , R0 , C4 , C5 , 6 ;该指令将 ARM 处理器寄存器 R0 中的数据传送到协处理器 P3 的寄存器 C4 和 C5 中。
CP15寄存器图概述
CP15定义了16个寄存器。CP15的寄存器图如下表所示
a.在位置0可以访问两个寄存器。具体访问哪一个寄存器取决于第二个操作码的值。
b.分指令寄存器和数据寄存器
Unpredictable(UNP):从这个地方读出的值可以是任意的
Should be zero(SBZ):往这个地方写入的时候,这个域的所有位都应该清0
只能在特权模式下使用MRC和MCR指令访问CP15的寄存器。MCR和MRC的指令位模式如下:
它们的汇编代码为:MCR/MRC{cond} p15,opcode_1,Rd,CRn,CRm,opcode_2
cond是条件码,bit20是L位,如果L=1就表示Load,从外面读到CPU核中,也就是MRC指令,如果L=0就表示Store,也就是MCR指令。[11:8]这四个位是协处理器编号,CP15编号是15,因此是4个1。CRn是CP15寄存器编号,Rd是CPU核寄存器编号,各占4位。对于CP15协处理器,规定opcod1应该为0,opcode2和CRm是指令的选项,具体含义取决于不同的寄存器。
寄存器0,ID编码寄存器
这是一个用于返回设备ID编码的只读寄存器
你可以通过将opcode2设置为除1以外的值来访问CP15的ID编码寄存器R0(CRm此时应置为0)。例如:
MRC p15,0,Rd,c0,c0,0
;返回ID寄存器的值
寄存器0,缓存类型寄存器
这是一个只读寄存器,它包含了缓存的架构和大小的信息,这就允许操作系统来确定要如何执行诸如清理缓存和锁定缓存的操作。所有ARMv4T版本及以后的带缓存处理器都包含这个寄存器,允许实时操作系统的厂商生产他们的操作系统的试验版本。
你可以通过将opcode_2设置为1来访问CP15的缓存类型寄存器R0。如:
MRC p15,0,Rd,c0,c0,1
;返回关于缓存的详细信息
还有一个bic是清除指令,BIC―――――位清除指令指令格式:
BIC{cond}{S} Rd,Rn,operand2
BIC指令将Rn 的值与操作数operand2 的反码按位逻辑”与”,结果存放到目的寄存器Rd中。指令示例:BIC R0,R0,#0x0F ;将R0最低4位清零,其余位不变。
最后还有一个MOV_PC_LR,这个是用于子程序返回,代码分析(这是自己在总结,将别人的东西通过归纳整理和分析):
MACRO //这个是宏定义的关键字
MOV_PC_LR //作用是子程序返回
[ THUMBCODE
bx lr //当目标程序是Thumb时,就要用BX跳转返回,并转换模式
|
mov pc,lr //目标程序是ARM指令集,直接把lr赋给pc就可以了,是直接处理的(这个要查THUMB指令集)。
]
MEND //宏定义的结束标志
③Main函数带了两个参数,有何不同,分别有什么用?
int Main(int argc, char **argv);这个语句是常用的程序开始接口函数,前面的int表示返回的类型,至于Main是经过启动引导的一个标记,可以对应的修改。至于里面的两个参数,argc的值表示后面argv数组传递了几个参数,可以使argv[0]、argv[1]...。
- 便携式应用中的有源电源管理(11-07)
- 基于AT89S51的多功能电子密码锁设计(01-17)
- 便携式电子产品低功耗电路的设计技巧和分析(04-25)
- 微处理器的电源管理方案(08-16)
- 五种降低未来IC功耗的技术(04-02)
- 多核处理器将如何改变电源管理?(11-19)