S3C2440时钟配置「建议收藏」

S3C2440时钟配置「建议收藏」首先来看一下S3C2440的时钟整体框图:CPU工作于FCLKFCLKUPTO400MHZAHB工作于HCLKHCLKUPTO136MHZAPB工作于PCLKPCLKUPTO68MHZ如何得到以上时钟频率(时钟源:12M晶振):通过PLL锁相环可以得到以上3个所需要的时钟S3C2440有两个PLL一个MPLL是提供时钟给CPU用另一个UPLL提…

大家好,又见面了,我是你们的朋友全栈君。

首先来看一下S3C2440的时钟整体框图:

S3C2440时钟配置「建议收藏」

CPU工作于FCLK FCLK UP TO 400MHZ
AHB工作于HCLK HCLK UP TO 136MHZ
APB工作于PCLK PCLK UP TO 68MHZ
S3C2440时钟配置「建议收藏」
如何得到以上时钟频率(时钟源:12M晶振):通过PLL锁相环可以得到以上3个所需要的时钟
S3C2440有两个PLL 一个MPLL是提供时钟给CPU用 另一个UPLL提供时钟给USB设备使用

S3C2440时钟源有两种:1:外部时钟源EXTCLK
2:外部晶振
S3C2440时钟配置「建议收藏」

可通过OM[3:2]引脚进行选择外部时钟模式,通过OM3 OM2引脚电平可以进行选择时钟源。

S3C2440时钟配置「建议收藏」

S3C2440时钟配置「建议收藏」
通过MPLL的得到FCLK提供给CPU
通过HDIVN分频得到HCLK
通过PDIVN分频得到PCLK
通过以上框图可以看出来通过设置寄存器控制MPLL HDIV PDIV便可以来设置时钟频率。
S3C2440时钟配置「建议收藏」
S3C2440时钟配置「建议收藏」

用来设置Lock Time时间

S3C2440时钟配置「建议收藏」

/*设置MPLL FCLK:HCLK:PCLKI=400:100:50*/
/*LOCKTIME(0X4C000000)=0XFFFFFFFF*/
ldr r0,=0x4c000000
ldr r1,=0xffffffff
str r1,[r0]


通过设置CLKDIVN寄存器可以设置HCLK和PCLK的所分频率
/*CLKDIVN(0X4C000014)=0X5,tFCLK:tHCLK:tPCLK=1:4:8*/
ldr r0,=0x4c000014
ldr r1,=0x5
str r1,[r0]

当HDIVN不为0时,需要设置CPU工作于异步模式,否则CPU的工作频率为HCLK所产生的频率
/*设置CPU工作在异步模式*/
mrc p15,0,r0,c1,c0,0
orr r0,r0,#0xc0000000 //R1_nF:OR:R1_iA
mcr p15,0,r0,c1,c0,0
S3C2440时钟配置「建议收藏」

设置MPLL让FCLK输出400M,
M=92
P=1
S=1
通过设置MDIV PDIV SDIV寄存器可设置MPLL
S3C2440时钟配置「建议收藏」

S3C2440时钟配置「建议收藏」

S3C2440时钟配置「建议收藏」

设置FCLK频率为400M
/*设置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
*/
ldr r0,=0x4c000004
ldr r1,=(92<<12)|(1<<4)|(1<<0)
str r1,[r0]



以下为配置S3C2440时钟的汇编代码:

/*设置MPLL FCLK:HCLK:PCLKI=400:100:50*/
/*LOCKTIME(0X4C000000)=0XFFFFFFFF*/
ldr r0,=0x4c000000
ldr r1,=0xffffffff
str r1,[r0]

/*CLKDIVN(0X4C000014)=0X5,tFCLK:tHCLK:tPCLK=1:4:8*/
ldr r0,=0x4c000014
ldr r1,=0x5
str r1,[r0]

/*设置CPU工作在异步模式*/
mrc p15,0,r0,c1,c0,0
orr r0,r0,#0xc0000000 //R1_nF:OR:R1_iA
mcr p15,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
*/
ldr r0,=0x4c000004
ldr r1,=(92<<12)|(1<<4)|(1<<0)
str r1,[r0]

/*一旦设置PLL,就会锁定lock time直到PLL输出稳定
然后CPU工作于新的频率FCLK
*/

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/146229.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月15日 下午4:40
下一篇 2022年5月15日 下午5:00


相关推荐

  • Java volatile作用

    Java volatile作用javavolatile作用

    2022年7月18日
    17
  • hashmap线程不安全问题_什么是线程安全和线程不安全

    hashmap线程不安全问题_什么是线程安全和线程不安全我们都知道HashMap是线程不安全的,在多线程环境中不建议使用,应该使用ConcurrentHashMap,但是其线程不安全体现在什么地方,可能并没有深入理解,本文将对该问题进行解密。

    2022年10月11日
    5
  • sql索引的建立与使用_sqlserver创建索引语句

    sql索引的建立与使用_sqlserver创建索引语句之前在网上看到过很多关于mysql联合索引最左前缀匹配的文章,自以为就了解了其原理,发现遗漏了些东西,这里自己整理一下这方面的内容。1前言SQL索引有两种,聚集索引和非聚集索引聚集索引存储记录是物理上连续存在,而非聚集索引是逻辑上的连续,物理存储并不连续字典的拼音查询法就是聚集索引,字典的部首查询就是一个非聚集索引.聚集索引和非聚集索引的根本区别是表记录的…

    2022年8月30日
    9
  • 102 二叉树层序遍历

    102 二叉树层序遍历层序遍历,每次层的输出是是一个一维数组,整个二叉树的输出结果是二维数组BFS遍历,依托于队列结构,每次在根节点出栈的时候,将其值加在结果列表中,然后将他的左右孩子节点入队列。层序遍历相对于BFS,需要知道每一层有多少个节点。因此,我们需要稍微修改一下代码,在每一层遍历开始前,先记录队列中的结点数量nn(也就是这一层的结点数量),然后一口气处理完这一层的n个结点。classSolution:deflevelOrder(self,root:TreeNode):.

    2022年5月21日
    42
  • java多线程—Thread、Runnable和Callable区别

    多线程编程优点进程之间不能共享内存,但线程之间共享内存非常容易。系统创建线程所分配的资源相对创建进程而言,代价非常小。Java中实现多线程有3种方法:继承Thread类实现Runnable接口实现Callable接口(参考&lt;Java编程思想(第4版)&gt; 21.2.4章节,原来一直以为是2种,后来发现是3种)回到顶部第一种实现方法—继承Thread类继承Thread类,需要覆盖方法r…

    2022年4月7日
    56
  • OSChina 技术周刊第五期 —— 2014 非常好用的开源 Android 测试工具

    OSChina 技术周刊第五期 —— 2014 非常好用的开源 Android 测试工具

    2021年9月1日
    56

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号