from:第010课_掌握ARM芯片时钟体系

第001节_S3C2440时钟体系结构

S3C2440是System On Chip(SOC),在芯片省不仅仅有CPU,还有一堆外设。

至于有哪些外设,可以查看参考手册。在S3C2440参考手册的第一章PRODUCT OVERVOEW里面有个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,通过HDIVN分频给HCLK,通过PDIVN分频给PCLK,再传给下面的各个设备。

第002节_编程提高运行时钟

怎么编程控制MPLL、HDIV、PDIV,使FCLK=400MHz,HCLK=100MHz,PCLK=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 = :: */
ldr r0, = 0x4C000014
ldr r1,= 0x5
str r1, [r0]

2.现在看如何使FCLK=400MHz。

在手册的PLL VALUE SELECTION TABLE里列出了常见情况PLL的设置,我们输入的晶振的12MHz,输出需要400MHz,因此根据表格需要设置MDIV=92(0x5C),PDIV=1,SDIV=1;

在手册介绍了MPLL的m、p、s与MDIV、PDIV、SDIV之间的关系:

Mpll = ( * m * Fin) / (p * ^S)
m = (MDIV + ), p = (PDIV + ), s = SDIV m=MDIV+=+=
p=PDIV+=
s=SDIV=
MPLL=2x100x12/(3x2^)=400MHz

PLL控制寄存器如下:

因此需要配置  (<<)|(<<)|(<<)

/* 设置MPLLCON(0x4C000004) = (<<)|(<<)|(<<)
* m = MDIV+ = +=
* p = PDIV+ = + =
* s = SDIV =
* FCLK = *m*Fin/(p*^s) = **/(*^)=400M
*/
ldr r0, =0x4C000004
ldr r1, =(<<)|(<<)|(<<)
str r1, [r0]

3. 此外,手册提到,需要SetAsyncBusMode,设置CPU工作于异步模式。

MMU_SetAsyncBusMode
mrc p15,,r0,c1,c0,
orr r0,r0,#R1_nF:OR:R1_iA
mcr p15,,r0,c1,c0,

完整的start.S

.text
.global _start _start: /* 关闭看门狗 */
ldr r0, =0x53000000
ldr r1, =
str r1, [r0] /* 设置MPLL, FCLK : HCLK : PCLK = 400m : 100m : 50m */
/* LOCKTIME(0x4C000000) = 0xFFFFFFFF */
ldr r0, =0x4C000000
ldr r1, =0xFFFFFFFF
str r1, [r0] /* CLKDIVN(0x4C000014) = 0X5, tFCLK:tHCLK:tPCLK = :: */
ldr r0, =0x4C000014
ldr r1, =0x5
str r1, [r0] /* 设置CPU工作于异步模式 */
mrc p15,,r0,c1,c0,
orr r0,r0,#0xc0000000 //R1_nF:OR:R1_iA
mcr p15,,r0,c1,c0, /* 设置MPLLCON(0x4C000004) = (<<)|(<<)|(<<)
* m = MDIV+ = +=
* p = PDIV+ = + =
* s = SDIV =
* FCLK = *m*Fin/(p*^s) = **/(*^)=400M
*/
ldr r0, =0x4C000004
ldr r1, =(<<)|(<<)|(<<)
str r1, [r0] /* 一旦设置PLL, 就会锁定lock time直到PLL输出稳定
* 然后CPU工作于新的频率FCLK
*/ /* 设置内存: sp 栈 */
/* 分辨是nor/nand启动
* 写0到0地址, 再读出来
* 如果得到0, 表示0地址上的内容被修改了, 它对应ram, 这就是nand启动
* 否则就是nor启动
*/
mov r1, #
ldr r0, [r1] /* 读出原来的值备份 */
str r1, [r1] /* ->[] */
ldr r2, [r1] /* r2=[] */
cmp r1, r2 /* r1==r2? 如果相等表示是NAND启动 */
ldr sp, =0x40000000+ /* 先假设是nor启动 */
moveq sp, # /* nand启动 */
streq r0, [r1] /* 恢复原来的值 */ bl main halt:
b halt

