一篇读懂s3c2440(s3c2440处理器)
想设置PCLK = FCLK/8需要将PDIVN设置为1,因此整个CLKDIVN寄存器设置如下:/* CLKDIVN = 0X5,tFCLK:t
ARM裸机1期加强版视频课程配套WiKi第10课_掌握ARM芯片时钟体系第001节_S3C2440时钟体系结构S3C2440是System On Chip(SOC),在芯片上不仅仅有CPU还有一堆外设至于有哪些外设,可以查看S3C2440芯片手册的第一章PRODUCT OVERVIEW里面有个BLOCK DIAGRAM图:。
可以把该图分为上中下三块,上面的是与CPU密切相关的,工作于FCLK;中间的一些对性能要求较高的设备,比如LCD显示、相机等,在AHB BUS,H即为High,高速之意,工作于HCLK;下面的是一些对性能要求不那么高的低速设备,在APB BUS,P即为Peripheral之意,工作在PCLK。
在芯片手册的特性里介绍了S3C2440的工作频率,FCLK最高400MHz,HCLK最高136MHz,PCLK最高68MHz那么如何得到以上的三种时钟?硬件电路上有个12M的晶振,作为时钟源产生12MHz的频率,经过SOC的PLL(锁相环)倍频产生FCLK、HCLK、PCLK。
再具体阅读第7章的时钟,在Clock Generator Block Diagram展示了时钟的产生。
在该图的左上角,晶振和一个外部时钟接在一个选择器上,这个选择器通过OM[3:2]的值决定选择哪个时钟源然后生成的MPLL(Main PLL)和UPLL(USB PLL),MPLL直接提供给FCLK,FCLK通过HDIVN分频给HCLK,HCLK通过PDIVN分频给PCLK,再传给下面的各个设备:。
第002节_编程提高运行时钟怎么编程控制MPLL、HDIV、PDIV,使FCLK=400MHz,HCLK=100MHz,PLCK=50MHz?需要设置MPLLCON的FCLK = 400MHz,设置CLKDIVN的HCLK = FCLK/4,PCLK = FCLK/8。
1. 首先来看CLKDIVN寄存器:
从上图可知,想设置HCLK = FCLK/4需要将HDIVN[2:1]设置为10,同时将CAMDIVN[9]设置为0 查看CAMDIVN[9]的初始值默认就是0,因此只需要设置HDIVN[2:1]为10。
想设置PCLK = FCLK/8需要将PDIVN[0]设置为1,因此整个CLKDIVN寄存器设置如下:/*CLKDIVN(0x4C000014) = 0X5,tFCLK:tHCLK:tPCLK = 1:4:8 */
ldrr0,=0x4C000014ldrr1,=0x5strr1,[r0]2. 现在来看如何使FCLK=400MHz.在手册的PLL VALUE SELECTION TABLE里列出了常见情况PLL的设置,JZ2440输入的晶振频率是12MHz,输出需要400MHz,因此根据表格需要设置 MDIV = 92(0x5C),PDIV = 1,SDIV = 1;
s3c2440手册介绍了MPLL的m、p、s与MDIV、PDIV、SDIV之间的关系:Mpll = (2 * m * Fin) / (p * 2^S) m = (MDIV + 8), p = (PDIV +
2), s = SDIV m = MDIV+8 = 92+8 =100p = PDIV+2 =3s = SDIV = 1MPLL= 2x100x12/(3x2^1) = 400MHzPLL控制寄存器如下:
因此需要配置MPLLCON =(92<<12)|(1<<4)|(1<<0)配置代码如下:/*设置MPLLCON(0x4C000004)=(92<<12)|(1<<4)|(1<<0)*m=MDIV+8=92
+8=100*p=PDIV+2=1+2=3*s=SDIV=1*FCLK=2*m*Fin/(p*2^s)=2*100*12/(3*2^1)=400M*/ldrr0,=0x4C000004ldrr1,=(92<<12)|(1<<4)|(1<<0)
strr1,[r0]3. 此外,手册还提到,需要SetAsyncBusModeMMU_SetAsyncBusMode mrc p15 ,0 ,r0 ,c1, c0,0 orr r0,r0, #R1_nF:OR:R1_iA 。
mcr p15 ,0 ,r0,c1,c0,0完整的启动代码start.S如下:.text.global_start_start: /*关闭看门狗 */ldrr0, = 0x53000000ldr
r1,=0strr1,[r0]/*设置MPLL, FCLK : HCLK :PCLK = 400m : 100m : 50m *//*LOCKTIME(0x4C000000) = 0xFFFFFFFF */
ldrr0,=0x4C000000ldrr1,=0xFFFFFFFFstrr1,[r0]/*CLKDIVN(0x4C000014) = 0X5, tFCLK:tHCLK:tPCLK = 1:4:8 */
ldrr0,=0x4C000014ldrr1,=0x5strr1,[r0]/*设置CPU工作于异步模式 */mrcp15,0,r0,c1,c0,0orrr0,r0,#0xc0000000//R1_nF:OR:R1_iA
mcrp15,0,r0,c1,c0,0/*设置MPLLCON(0x4C000004) =(92<<12)|(1<<4)|(1<<0)*m = MDIV+8 = 92+8=100*p = PDIV+2 = 1+2 = 3
*s = SDIV = 1*FCLK = 2*m*Fin/(p*2^s) =2*100*12/(3*2^1)=400M*/ldrr0, = 0x4C000004ldrr1, = (92<<12)|(1<<4)|(1<<0)
strr1, [r0]/*一旦设置PLL, 就会锁定lock time直到PLL输出稳定*然后CPU工作于新的频率FCLK*//*设置内存: sp 栈 *//*分辨是nor/nand启动*写0到0地址, 再读出来
*如果得到0, 表示0地址上的内容被修改了, 它对应ram, 这就是nand启动*否则就是nor启动*/movr1,#0ldrr0,[r1] /* 读出原来的值备份 */strr1,[r1] /* 0->[0] */
ldrr2,[r1] /* r2=[0] */cmpr1,r2 /* r1==r2? 如果相等表示是NAND启动 */ldrsp,=0x40000000+4096/* 先假设是nor启动 */moveq
sp, #4096 /* nand启动 */streqr0, [r1] /* 恢复原来的值 */blmainhalt: bhaltPS: 由于篇幅限制,这里未给出全部代码,要做实验前往评论区自行下载相关代码:
了解更多
- 标签:
- 编辑:李松一
- 相关文章
-
硬核推荐asp 源码(asp 源码下载)
也被称为经典ASP,是在1998年作为微软的第一个服务器端脚本引擎推出的。ASP是一种使得网页中的脚本在因特网服务器上被执行的技术。…
-
干货满满nec芯片(nec芯片起什么作用)
电源管理芯片是在电子设备系统中担负起对电能的变换、分配、检测及其他电能管理的职责的芯片,主要负责识别CPU供电幅值。…
- 太疯狂了arm 嵌入式(arm嵌入式开发)
- 这都可以微型核电池(微型核电池多少钱一个)
- 不看后悔protel99se安装(protel99se安装包)
- 不看后悔八奇珍匣断案(天刀八奇珍匣断案)
- 这样也行?电容式触摸屏结构(电容式触摸屏结构与原理)