S3C2440 clock研究

本文详细介绍了嵌入式系统中的时钟产生机制及控制逻辑,包括PLL锁相环的工作原理及其配置方法,以及如何通过软件控制实现时钟频率的调整。

Clock研究

关键字

PLL锁相环,用于产生高频率时钟,有两种锁相环,MPLLUPLL

MPLL用于对CPU产生高频率的锁相环

UPLL用于对USB设备产生高频率的锁相环

XTIpll外部晶振

EXTCLK外部时钟

OSC振荡器

FCLK CPU系统时钟

HCLK AHB高速总线时钟

PCLK APB外围设备总线时钟

 

  1. Clock框图

  1. 时钟的产生


如上图所示,可以通过设置CPU引脚OM[3:2]选择使用外部时钟EXTCLK或者由外部晶振XTIpll通过OSC产生时钟。

MPLL在复位开始的时候,MPLL输出(Mpll)并没有作为系统时钟,而是使用外部时钟或者外部晶振提供的时钟直接作为系统时钟。只有在MPLLCON寄存器中写入值之后才由MPLL的输出作为系统时钟

 

  1. 时钟控制逻辑


时钟控制逻辑决定使用PLL时钟(Mpll)还是直接使用外部时钟(XTpll或者EXTCLK)。

上图实际上包括了两个过程:上电复位和配置PLL

  • 上电复位

时钟控制逻辑如下:

晶振在若干毫秒内开始震荡(第三行)

OSCXTIpll)时钟稳定后,此时的PLL按照默认配置运行,PLL输出不稳定,使用Fin作为FCLK(第六行)

释放nRESET信号,即nRESET上拉(第二行)

需要说明的是在nRESETCPU的一个引脚,它处于高位的时候,Fin才会向CPU输出频率,也就是说上图在nRESET上拉的时候,CPU才开始工作,如果nRESET处于低位4个时钟周期,并从低电平变为高电平的时候,将会引发CPU复位,在CPU复位的时候,将会有如下操作:

  1. 复制当前PCCPSR的值到R14_svcSPSR_svc

  2. 强制进入管理模式,职位CPSR中的IF位,清楚CPSR中的T

  3. 强制PC开始从0地址取值

  4. ARM状态下恢复执行

 

  • 配置PLL

不论是上电复位还是在普通模式下都可以改变PLL,其时钟控制过程也是相同的。

时钟控制逻辑禁止FCLK,时间长度是一个Lock Time,然后PLL便可以稳定输出(如上图第四行)

 

  1. 锁相环是如何得到高频率的


Mpll = (2*m*Fin)/(p*2s)

其中MpllMPLL的输出频率,mps是三个分频器的值,Fin是输入频率

 

  1. 分频

Clock框图中可以看出,FCLK是供给给Arm920T内核的时钟,HCLK是供给给内存控制器,Nand控制器,LCD控制器等的时钟,PCLK是供给给外部的低速设备控制器的时钟。Mpll输出的频率需要将FCLK分频,供给给HCLKPCLK,这是通过设置CLKDIVNCAMDIVN寄存器来实现的。除此之外,当FCLKHCLK相等的时候,CPU工作在fast bus mode快速总线模式下,当他们不相等的时候,需要将CPU设置为异步总线模式

 

 

  1. 从软件角度看时钟系统

时钟是计算机系统的硬件基础,所有的硬件都是工作在时钟信号之上的,随着高信号和低信号的交替变换,完成一步一步预定的操作。硬件和软件在逻辑上是等效的。从软件角度看,这不就是一个并行系统么?硬件部件可以看做是软件模块,只要有时钟存在,他们就会不停的运作,不论是CPU,内存,LCDUART还是DMA,他们都更随时钟的脚步,当然他们之间也需要有协调和同步的时候,但从逻辑上看,他们不就像是操作系统上不同的进程在运行么?CPU通过寄存器来控制和读取不同硬件的状态,设备通过中断向CPU发出请求,这不都是一种进程间通信的手段么?不同于单CPU操作系统上的多进程实际上是分时系统,这些硬件组成的是真正的并行系统

 

  1. 代码实现:

WTCON EQU 0x53000000 ;看门狗控制寄存器

WTDAT EQU 0x53000004 ;看门狗数据寄存器

LOCKTIME EQU 0x4c000000 ;变频锁定时间寄存器

MPLLCON EQU 0x4c000004 ; MPLL寄存器

CLKDIVN EQU 0x4c000014 ;分频比寄存器

 

AREA CLOCK, CODE, READONLY

ENTRY

start

ldr r0, = 0x53000000 ;看门狗关闭代码

mov r1, #0

str r1, [r0]

 

;bl clock_init ;调用时钟初始化函数

bl led_on ;调用点亮Led函数

 

clock_init ;时钟初始化代码

;设置锁频时间

ldr r0, =LOCKTIME ;取得LOCKTIME寄存器地址

ldr r1, =0x00ffffff ; LOCKTIME寄存器设置数据

str r1, [r0] ;LOCKTIME设置数据写入LOCKTIME寄存器

;设置分频数

ldr r0, =CLKDIVN ;取得CLKDIVN寄存器地址

mov r1, #0x05 ; CLKDIVN寄存器设置数据

str r1, [r0] ;CLKDIVN设置数据写入CLKDIVN寄存器

 

;修改CPU总线模式

mrc p15, 0, r1, c1, c0, 0

orr r1, r1, #0xc0000000

mcr p15, 0, r1, c1, c0, 0

 

ldr r0, =MPLLCON

ldr r1, =0x5c011 ; MPLL is 400MHz

str r1, [r0]

mov pc, lr

 

参考

S3C2440全套中文手册.pdf

深入浅出嵌入式底层软件


基于模拟退火的计算器 在线运行 访问run.bcjh.xyz。 先展示下效果 https://pan.quark.cn/s/cc95c98c3760 参见此仓库。 使用方法(本地安装包) 前往Releases · hjenryin/BCJH-Metropolis下载最新 ,解压后输入游戏内校验码即可使用。 配置厨具 已在2.0.0弃用。 直接使用白菜菊花代码,保留高级厨具,新手池厨具可变。 更改迭代次数 如有需要,可以更改 中39行的数字来设置迭代次数。 本地编译 如果在windows平台,需要使用MSBuild编译,并将 改为ANSI编码。 如有条件,强烈建议这种本地运行(运行可加速、可多次重复)。 在 下运行 ,是游戏中的白菜菊花校验码。 编译、运行: - 在根目录新建 文件夹并 至build - - 使用 (linux) 或 (windows) 运行。 最后在命令行就可以得到输出结果了! (注意顺序)(得到厨师-技法,表示对应新手池厨具) 注:linux下不支持多任务选择 云端编译已在2.0.0弃用。 局限性 已知的问题: - 无法得到最优解! 只能得到一个比较好的解,有助于开阔思路。 - 无法选择菜品数量(默认拉满)。 可能有一定门槛。 (这可能有助于防止这类辅助工具的滥用导致分数膨胀? )(你问我为什么不用其他语言写? python一个晚上就写好了,结果因为有涉及json读写很多类型没法推断,jit用不了,算这个太慢了,所以就用c++写了) 工作原理 采用两层模拟退火来最大化总能量。 第一层为三个厨师,其能量用第二层模拟退火来估计。 也就是说,这套方法理论上也能算厨神(只要能够在非常快的时间内,算出一个厨神面板的得分),但是加上厨神的食材限制工作量有点大……以后再说吧。 (...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值