第010课_掌握ARM芯片时钟体系的更多相关文章

  1. JZ2440开发板:修改ARM芯片时钟(学习笔记)

    想要修改ARM芯片的时钟,需要去查询芯片手册和原理图,获取相关的信息(见下方图片) 首先来看时钟的结构图 根据结构图可以看出,时钟源有两种选择:1. XTIpll和XTOpll所连接的晶振 2. EX ...

  2. 第008课_第1个ARM落版程序及引申

    form:第008课_第1个ARM裸板程序及引申 第001节_辅线1_硬件知识_LED原理图 当我们学习C语言的时候,我们会写个Hello程序.那当我们下ARM程序,也该有一个简单的程序引领我们入门, ...

  3. 第011课_串口(UART)的使用

    from: 第011课_串口(UART)的使用 第001节_辅线1_硬件知识_UART硬件介绍 1. 串口的硬件介绍 UART的全称是 Universal Asynchronous Receiver ...

  4. 新闻思考-阿里进军游戏产业,苹果发力ARM芯片

    2018.04.03 大家好,这是我开通博客的第一篇文章,我希望在这里分享我的知识,也学习更多的知识,希望大家学习愉快. 阿里进军游戏产业,拿下旅行青蛙的代理权.腾讯一直在进攻阿里的核心业务:电商和支 ...

  5. 常见的嵌入式linux学习和如何选择ARM芯片问答

    常见的ARM嵌入式学习问答,设计者和学习者最关心的11个问题: 1.          ARM嵌入式是学习硬件好还是学习软件好? 2.          嵌入式软件和硬件,哪一种职位待遇更高?或者说, ...

  6. ARM系统时钟初始化

    2440时钟体系,12MHz的晶振 6410时钟体系,12MHz的晶振 210时钟体系,24MHz晶振 时钟初始化:1.设置locktime 2.设置分频系数 4.设置CPU到异步工作模式 3.设置f ...

  7. S3C2440时钟体系

    注:以下内容学习于韦东山老师arm裸机第一期视频教程 一. 2440时钟简介 1.1 2440是一个SOC(system on chip)系统,不仅有很多CPU,还有很多外设,在2440芯片手册有系统 ...

  8. S5PV210 时钟体系分析

    S5PV210 时钟体系 如下面时钟结构图所示,S5PV210 中包含 3 大类时钟域, 分别是主系统时钟域(简称 MSYS).显示相关的时钟域(简称 DSYS). 外围设备的时钟域(简称 PSYS) ...

  9. ARM架构与体系学习(二)——3级流水线

    ARM架构与体系学习(二)——3级流水线 标签: 存储嵌入式汇编c 2012-04-18 00:44 5414人阅读 评论(4) 收藏 举报  分类: ARM7(16)  版权声明:本文为博主原创文章 ...

随机推荐

  1. Fitnesse框架简单介绍

    1.Fitnesse是什么? 官方的说明:FitNesse is a wiki server. It's also a test execution engine. Fitnesse是一个wiki s ...

  2. 实现prim算法

    如下找出该图的最小生成树 prim算法是求解该类问题的一种经典算法 Prim算法的基本思路:将图中的所有的顶点分为两类:树顶点(已经被选入生成树的顶点)和非树顶点(还未被选入生成树的顶点).首先选择任 ...

  3. [Xcode 实际操作]六、媒体与动画-(4)使用CoreImage框架更改图片的色相

    目录:[Swift]Xcode实际操作 本文将演示如何使用CoreImage框架,调整图片的色相. 通过调整图像的色相,使图像产生暖色效果. 在项目导航区,打开视图控制器的代码文件[ViewContr ...

  4. HTML5元素拖放设置总结

    将元素图片放入div盒子内 1.首先设置元素为可拖放:在img标签内加入draggable=”true”. <img draggable="true"> 2.设置元素的 ...

  5. java基础第六篇之常用思想、封装、继承和多态

    a.累加求和思想:求1~100的和,求数组/集合中元素的和,求偶数的数,求总分 int sum=0//循环外部定义sum变量,循环里面对每个元素累加 for (; ; ) { //sum+=数据 } ...

  6. STP-14-MST配置

    在配置MST之前,工程师要进行一定程度的预先规划.首先,必须决定是否应该使用多区域设计,以及如何设置边界.多区域的设计使得每个区域都有独立的MST实例编号.VLAN到实例的映射,以及独立的实例根.整体 ...

  7. echart option属性

    option 图表选项,包含图表实例任何可配置选项: 公共选项 , 组件选项 , 数据选项 名称 描述 {color}backgroundColor 全图默认背景,(详见backgroundColor ...

  8. GPU程序缓存(GPU Program Caching)

    GPU程序缓存 翻译文章: GPU Program Caching 总览 / 为什么 因为有一个沙盒, 每一次加载页面, 我们都会转化, 编译和链接它的GPU着色器. 当然不是每一个页面都需要着色器, ...

  9. 059 Spiral Matrix II 旋转打印矩阵 II

    给出正整数 n,生成正方形矩阵,矩阵元素为 1 到 n2 ,元素按顺时针顺序螺旋排列.例如,给定正整数 n = 3,应返回如下矩阵:[ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6 ...

  10. PHP函数生成随机数

    通常情况下,当我们要生成一个随机字符串时,总是先创建一个字符池,然后用一个循环和mt_rand()或rand()生成php随机数,从字符池中随机选取字符,最后拼凑出需要的长度,代码如下: <?p ...