历史上的今天
返回首页

历史上的今天

今天是:2025年04月26日(星期六)

2019年04月26日 | s3c2440 裸机 系统时钟和定时器的设置

2019-04-26 来源:eefocus

⑴系统时钟原理分析


时钟决定2440执行速度,2440可以使用外部提供的时钟源,也可以使用外部的晶振然后通过内部的晶振获得时钟频率;具体选择使用哪一个时钟源看下图:



开发板一般吧引脚M2和M3连接的GND,所以说全部使用的是晶振(crystal)


除此之外,2440提供了3个时钟源FCLK(用于cpu核),HCLK(advancedhigh performance bus,用于AHB总线设备,比如cpu核,dma,usb等),PCLK(advanced performance bus,用于外围设备,比如看门狗,pwm定时器,adc等等),对于锁相环,2440拥有两种PLL其中一个为UPLL,其专用于usb设备,还有一个是MPLL用于设置fclk,hclk,pclk。


假如不设置PLL此时FCLK为Fin 也就是外部晶振为12M。


设置PLL后,就是设置相应的寄存器来得到所需要的值,S3C2440使用了三个倍频因子MDIV、PDIV和SDIV来设置倍频,通过寄存器MPLLCON和UPLLCON可设置倍频因子。其中MPLLCON寄存器用于设置处理器内核时钟主频FCLK,其输入输出频率间的关系为


  FCLK=MPLL=(2*m*Fin)/(p*2^s)


其中m=(MDIV+8), p=(PDIV+2), s=SDIV。


其中UPLLCON寄存器用于产生48MHz或96MHz,提供USB时钟(UCLK),其输入输出频率间的关系为


UCLK=UPLL=(m *Fin) / (p * 2^s)


其中m=(MDIV+8), p=(PDIV+2), s=SDIV。


上面的MPLLCON和UPLLCON与MDIV,PDIV,SDIV的关系为:



也就PLLCON的01位是SDIV,4-9位是PDIV,12-19位MDIV。


为了方便,2440的芯片手册给出了参考设置PLL的数值:



假设晶振为12M,可以参考上图的蓝色加深部分的设置数值。上图的48M和96M是设置UPLLCLK使用的。


通过表可以完成FCLK的设置,正如前面所说的,除了FCLK还有HCLK和PCLK需要设置,接下来就可以设置HCLK和PCLK,此时需要两个寄存器:


对于CLKDIVN


通过此寄存器可以得到相应的HCLK和PCLK。但是由于在设置HDIVN(也就是CLKDIVN的1、2位)的时候需要用到CAMDIVN的第8位和第9位,CAMDIVN寄存器为:



结合在上面的这两个寄存器可以得到频率。通过上面的两个表格可以得到四个值:HDIVN ,PDIVN,HCLK3_HALF和 HCLK4_HALF,为了方面描述它们的关系,可以参考表:


 


下手册的后面有对时钟的如下注释:



这是说假如HDIVN不是0的话要加上:


mrcp15,0,r0,c1,c0,0

orr r0,r0,#R1_nF:OR:R1_iA

mcr p15,0,r0,c1,c0,0


 


通过上面的设置可以完成设置FCLK、HCLK、PCLK,实际上2440在设置时钟前后的运行状态是这样的:(下面再给出设置MPLL的过程图(UPLL类似))


 


 


 


通过上图可以看到,在上电一段是时间后,等待nRESET信号(复位信号)恢复高电平后,然后可以执行PLL有关寄存器的操作了。其中OSC为晶振的频率大小为12M,VCO为输出频率。还可以看到在设置完PLL需要等待一段时间才可以输出设定频率,这个等待时间是可以通过LOCKTIME寄存器来设置,这个时间是需要满足一定的最小值的,使用默认值就可以。该寄存器说明见下图:


 


总结:


设置时钟相对来说比较简单,这里给出的其设置流程:


1、  设置cpu由新的时钟频率到旧的频率下的间隔时间 设置LOCKTIME(默认值即可)


