二十九.时钟初始化

1.概念解析:

(1)时钟脉冲信号:由特定的电压幅度以及特定的时间间隔产生的脉冲信号

(2)时钟脉冲频率:单位时间内产生的脉冲个数

(3)信号产生:
A.晶体振荡器:石英晶体经过打磨,加电极,通电,会产生稳定的时钟脉冲。但是如果需要高频率的信号,虽然结构简单,噪声低,但是成本倍增,交货周期长,而且难以获得非标准频率。

B.PLL电路:也需要外部晶振,可改变外部晶体频率。但是占板面积小,可以产生不同频率的时钟信号,可以得到高频信号,成本低

2.时钟体系:主要记住处理器核使用的时钟如何产生及控制,还有所用的外部晶振。

2440:

(1)晶振:12MHZ
(2)几个PLL:MPLL,UPLL
(3)MPLL产生的子时钟:
          FCLK.     HCLK.     PCLK
UPLL产生的子时钟:UCLK

(4)不同子时钟的应用:



6410时钟体系:

晶振也是12MHZ


210时钟体系:

晶振是24MHZ

主系统时钟体系
显示相关时钟
外设设备时钟

3.时钟初始化流程:
(1)配置locktime(通常选择默认)
(2)设置分频系数(比例关系由datasheet的一张表限定,参照uboot的比例关系设定1:4:8)
(3)设置flck
(4)如果fclk不等于hclk,设置cpu到异步工作模式
注意:fclk是处理器核的频率,hclk是总线频率
6410的datasheet关于时钟设置在第三章system  controller

(5)6410流程:多一步选择时钟源,设置异步模式的时候和2440有所不同

(6)210不需要设置到异步模式,但和6410一样需要选择时钟源

(7)EPLL不设置会不会对以后的操作系统有影响???

(8)协处理器访问指令只是操作码改变,后面的操作数顺序不变
但是状态字寄存器指令两样都要变

4.代码编写(6410):
@时钟初始化
#define APLL_LOCK 0x7E00F000
#define CLK_DIV0 0x7E00F020
#define OTHERS 0x7E00F900
#define MPLL_CON 0x7E00F010
#define APLL_CON 0x7E00F00C
#define CLK_SRC 0x7E00F01C


#define ARM_RATIO  	0   						@ARMCLK 	= DOUTAPLL / (ARM_RATIO + 1)  	= 532/(0+1) = 532  MHz
#define MPLL_RATIO	0   						@ DOUTMPLL = MOUTMPLL / (MPLL_RATIO + 1)   = 532/(0+1) = 532  MHz
#define HCLKX2_RATIO 1   						@ HCLKX2 	= HCLKX2IN / (HCLKX2_RATIO + 1) = 532/(1+1) = 266  MHz
#define HCLK_RATIO   1   						@ HCLK 	= HCLKX2   / (HCLK_RATIO + 1)   = 266/(1+1) = 133  MHz
#define PCLK_RATIO   3   						@ PCLK   	= HCLKX2   / (PCLK_RATIO + 1)   = 266/(3+1) = 66.5 MHz

#define DIV_VAL  ((0 << 0)|(0 << 4)|(1 << 8)|(1 << 9)|(3 << 12))	@注意这里不能用#define DIV_VAL (ARM_RATIO) | (MPLL_RATIO << 4) | (HCLK_RATIO << 8) | (HCLKX2_RATIO << 9) | (PCLK_RATIO << 12)
									@原因暂时未查明,不知道是不是我电脑最近鼠标抽风,把字符编码格式改变了导致的结果
clock_init:
	@ 1. 设置各PLL的LOCK_TIME,使用默认值  
	ldr 	r0, 	=APLL_LOCK  						@ APLL_LOCK,供cpu使用 
	ldr 	r1, 	=0x0000FFFF
	str 	r1, 	[r0]
	
	str 	r1, 	[r0, #4]	 						@ MPLL_LOCK,供AHB(存储/中断/lcd等控制器)/APB(看门狗,定时器,SD等)总线上的设备使用 
	str 	r1, 	[r0, #8]	 						@ EPLL_LOCK,供UART,IIS,IIC使用 
	
	@ 2. 设置为异步模式 
	ldr 	r0, 	=OTHERS							@ OTHERS
												@ 《linux installation for u-boot》3.7中:用MPLL作为HCLK和PCLK的Source是异步(ASYNC)模式
												@ 用APLL是同步(SYNC)模式
	ldr 	r1, 	[r0]
	bic r1, r1, #0xc0							@ bit[6:7]清0,即SYNCMODE=0/SYNCMUXSEL=0
	str 	r1, 	[r0]
loop_clock:			
	ldr 	r0, 	=OTHERS
	ldr 	r1, 	[r0]
	and r1, r1, #0xf00					
	cmp 	r1, 	#0
	bne 	loop_clock

	@ 3. 设置分频系数  
	ldr 	r0, 	=CLK_DIV0  						@CLK_DIV0
	ldr 	r1,	=DIV_VAL
	str 	r1, 	[r0]
	
	@ 4. 设置PLL,放大时钟  
	@ 4.1 配置APLL  
#define APLL_CON_VAL  ((1<<31) | (266 << 16) | (3 << 8) | (1))
	ldr 	r0, 	=APLL_CON							@ APLL_CON
	ldr 	r1, 	=APLL_CON_VAL						@ FOUT = MDIV X FIN / (PDIV X 2SDIV) = 266*12/(3*2^1) = 532MHz
	str 	r1, 	[r0]		
	
	@ 4.2 配置MPLL  
#define MPLL_CON_VAL  ((1<<31) | (266 << 16) | (3 << 8) | (1))
	ldr 	r0, 	=MPLL_CON							@ MPLL_CON
	ldr 	r1, 	=MPLL_CON_VAL						@ FOUT = MDIV X FIN / (PDIV X 2SDIV) = 266*12/(3*2^1) = 532MHz
	str 	r1, 	[r0]		

#define MPLL_SEL 1
#define APLL_SEL 1	
	@ 5.选择PLL的输出作为时钟源  
	ldr 	r0, 	=CLK_SRC							@ CLK_SRC
	ldr 	r1, 	=(MPLL_SEL<<1) | (APLL_SEL<<0)
	str 	r1, 	[r0]
	
	mov 	pc, 	lr


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值