嵌入式linux——时钟(三)
今天写第一篇,S3C2440的时钟,配置好时钟系统,各个模块才能正常有效的工作,为了了解始终系统,必须要阅读芯片手册,尽量看英文版的,这样还能捎带着增加一下阅读英语计数文档的能力。
概览
在2440数据手册的第7章,时钟和电源管理。硬着头皮往下读。主要阅读时钟控制部分,从手册可以知道,CPU用FCLK,AHB总线设备用HCLK,APB总线设备用PCLK。
时钟的架构和选择
2440的主时钟源可以是外接的晶振,亦可以是外部的时钟源,有一个叫PLL锁相环的东西,他可以产生需要的高时钟源。根据实际的情况选择合适的方式,通过OM[3:2]可以选择时钟源。有个注意事项,在软件配置好MPLLCON寄存器时候,系统的时钟源才是我们想要的,并不是一上电或者复位就是按照我们设定的时钟源工作,他需要一个准备的时间,在准备好之前都是按照外接晶振或者外部的时钟源频率工作的,准备好了才能正常工作。接下来会看到这样一个图,这是2440时钟体系图,从这个图里面可以大致知道从一上电接入外部的晶振后都做了什么,我们才能得到想要的时钟频率。
从图中可以看出大致过程:
1. 设置OM[3:2]两位,选择合适的时钟源。有的开发板,就是用的外接晶振做时钟源,所以干脆把OM2和OM3接接到了GND低电平(OM23是两根引脚)。这里我也一用外部晶振为例来说
2. 上一步选择完了时钟源的来源,就得到了MPLLin,就是外接的晶振频率,然后经过一个叫MPLL的东西,是配置一个寄存器,P、M、S位。然后得到Mpll。
3. Mpll在经过CLKCNTL就得到了FCLK,这个是CPU的频率,分了两条线一条是直接发出去,另一条是通过HDIVN和PDIVN两个步骤在发出去,一直到下边可以看到,其实到了这里就是配置好了FCLK、HCLK、PCLK三个频率,现在CPU、AHB总线设备、APB总线设备需要的频率都有了,大家都可以正常工作了。
4. 有以下公式:
Mpll = (2*m * Fin) / (p * 2^s)
m = M (the value for divider M)+ 8, p = P (the value for divider P) + 2
说的是Mpll的数值确定公式,Fin是输入的频率,就是外接晶振的频率,然后就要设置M、P的值了,第2步,配置某个寄存器完成设置P、M、S。这个后面再说。
接下来就是更加的细致的结构图了,这里看看就行。,然后会看到这样一个图,完整的描述了上电之后时钟部分所发生的事情。
这个图要会看,上电之后,晶振就起振,但是频率并不是用户自己设定的,中间还需要一个时间缓冲,给一点时间才能正常的工作。然后一定要注意,仔细阅读NOTE部分的内容,这里
1. CLKDIVN should be set carefully not to exceed the limit of HCLK and PCLK.
2. If HDIVN is not 0, the CPU bus mode has to be changed from the fast bus mode to the asynchronous
bus mode using following instructions(S3C2440 does not support synchronous bus mode).
MMU_SetAsyncBusMode
mrc p15,0,r0,c1,c0,0
orr r0,r0,#R1_nF:OR:R1_iA
mcr p15,0,r0,c1,c0,0
If HDIVN is not 0 and the CPU bus mode is the fast bus mode, the CPU will operate by the HCLK.
This feature can be used to change the CPU frequency as a half or more without affecting the HCLK
and PCLK.
这个就很重要了,说的是HDIVN不是0的话,CPU的总线模式从快总线变为异步总线不支持同步总线,百度一下哈HDIVN不是0,而且是快总线模式,CPU会被HCLK操作,这个特点能够改变CPU频率,嗯。
After setting PMS value, it is required to set CLKDIVN register. The value set for CLKDIVN will be valid after PLL lock time.这里说的其实就是上面提到的PMS,就是图中要经过的几个方框,配置一些寄存器。了解了这么些东西就可以区配置寄存器了。下面挨个寄存器介绍一下。
1. LOCK TIME COUNT REGISTER (LOCKTIME) :取最大值就行了,绝对安全。
2. PLL CONTROL REGISTER (MPLLCON & UPLLCON) :MPLL这个寄存器和输入输出频率有关,手册里有图。
3. CLOCK CONTROL REGISTER:各种外设使能
4. CLOCK SLOW CONTROL (CLKSLOW) REGISTER :
5. CLOCK DIVIDER CONTROL (CLKDIVN) REGISTER:分频相关的,上面确定了输出,即FCLK披绿,这里要分频出PCLK和HCLK
6. CAMERA CLOCK DIVIDER (CAMDIVN) REGISTER :貌似没用到这个
到此整个时钟就设置完了,其中涉及到了一些计算,很简单的,对应着把这些都计算出来就可以了,然后填入寄存器中。
刚才写了设置CPU频率的程序,为了对比,把之前写的C语言点亮led的程序,进行了扩展,增加了延时函数,让工作在外部晶振12M时,led闪烁。代码如下
void delay(void)
{
int i = 0XFFFF;
while(i--)
;
}
int main()
{
unsigned int *pGPFCON = (unsigned int *)0x56000050;
unsigned int *pGPFDAT = (unsigned int *)0x56000054; *pGPFCON = 0x100;
*pGPFDAT |= (<<); // off
while()
{
*pGPFDAT &= ~(<<); // & 0 on
delay();
*pGPFDAT |= (<<); // off
delay();
}
return ; }
然后然后再汇编程序中,写设置频率的代码,如下
.text
.global _start
_start: /* 设置时钟 */
/* 外部晶振12M,FCLK-400M,HCLK-100M,PCLK-50M */ /* 1. LOCKTIME 0x4C000000 0xFFFFFFFF */
ldr r0, = 0x4C000000
ldr r1, = 0xFFFFFFFF
str r1, [r0] /* 2. MPLLCON 0x4C000004 (1<<0)|(1<<4)|(92<<12)
* F:H:P = 400:100:50*/
ldr r0, = 0x4C000004
ldr r1, = (<<)|(<<)|(<<)
str r1, [r0] /* 3. 设置CPU工作于异步模式 */
mrc p15,,r0,c1,c0,
orr r0,r0,#0xc0000000 //R1_nF:OR:R1_iA
mcr p15,,r0,c1,c0, /* 4. CLKDIVN 0x4C000014 0x5 */
/*CAMDIVN 0x4C000018 0*/
ldr r0, =0x4C000018
ldr r1, =
str r1, [r0] ldr r0, =0x4C000014
ldr r1, =0x5
str r1, [r0] ldr sp ,= bl main halt:
b halt
把这段代码烧到板子后,可以看到,小灯闪烁的更加的快了,因为频率有12M提高到了50M。但是我之前是没有加协处理器指令,让CPU工作在异步模式,led闪烁确实快了,但是我不知道为什么,手册里面说,要这么设置,我没这么设置,看着也是成功的,但是还是要按照手册里面的做,加上协处理器指令,还有一个问题,我写的代码设置各个寄存器的顺序和例程不一样(视频看了很久了,这次是自己回忆着, 并且看手册各个寄存器说明做的)不知道有没有问题。不管怎么样现在的现象是实现了,先记录一下。接下来有问题的话,再回来找
嵌入式linux——时钟(三)的更多相关文章
- 嵌入式Linux学习笔记(三) 字符型设备驱动--LED的驱动开发
在成功构建了一个能够运行在开发板平台的系统后,下一步就要正式开始应用的开发(这里前提是有一定的C语言基础,对ARM体系的软/硬件,这部分有疑问可能要参考其它教程),根据需求仔细分解任务,可以发现包含的 ...
- 嵌入式Linux开发板
嵌入式Linux开发板开发介绍: iTOP-4412嵌入式Linux开发板搭载三星Exynos四核处理器,配备1GB内存,4GB固态硬盘EMMC存储,独家配备三星S5M8767电源管理,配备Andro ...
- 嵌入式Linux C笔试题积累(转)
http://blog.csdn.net/h_armony/article/details/6764811 1. 嵌入式系统中断服务子程序(ISR) 中断是嵌入式系统中重要的组成部分,这导致了很 ...
- 作为一个新人,怎样学习嵌入式Linux,(韦东山)
很早以前在网上看到的韦东山老师写的文章,复制到自己的博客,方便自己以后看. 在学习嵌入式Linux之前,肯定要有C语言基础.汇编基础有没有无所谓(就那么几条汇编指令,用到了一看就会). C语言要学到什 ...
- 作为一个新人,如何学习嵌入式Linux?
作为一个新人.如何学习嵌入式Linux?我一直在问太多次,特写文章来回答这个问题. 在学习嵌入式Linux之前.肯定要有C语言基础.汇编基础有没有无所谓(就那么几条汇编指令,用到了一看就会).C语言要 ...
- 嵌入式系统基础知识(一): 系统结构和嵌入式Linux
目录 一. 嵌入式体系结构 二. 开发过程中的分工 三. 嵌入式软件体系结构 四. 嵌入式Linux 一. 嵌入式体系结构 <嵌入式系统设计师教程>这本书的前三章脉络很清晰, 按照嵌入式系 ...
- 作为一个新人,怎样学习嵌入式Linux
作为一个新人,怎样学习嵌入式Linux?被问过太多次,特写这篇文章来回答一下. 在学习嵌入式Linux之前,肯定要有C语言基础.汇编基础有没有无所谓(就那么几条汇编指令,用到了一看就会). C语言要学 ...
- 嵌入式Linux学习(一)
嵌入式系统 嵌入式系统是一种专用的计算机系统,作为装置或设备的一部分.通常,嵌入式系统是一个控制程序存储在ROM中的嵌入式处理器控制板.事实上,所有带有数字接口的设备,如手表.微波炉.录像机.汽车等, ...
- (转)作为一个新人,怎样学习嵌入式Linux?(韦东山)
被问过太多次,特写这篇文章来回答一下. 在学习嵌入式Linux之前,肯定要有C语言基础.汇编基础有没有无所谓(就那么几条汇编指令,用到了一看就会).C语言要学到什么程度呢?越熟当然越好,不熟的话也 ...
随机推荐
- 使用DHCP动态管理主机地址
- vue中父组件给子组件额外添加参数
1 子组件: this.$emit('callbackone',item.parentId) 2 父组件: @callbackone="callbackone($event,index)&q ...
- docker应用实例——httpd
docker可以用来创建虚拟环境跑应用,各个应用能起到隔离作用. 步骤也很简单,就是获取(下拉镜像)应用,然后进行安装就可以了 1.搜索镜像,比如我想虚拟一个httpd应用,可以看到,有httpd这个 ...
- MySQL Hardware--CentOS 6修改CPU性能模式
cpufrequtils命令 ## 安装: yum install cpufrequtils ## 查看CPU信息: cpufreq-info -m 输出CPU信息为: analyzing CPU : ...
- oracle错误汇总2
http://blog.itpub.net/30430420/viewspace-1799925/ ============================= 现象!!!!!!!!!!!!!!!!!S ...
- django中form页面刷新后自动提交的解决方案
如果一个页面包含了form,同时这个form中的提交按钮是type=submit的input的时候,你刷新该页面,就会有弹窗提示是否重新提交表单,这个特性不胜其烦,常见解决方法有两个: 第一种是前端的 ...
- vue.js安装过程(npm安装)
一.开发环境 vue推荐开发环境: Node.js: JavaScript运行环境(runtime),不同系统直接运行各种编程语言 npm: Nodejs下的包管理器. webpack: 它主要的用途 ...
- bpmn-js起步
https://blog.csdn.net/u013253924/article/details/85784002 通过本文逐步熟悉bpmn-js. 快速介绍: bpmn.js是一个BPMN2.0渲染 ...
- 黄聪:C#使用GeckoFx拦截监控Http数据
找了整整两天,在大海捞针之后,终于在上古代码中找到了一个可用的.... 可以用喜极而泣来形容测试有效之后的心情!!! 跟cefsharp相比geckofx最大的优点就是模式更接近于IE,包括node. ...
- IDEA编译时出现 Information:java: javacTask: 源发行版 1.8 需要目标发行版 1.8
错误如下 检查下面几个地方设置是否一致... 1.Project Structure下(File->Project Structure...) Sources选项卡->Languate l ...