历史上的今天
今天是:2025年05月10日(星期六)
2019年05月10日 | ARM时钟体系(S3C2440)
2019-05-10 来源:eefocus
先看S3C2440的时钟发生模块的框图

从左上开始看,可以看出时钟源有两种分别为 :晶振(通过OSC进入)、外部时钟。
通过设置OM3、OM2的引脚可以设置OM[3:2]的状态,来选择时钟源。具体如何设置如下图。

继续看框图,通过OM的时钟源进入PLL锁相环,通过设置MPLLCON里的P、M、S 的值,可以设置PLL的输出频率(MPLL)。
MPLL直接提供给FCLK, FCLK经过时钟分频控制(CLKDIVN)寄存器,通过HDIVN分频给HCLK,通过PDIVN分频给PCLK。
再看一下启动过程:

以外部时钟源为晶振为例,具体过程为:
1 上电,先复位。
2 FCLK根据OM[3:2]的值, FCLK=晶振。
3 等待晶振发出时钟稳定之后再释放nRESET,PLL锁存PLLOM[3:2]的值。
4 然后软件配置PLL,然后进入lock time,等待配置完成。此时的FCLK无输出,CPU停止。
5 配置完成,lock time 时间到,然后FCLK输出按照新配置的频率,CPU运行。
编程
目的:使FCLK=400MHz,HCLK=100MHz,PLCK=50MHz
使用时钟源为12MHz的晶振
根据前面分析可得:
1.OM[3:2]的状态设置为00,即OM3 、OM2引脚都接地。
2.然后就是设置locktime
3.MPLLCON寄存器的P、M、S
4.时钟分频控制(CLKDIVN)寄存器的HDIVN、PDIVN
用到的特殊寄存器


在数据手册中还有一点需要注意的:

所以,要配置为异步模式。
设置locktime 为默认值0xffffffff。
MPLLCON寄存器的P、M、S的设置为92、1、1。
时钟分频控制(CLKDIVN)寄存器的HDIVN、PDIVN设置为10、1.
只在汇编的起始文件start.S中设置时钟就可以了
代码如下:
.text
.global _start
_start:
/* 关闭看门狗 */
ldr r0, =0x53000000
ldr r1, =0
str r1, [r0]
/* 设置locktime(0x4C000000)为0xffffffff */
ldr r0, =0x4C000000
ldr r1, =0xffffffff
str r1, [r0]
/* 设置CLKDIVN(0x4C000014)为0x5 */
ldr r0, =0x4C000014
ldr r1, =0x5
str r1, [r0]
/* 设置异步模式 */
mrc p15,0,r0,c1,c0,0
orr r0,r0,#0xc0000000
mcr p15,0,r0,c1,c0,0
/* 设置PLLCON(0x4C000004)的M、P、S */
ldr r0, =0x4C000004
ldr r1, =(92<<12)|(1<<4)|(1<<0)
str r1, [r0]
ldr sp, =4096 /* nand 启动 */
bl main
halt:
b halt
史海拾趣
|
小弟最近在做嵌入式使用到sqlce,可以不知道如何全用VC++访问Sqlce,从网上看到有人说: SqlCeConnection conn=new SqlCeConnection(); 没想到就这么着一句也会出错,居然是SqlCeConnection未声明; Error &n ...… 查看全部问答> |
|
现象:我们的硬件平台配置是:PXA270+两片Norflsh(intel strata flash 28F256P30B),通过Jflashmm.exe进行烧写,有两块主板烧写出错:一片能读出ID(0x8919),另一片读不对(FFFF)或者(0x0000),都是low part块,是Flash坏了吗 ...… 查看全部问答> |
|
关于局部,全局变量(DS18b02温度传感仿真遇到 的问题) uchar dsreadebyte() { uchar dat; uchar i,j; for (i=0;i>=1; _nop_(); ...… 查看全部问答> |
|
想用MSP-EXP430F5529的三轴加速度传感器检测一个人是否跌倒,但没用过三轴加速度传感器,不知有没有大神能够指导一下这个的用法。… 查看全部问答> |
|
用msp430g2553写了一个捕获程序,但怎么进不了中断呢?请各位指点一下,谢谢! P1DIR |= BIT1; P1SEL |= BIT1; //捕获端口使能 TACCTL1 |= CM_1 + CAP + SCS + CCIE; //配置控制寄存器 TACTL |= TASSEL_2 + MC_2 + TACLR; TACTL &= ~CCIFG; _EINT(); //中断使能 while (1) { …… } ...… 查看全部问答> |




