2416 启动文件

来源:互联网 发布:linux查看软件版本 编辑:程序博客网 时间:2024/06/05 19:28

最近使用ADS 编译了程序,结果再移植到KEIL下,生成的执行程序竟然速度不一样。

我首先想到的是,它们两个的启动程序不一样,可能对时钟的PCLK设置不一样。而时钟一直是我最弱的一块。我想还是理一下,理了忘记,总比没有理过的好。

在这里,跟着赵春江老师写的2440的ads启动文件学习着看。

下面的引用老师的话:启动文件主要是完成了ARM最基本的硬件初始化工作,设置系统时钟,内存,中断向量表,栈等内容。(天,这几块都是我最薄弱的,应该说没有基础的地方)。

在对ARM设计了好几个产品后,再次回来看它的最原始的东西,一定要好好强化才好啊。

首先,看2416 手册,提到的关于PCLK的话都有:

1、工作频率 FCLK可高达400MHZ,HCLK可高达133MHZ,PCLK可高达67MHZ。

2、有一个信号引脚:CLKOUT【1:0】(GPH13 GPH14),时钟输出信号(这时钟输出信号有什么用?)。MISCCR CLKSE(这个是什么寄存器?)寄存器配置MPLL,EPLL,ARMCLK,HCLK,PCLK的时钟输出模式。(这还分好几种时钟输出模式?是指把它们设置成多少时钟的意思么?)

3、PLCKCON 寄存器,地址是0x4C000 0034,复位原始值是:oxffff ffff,也就这个寄存器是占用四个字节34 35 36 37,共32位。PCLK使能寄存器。

2416的系统控制中的一部分就是系统时钟控制。2416的系统时钟控制能产生供给内核ARM926EJ的时钟,几个AHB模块(Advanced high performance bus的缩写,高级高性能总线,是一种系统总线,主要用于高性能模块如CPU DMA DSP等之间的连接)的时钟,APB(advanced peripheral bus 与ARM慢速通信的片上外设总线)模块的时钟。

2416内部两个PLL产生内部时钟。一个用于通用功能模块(比如ARM AHB APB),另一个用于特殊功能模块如USB I2S CAMERA接口等。软件编译控制pll的工作频率,内部时钟源,使能或者不使能一些时钟来控制功耗。

2416典型的工作频率是 ARM 内核 400M,AHB133M, APB 是66M,

2416包括两个片上锁相环,一个是主PLL(MPLL 用于ARM内核?),一个是外部时钟(EPLL 用于外设?)

MPLL产生系统相关时钟。是不是指跟内核一起集成在2416里的,提供时钟?

EPLL产生特殊功能时钟,如USB I2S等,这个是外连的东西,给它们提供时钟?

时钟产生器产生所有内部时钟:ARMCLK 产生ARM内核时钟,HCLK产生AHB(H)时钟,PCLK 产生APB(P)时钟,还有一些其它特殊时钟。 寄存器里的特殊功能寄存器(SFR)的值通过AHP接口配置。


这个是手册上的时钟产生模块框图。

EXTERNAL CRYSTAL (XTI)或者EXTERNAL CLOCK(EXTCLK)通过多路开关选择信号可以选择。

我实际使用的UART 和 ADC 都是使用PCLK进行计算的。而这里显示UARTCLK是由EPLL产生的? 


使用核心板上,提供的晶振是12M 和 48MUSB,而2416手册上显示EPLL产生USB的频率,输入只能输入最多40M,这里加48M晶体不是不一致了么?





如果按照上图,那么我所用到的UART WDT ADC GPIO PWM都使用PCLK. MCLK延伸出PCLK。

同时看博客 http://blog.csdn.net/mullife/article/details/5871564  ,根据启动文件里代码:

; 外部晶振12M,设置MPLL输出为800M,
; MDIV=400,PDIV=3,SDIV=1,Fout=(MDIV*Fin)/(PDIV*2^SDIV)
LDR R1, =(1<<0)+(3<<5)+(400<<14)+(0x0<<24)+(0x0<<25)
STR R1, [R0, #MPLLCON_OFS] 

原来 MPLL是这么来的。然后根据MPLL 再得到ARMCLK HCLK PCLK的话,得操作寄存器CLKDIV0:


启动代码是:

LDR R1, =(0x1<<0)+(1<<2)+(1<<3)+(0x2<<4)+(0x1<<9)
STR R1, [R0, #CLKDIV0_OFS]


结合这个可以得出,HCLK预分频比例是 = (2+1) * (1+1) = 3*2 ,即 800M/6 = 133M

ARMCLK预分频 是  = (0+1)*(1+1) = 2, 即800M/6 = 400M,

然后PCLK = HCLK / 2 = 133M/2 = 67M。







0 0