先看S3C2440的时钟发生模块的框图
ARM时钟体系(S3C2440)
从左上开始看,可以看出时钟源有两种分别为 :晶振(通过OSC进入)、外部时钟。
通过设置OM3、OM2的引脚可以设置OM[3:2]的状态,来选择时钟源。具体如何设置如下图。
ARM时钟体系(S3C2440)
继续看框图,通过OM的时钟源进入PLL锁相环,通过设置MPLLCON里的P、M、S 的值,可以设置PLL的输出频率(MPLL)。
MPLL直接提供给FCLK, FCLK经过时钟分频控制(CLKDIVN)寄存器,通过HDIVN分频给HCLK,通过PDIVN分频给PCLK。

再看一下启动过程:
ARM时钟体系(S3C2440)
以外部时钟源为晶振为例,具体过程为:
1 上电,先复位。
2 FCLK根据OM[3:2]的值, FCLK=晶振。
3 等待晶振发出时钟稳定之后再释放nRESET,PLL锁存PLLOM[3:2]的值。
4 然后软件配置PLL,然后进入lock time,等待配置完成。此时的FCLK无输出,CPU停止。
5 配置完成,lock time 时间到,然后FCLK输出按照新配置的频率,CPU运行。

编程
目的:使FCLK=400MHz,HCLK=100MHz,PLCK=50MHz
使用时钟源为12MHz的晶振

根据前面分析可得:
1.OM[3:2]的状态设置为00,即OM3 、OM2引脚都接地。
2.然后就是设置locktime
3.MPLLCON寄存器的P、M、S
4.时钟分频控制(CLKDIVN)寄存器的HDIVN、PDIVN

用到的特殊寄存器
ARM时钟体系(S3C2440)
ARM时钟体系(S3C2440)
在数据手册中还有一点需要注意的:
ARM时钟体系(S3C2440)
所以,要配置为异步模式。
设置locktime 为默认值0xffffffff。
MPLLCON寄存器的P、M、S的设置为92、1、1。
时钟分频控制(CLKDIVN)寄存器的HDIVN、PDIVN设置为10、1.

只在汇编的起始文件start.S中设置时钟就可以了
代码如下:

.text
.global	_start

_start:

	/* 关闭看门狗 */
	ldr r0, =0x53000000
	ldr r1, =0
	str r1, [r0]
	
	/* 设置locktime(0x4C000000)为0xffffffff */
	ldr r0, =0x4C000000
	ldr r1, =0xffffffff
	str r1, [r0]
	
	/* 设置CLKDIVN(0x4C000014)为0x5 */
	ldr r0, =0x4C000014
	ldr r1, =0x5
	str r1, [r0]
	
	/* 设置异步模式 */
	mrc p15,0,r0,c1,c0,0
	orr r0,r0,#0xc0000000
	mcr p15,0,r0,c1,c0,0

	/* 设置PLLCON(0x4C000004)的M、P、S */
	ldr r0, =0x4C000004
	ldr r1, =(92<<12)|(1<<4)|(1<<0)
	str r1, [r0]
	
	
	ldr sp, =4096		/* nand 启动 */

	bl main
	
halt:
	b halt

相关文章:

  • 2021-09-21
  • 2021-11-08
  • 2021-05-29
  • 2021-11-14
  • 2021-11-17
  • 2022-01-17
猜你喜欢
  • 2021-07-27
  • 2021-12-16
  • 2021-11-26
  • 2021-05-29
  • 2021-09-01
  • 2021-09-09
  • 2022-02-13
相关资源
相似解决方案