2、  设置FCLK、HCLK、PCLK频率比例,可以通过设置寄存器CLKDIVN 辅助CAMDIVN


3、  /* 如果CLKDIVN 中的HDIVN非0,CPU的总线模式应该从“fast bus mode”变为“asynchronousbus mode” */


_asm__(


 "mrc    p15, 0, r1, c1, c0,0n"        /* 读出控制寄存器 */


 "orr    r1, r1,#0xc0000000n"          /* 设置为“asynchronous bus mode” */


 "mcr   p15, 0, r1, c1, c0, 0n"       /* 写入控制寄存器 */


 );


4、  根据个人要求设置FCLK时钟 可以通过设置MPLLCON来设置


5、  假如有需要,设置UCLK时钟,可以通过设置UPLLCON来设置


 


测试设定代码:


void mpll_init(void )


{


//1、      设置cpu由新的时钟频率到旧的频率下的间隔时间设置LOCKTIME(默认值即可)


 


//2、      设置FCLK、HCLK、PCLK频率比例,可以通过设置寄存器CLKDIVN  CAMDIVN


//若设置FCLK为400M HCLK=100M   PCLK=50M


//hdivn=2  pdivn=1


rCLKDIVN |= (2<<1) | 1;


rCAMDIVN &=~(1<<9);


 


//3、       /*如果CLKDIVN中的HDIVN非0,CPU的总线模式应该从“fast bus mode”变为“asynchronous bus mode” */


__asm{


  mrc    p15, 0, r1, c1, c0, 0      /* 读出控制寄存器 */


  orr    r1, r1, #0xc0000000          /* 设置为“asynchronous bus mode” */


  mcr    p15, 0, r1, c1, c0, 0        /* 写入控制寄存器 */


 };


 


//  MMU_SetAsyncBusMode();


 


//4、      根据个人要求设置FCLK时钟可以通过设置MPLLCON来设置


 // FCLK=MPLL=(2*m*Fin)/(p*2^s)


 // 其中m=(MDIV+8), p=(PDIV+2), s=SDIV


 // MDIV=0X5C PDIV=1  SDIV=1  FCLK=400M


 //


rMPLLCON=((0x5c<<12) | (1<<4) | 1);


 


//5、      假如有需要,设置UCLK时钟,可以通过设置UPLLCON来设置


}


 


⑵定时器原理分析


s3c2440拥有Timer0,1,2,3,4五个16位定时器,其中Timer0,1,2,3具有Pulse Width Modulation (PWM)功能,Timer4引脚没有输出,Timer0比较特殊,拥有适用于大电流的死区生成器。


定时器0 和1 共享一个8 位的预分频器(预定标器),定时器2,3,4 共享另一个8 位预分频器,其构造图如图所示:


