尊旭网
当前位置: 尊旭网 > 知识 >

s3c2440

时间:2024-08-19 11:55:55 编辑:阿旭

S3C2440如何设置系统时钟

S3C2440 CPU主频可达400MHz,开发板上的外接晶振为12M,通过时钟控制逻辑的PLL(锁相环电路)来倍频这个系统时钟。 SC2440上有两个PLL,分别是MPLL,UPLL,UPLL专用于USB设备,常用频率为48MHz和96MHz;MPLL用于设置FCLK、HCLK、PLCK。 上电时,PLL并没有被启动,FCLK=Fin=12MHz,若要提高系统时钟,需要软件来启动PLL。下面我们介绍一下如何启动MPLL? 我们一般在程序的开头首先设置MPLL等几个寄存器,设置好之后需要等待一段时间(此时CPU停振),这段时间我们称为Lock Time(由我们自己设定,一般使用默认值),Lock Time过后,FCLK的输出才稳定,系统时钟就提高到你所先要的频率啦。下面是LOCKTIME的默认参数:那么我们该怎么设置MPLL呢?有什么公式可以参考呢? 通过在片内集成的锁相环:MPLL可对输入的Fin=12MHz的晶振频率进行倍频。S3C2440使用了三个倍频因子MDIV、PDIV和SDIV来设置倍频,通过寄存器MPLLCON设置倍频因子。其中MPLLCON寄存器用于设置处理器内核时钟主频FCLK,其输入输出频率间的关系为 : FCLK=MPLL=(2*m*Fin)/(p*2^s) 其中m=(MDIV+8), p=(PDIV+2), s=SDIV。 所以我们只要去设置PLLCON里面的MDIV、PDIV、SDIV就相当于设置好了MPLLCON。假如我们想让FCLK=400MHz,那么这三个参数该如何取值呢? 从上面这个图上我们可以发现,三星公司建议的一些经典的参数值,我们看到当Input Frequency取12MHz的时候,Output Frequency输出405MHz(接近400MHz),此时MDIV取0X7F,PDIV取0X02,SDIV取0x1。 从上面这个图我们可以发现,MDIV、PDIV、SDIV这三个倍频因子,分别位于MPLLCON寄存器的[19:12],[9:4],[1:0],配合上面的经典值。 即rMPLLCON = (0x7f<<12)|(2<<4)|(1<<0); 这样FCLK=400MHz就设置好啦。 除了FCLK我们还经常用到HCLK、PCLK这二个时钟,我们该如何由FCLK获得这二个时钟频率呢,那就是通过CLKDIVN和CAMDIVN分频寄存器的设置啦。 从上面二个图中我们可以发现,如果我们想要FCLK:HCLK:PCLK=1:4:8的话,若主频FLCK是400MHz,如果按照1:4:8的设置,可以先设置CLKDIVN为0101,然后设置CAMDIVN的第9位为0(不设置的时候该位默认为0),此时HLCK是100MHz,PLCK是50MHz。—————————————————————————————————————— 我们的系统时钟设置就讲解完毕了。


嵌入式系统中创建任务问题

局部变量是编译器自动放在栈里面的。
函数调用过程中会自动压栈,调用返回时自动出栈,这个过程是编译器做的,你写一个简单的函数调用程序然后看他的反汇编源码就会理解这点。
上面是一个任务的情形,你能看到"栈指针“的作用。
而多个任务的话就要各自有一个栈的空间,向你定义的栈空间里保存内容是嵌入式操作系统做的事,看RTOS源码就能理解。任务切换时就是把系统的栈指针指回到各自的栈空间在调度之前的位置,这样现场就被还原了,看起来其他任务好像没执行过一样。


关于清除S3C2440中断标志位的疑问

SRCPND寄存器每一位的置位与INTMSK寄存器中的屏蔽位是否置1无关,是由中断源自动置位的,但要清除该位,即将该位清零,是需要手动操作的。
这个寄存器清零的方法就是向指定位写1,芯片就是这么设置的,你再要问只能去三星问芯片开发者为什么要这么设计了,这样的寄存器你也无法手动置位触发中断啊,本来就用不到这样的功能,你再深究下去就是钻牛角尖了