记录韦东山老师讲课的内容,欢迎各位指正
打开s3c2440芯片手册,看到block diagram(框图),在35页。可以判断有3部分,最上部分是cpu(ARM920T)核心,中间是AHB总线部分,H代表high,是高速总线部分,接在需要高速需要运行的设备,包括sram等内存芯片上;最下部分是APB总线部分,P是priphral.即外设,包括usb、i2c等。这就需要3种时钟,分别供cpu、AHB、APB这几个部分使用。
看34页,可以看到operating frequence,即频率,可得到3个时钟频率:,Fclk供cpu使用,Hclk供AHB总线使用,Pclk供APB总线使用,这样与各总线相连的设备才能有对应的频率;怎样得到这些频率呢?查原理图可知是晶振,但晶振只有12M,使用该频率显然是太慢了,所以需要PLL将晶振频率处理,得到较高频率
OSC即晶振,查原理图可知OM3、OM2都接地,所以值都为0,这样查芯片手册237页可知接入晶振,而不是EXTCLK(外部时钟);传进来的时钟进入UPLL(供usb使用),进入MPLL(M即main)然后通过CLKCONT,分为3个时钟:fclk、
hclk、pclk,hclk是通过HDIVN分频得到的,供AHB总线使用;pclk是通过PDIVN分频得到,供APB总线使用.
要想写出程序得到频率,就得在MPLL、HDIVN、PDIVN上下手,从芯片手册241页Power-On Reset Sequence图上学习,首先是nReset信号,它是低电平有效(因为前面有n),在原理图和芯片手册都可搜索到这个名字。
过程是
(1).nReset在等待电源稳定后输出高电平
(2)此时FCLK是晶振频率为12MHz
(3) 在OM[3:2]latch后,PLL进入locktime,
(4) 之后FCLK有了PLL输出的新频率
由前面可知,UPLLCON是处理usb的pll的,MPLLCON是处理cpu AHB APB设备的pll的;
编程控制时钟,主要是对于CLKCON CLKDIVN寄存器进行控制
下面记录编程目标及过程:
目标:让FCLK运行于400MHz,HCLK运行于100MHz,PCLK运行于50MHz
过程:设置CLKDIVN,让HCLK=FCLK/4 此时要查看CAMDIVN[9]的默认值是否是0,经过搜索查到确实是0
让PCLK = HCLK/2
设置MPLL,查256页的表得,要让输出频率为400MHz,MDIV要设置为92,PDIV要设置为1,SDIV要设置为1
为什么要这样设置?因为查255页的公式可知:m=MDIV+8=100 p=PDIV+2=3 s=SDIV=1;此时Mpll = (2 * m * Fin) / (p * 2的s次方)=2*100*12/3/(2^1)=400,刚好可以
另外,需要注意前面244页的note,即如果HDIVN不为0,需要设置cpu为异步模式,需要加上下面的代码,否则cpu将使用HCLK,即100MHz;这段代码要注意这一行为orr r0,r0,0xC0000000;mrc 中的c是cooperate process(协处理器),r是register,该指令的意思是将协处理器的值读到寄存器中,mcr则刚好相反;原来除cpu之外,还有很多的协处理器
当编程设定PLL后,PLL会立刻进入锁定时间,锁定过后FCLK就达到新的频率,所以异步模式的代码要加在设定PLL的代码之前,否则cpu的频率(Fclk)将是HCLK
先记录到这里,继续我的嵌入式linux征程,加油!