可以看出,定时器的时钟源为PCLK,首先经过预分频器降低频率后,进入第二个分频.可以生成5 种不同的分频信号(1/2,1/4,1/8,1/16 和外部时钟TCLK0、TCLK1。


这两个预分频器可以使用TCFG0寄存器来设置,其功能如图:


可以看到,TCFG0的0-7位设置分频器0,用来控制定时器0和定时器1,8到15位用来设置预分频器1,用来控制定时器2、3、4。其频率的计算公式就是:


定时器的时钟频率 = PCLK / {prescaler value+1 } /{divider value}


prescaler value的大小就是上面的寄存器设置每个8位大小是0到255 ,divider value的大小通过TCFG1来设置可以取值2、4、8、16,看下图:


 


通过上面两个寄存器设置完时钟之后,就可以来控制定时器了,包括是否打开定时器,定时器的时间等等。


首先,需要看到的是TCON,用来控制定时器的打开与关闭,是否自动重新装入初值:




通过上表可实现对5个定时器的控制,其中在人工装入定时器值的时候需要注意,每次重新写入初值的时候需要清零后再写。以timer3为例,介绍一下每一位作用:


Timer 3 auto reload on/off   这是说定时器是是否自动载入定时时间,或者定时器是否是周期性的。


Timer 3 output inverter on/off 这是说是否开启反转模式,开通与否的效果为:



Timer 3 manualupdate该为设置为1是手工把数据装入TCNTB3 & TCMPB3(下面会介绍这两个寄存器)。


Timer 3 start/stop 打开或者关系定时器3.


在打开定时器之前,还需要给定时器装入初值,以确定定时器触发的时间,这里需要两个寄存器:TCMPBn,TCNTBn,这里以定时器0为例,接扫一下,先看寄存器介绍:


 

通过上表可以看出,TCMPBn用来设置比较值,TCNTBn用来设置初值。设定好这两个寄存器后,定时器就会在规定的频率下,TCNTBn开始减去1计数,直到减小到TCMPBn设定的比较值,此时可以通过读取TCNTOn来观察TCNTBn的值。


 


使用定时器设置如下:


1、  选定timer0-5定时器,设置预分频器 TCFG0  和分频器TCFG1


2、  给定时器设定定时时间,也就是给TCNTB0装入初值 和 装入TCMPBn寄存器比较器(默认0)


3、  设置定时时间载入方式及其打开定时器 使用寄存器TCON  


定时器设置参考代码:


/*


void timer0_init()


{


 


//1、选定timer0-5定时器,设置预分频器TCFG0 和分频器TCFG1


    //定时器的时钟频率 = PCLK / {prescaler value+1 } / {divider value}


// PCLK=50m    {prescaler value+1} / {divider value}


   rTCFG0 &= ~(0xFF) ;


     rTCFG0 |= 99 ;  //预分频系数为99


     rTCFG1 &= ~(0xf);


     rTCFG1 |= 0x03;  //16分频


    


     //定时器的时钟频率=50000000/100/16=31250


//2、     给定时器设定定时时间,也就是给TCNTB0装入初值和装入TCMPBn寄存器比较器(默认0)


 


     rTCNTB0=31250;//每秒一次


//TCMPBn取默认值0


 


//3、     设置定时时间载入方式及其打开定时器使用寄存器TCON


     rTCON |=  (1 << 1) ; //将TCNTB0和TCMPB0装入内部的TCNT0和TCMP0


     rTCON &=~(0xf);


     rTCON |= 0x09 ;  //自动重载并且打开定时器0


    


    


     rINTMSK&=~(1<<10);//打开定时器0 中断


     timer0_service_Init();//中断服务函数初始化


 


}

推荐阅读

史海拾趣

D3公司的发展小趣事

D3公司始终将产品质量放在首位。公司建立了严格的质量管理体系,从原材料采购到产品生产、检验,每一个环节都严格把控。这种对品质的执着追求,使得D3公司的产品在市场上赢得了良好的口碑。同时,公司还注重售后服务,为消费者提供全方位的支持和保障。这种以品质为核心的发展策略,让D3公司在电子行业中树立了良好的品牌形象。

厦门法拉(faratronic)公司的发展小趣事

FMI公司始终坚持以客户为中心的发展理念,致力于为客户提供定制化的频率控制解决方案。公司拥有一支专业的研发团队和完善的生产流程,能够根据客户的具体需求进行产品设计和生产。无论是标准产品还是定制产品,FMI都能确保高质量和快速交付。这种灵活的服务模式使得FMI在客户中树立了良好的口碑,并为公司赢得了更多的商业合作机会。

DB Lectro Inc公司的发展小趣事

随着公司业务的不断拓展和市场竞争的加剧,DB Lectro Inc意识到知识产权保护的重要性。公司加强了知识产权的申请和保护工作,成功申请了一系列技术专利。同时,公司还积极参与知识产权维权行动,维护了自身的合法权益和公平竞争的市场环境。

Datakey Electronics公司的发展小趣事

在环境问题日益严重的今天,绿色环保已经成为电子产品行业的重要发展趋势。Datakey Electronics积极响应国家号召,致力于绿色产品的研发和生产。公司投入巨资研发环保材料和生产工艺,成功推出了一系列符合环保标准的产品。这些产品不仅满足了客户的需求,还为公司赢得了良好的社会声誉。

Glow-Lite Corp公司的发展小趣事

随着全球化进程的加速,Datakey Electronics意识到单靠国内市场已经无法满足公司的长远发展需求。于是,公司积极寻求国际合作机会,与国际知名企业建立战略合作伙伴关系,共同开发新产品、开拓新市场。通过国际合作,Datakey Electronics不仅提高了自身的技术水平和产品竞争力,还成功将产品推向了国际市场。

Andigilog公司的发展小趣事

随着全球化进程的加速,Datakey Electronics意识到单靠国内市场已经无法满足公司的长远发展需求。于是,公司积极寻求国际合作机会,与国际知名企业建立战略合作伙伴关系,共同开发新产品、开拓新市场。通过国际合作,Datakey Electronics不仅提高了自身的技术水平和产品竞争力,还成功将产品推向了国际市场。

问答坊 | AI 解惑

无线远程视频监控系统

本帖最后由 jameswangsynnex 于 2015-3-3 19:57 编辑 上海慧坤数码科技有限公司地处上海市闸北区,是一家研发代理销售远程网络视频监控系统的企业.公司已经自主研发出单路与多路微波无线视频和CDMA无线视频监控服务器产品,最多支持4路无线信道同 ...…

查看全部问答>

用mini2440做了一个控制LED屏的项目

用mini2440做了一个控制LED的项目,用板子自带的wince5系统,VB编程实现,.NET 2.0 优酷有真相: http://player.youku.com/player.php/sid/XMTE3NzQyMDc2/v.swf…

查看全部问答>

如何知道PPP协商了哪些LCP选项

PPP协议中LCP协商的时候,具体协商哪些选项呢?我有个PPP-2.4.1-10的源码,不知道在什么地方可以找到协商了哪些配置选项. 在etc.ppp下面的options里,只有“lock”,在没有其他的 ppp-2.4.1-10   .........\\Changes-2.3    ...…

查看全部问答>

FIFO 没到 alarm 如何接收

我设置一个FIFO 当接收的数据大于FIFO 就用事件的方式通知上层来取数据。但如果 当FIFO接收的数据长度少于aralm 的数据时,如何通知任务来取出数据,不用polling。大家有什么好办法?…

查看全部问答>

零基础学单片机视频教程——02讲 并行端口仿真实例

零基础学单片机视频教程——02讲  并行端口仿真实例     本讲演示了标准51系列单片机并行I/O端口的使用,程序实现了并行I/O端口的读操作和写操作。其中,演示了一个完整程序的创建,同时还演示了并行端口的仿真操作。通过本 ...…

查看全部问答>

求:MN103s仿真器的实现

现在我要做MN103s仿真器的实现的毕业设计了,有没有高手知道相关的内容,给些相关的资料,感觉网上基本找不到相关的东西!谢谢…

查看全部问答>

莫名奇妙的故障,估计没人见过

无缘无故重启(没有任何提示),有时还自动关机,还开不了,只有拔掉电源线,按两次开机按键,然后再插上电源线再开机才行,有时打开某个文件夹也会自动重启(应该不是病毒引起的),为此我删除了很多文件,晕死!有时打开某个程序也会重启,有要能 ...…

查看全部问答>

同步器问题

1. 从一个Clock domain往另一个Clock domain传数据, 中间使用了用两个flipflop连在一起做的synchronizer,  可是实际destination接收到的数据可能是错误的,比如 4bit data1000 传过去, 实际收到的是1001 , 这个问题怎么解决?2. 是从快 ...…

查看全部问答>

3分钟教你学会软件解密

3分钟教你学会软件解密      下面谈到了一些在学习解密过程中经常遇到的问题,本人根据自己的经验简单给大家谈一谈。这些问题对于初学者来说常常是很需要搞明白的,根据我自己的学习经历,如果你直接照着很多解密教 ...…

查看全部问答>