嵌入式学习笔记之2440时钟

2440是system on chip(SOC),芯片上除了CPU还会有其他外设:

  • 现在介绍他的时钟:

      下面是他的是时钟发生器的框图:

      时钟控制逻辑给整个芯片提供三种时钟

           FCLK: 用于cpu核

           HCLK: 用于AHB总线上的设备,比如cpu核,存储控制器,中断控制器,lcd控制器,dma和usb主机模块等

           PCLK:  用于APB总线上的设备,比如iic,pwm定时器,gpio,adc,uart,spi等

           俩个总线:

           AHB: 主要用于高性能模块,cpu,dma,dsp之间的连接

           APB: 主要用于低宽带的周边外设的连接,例如uart,iic等

 

时钟产生图:

   

上图是上面三个时钟产生的示意图,主要是有外部晶振产生12MHz的频率(晶振频率很低,主要是为零降低电磁干扰,降低板间布线的要求),经过OM寄存器其作为时钟源,经过PLL(锁相环)倍频产生FCLK,HCLK,PCLK,然后通过分配器传给各个设备。

      PLL有俩种,UPLL主要用于USB设备 MPLL用于设置FCLK,HCLK,PCLK设置方法相似

 

FCLK时钟启动时序如下:

上电时,PLL没被启动,FCLK即等于外部输入的时钟,称为Fin,若要提高系统时钟,则需要软件启动PLL

寄存器设置

      现在通过设置寄存器使FCLK=400MHZ HCLK=100MHZ PCLK=50MHZ

  • LOCKTIME主要设置locktime的时间长短,这里可以按照芯片手册的默认值来给

 

  • CLKDIVN

控制几个频率的比例

HCLK=FCLK/4, àCLKDIVN[2:1]=10; CAMDIVN[9]默认为0

      由于HDIVN非0;CPU总线模式由 fast bus mode 变为 异步模式,这里按照芯片手册提供的程序即可

PCLK=HCLK/2, àCLKDIVN[0] = 1

  • MPLLCON

设置锁相环

设置寄存器MPLLCON

      芯片手册里列举的几个常见的PLL设置

      我们的输入的晶振为12MHZ,FCLK输出为400MHZ

      于是MPLLCON = (92<<12)|(1<<4)|(1<<0);

      当然也可以根据提供的计算算式算出FCLK

     

      Fin = 12Mhz;  m = 92+8=100;  p = 1+2=3; s = 1;à输出400Mhz

具体程序如下:


.text
.global _start

_start:
	/* 关闭看门狗-WTCON-bit[5]=0 */
	ldr r0, =0x53000000
	ldr r1, =0
	str r1,[r0]

	/* 设置MPLL
	 * 设置锁定时间
	 * LOCKTIME(0X4C000000)-0XFFFFFFFF 
	 */
	 ldr r0, =0x4c000000
	 ldr r1, =0xffffffff
	 str r1, [r0]

	 /* 设置分频比
	  * CLKDIVN(0X4C000014)-0X5, 
	  * tFCLK:tHCLK:tPCLK = 1:4:8,
	  */
	  ldr r0, =0x4c000014
	  ldr r1, =0x5
	  str r1, [r0]

	  /* 设置CPU工作于异步模式(手册要求)*/
	  mrc p15,0,r0,c1,c0,0
	  orr r0,r0,#0xc0000000 //R1_nF:OR:R1_iA
	  mcr p15,0,r0,c1,c0,0

	 /* 设置MPLLCON(0x4c000004)-(92<<12)|(1<<4)|(1<<0)
	  * MPLL = (2*m*Fin)/(p*2^s),
	  * m = (MDIV+8); p = (PDIV+2); s = SDIV,Fin = 12M 
	  * m = 100, p = 3, s = 1
	  */
	  ldr r0, =0x4c000004
	  ldr r1, =(92<<12)|(1<<4)|(1<<0)
	  str r1, [r0]
	  /* 一旦设置PLL,就锁定locktime,直到pll输出稳定,然后cpu工作于新的fclk频率   */
	  
	
	/* 设置内存:sp栈 */
	/* 分辨是nor/nand启动
	 * 写0到0地址,再读出来
	 * 如果得到0,表示0地址上的内容被修改了,它对应sdram,这就是nand启动
	 * 否则就是nor启动;nor启动时,0地址在norflash中,0地址数据这样是改不了的
	 */
	mov r1, #0

	ldr r0,[r1] /* 先用r1保存原来0地址上的数据 */

	str r1, [r1]/* 将0写到0地址中 */
	ldr r2, [r1]/* 然后将0地址上的数据保存到r2中 */

	cmp r1, r2 /* 若相等则修改成功,则是nand启动 */

	ldr sp, =0x40000000+4096
	
	moveq sp, #4096 /* 若上面cmp相等则执行下面后面带eq的语句 */
	streq r0,[r1] /* eq--相等 */

	

	bl main

halt:
		b halt


		 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值