s3c2440 裸机 系统时钟和定时器的设置

发布者:DazzlingSmile最新更新时间:2019-04-26 来源: eefocus关键字:s3c2440吗  系统时钟  定时器 手机看文章 扫描二维码
随时随地手机看文章

⑴系统时钟原理分析


时钟决定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();//中断服务函数初始化


 


}

关键字:s3c2440吗  系统时钟  定时器 引用地址:s3c2440 裸机 系统时钟和定时器的设置

上一篇:S3C2440裸机实战 之一 创建初始工程
下一篇:S3C2440交叉编译环境搭建

推荐阅读最新更新时间:2024-11-02 09:18

PIC16F877A单片机 (中断与定时器Timer0)
1 基本原理 2 实现代码 主要根据FIGURE 5-1 和中断的逻辑框图来编写代码,这样代码的可读性强,也便于理解。但有些寄存器在框图中可能没有说明,所以也需要仔细阅读定时器0的官方文档,即基本原理部分。 /*----------------函数功能: 中断 定时器0 --------------------------*/ #include pic.h // 调用PIC16f87XA单片机的头文件 //#include delay.h //调用延时子函数 __CONFIG(0xFF32);//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关 //__CONFIG(HS&WDTDI
[单片机]
PIC16F877A单片机 (中断与<font color='red'>定时器</font>Timer0)
STM32外部中断及定时器编程示例
/*======================================================================================== *名 称: main.c *功 能: *入口 参数: *说 明: *范 例: *编者 时 间: *========================================================================================*/ #include stm32f10x.h #include 12864.h ErrorStatus HSEStartUp
[单片机]
单片机定时器-遥控器解码程序分析
一、前言 利用STC公司1T内核的STC12C08S2 单片机对一款遥控器进行解码,将解码的数据转换为以us为单位的时间通过单片机串口通讯发送到STC下载软件自带的串口调试工具接收框进行显示。 本文主要对测试结果进行展示与分析并对单片机控制程序进行分析,以此起到抛砖引玉的作用,希望读者理解程序以后可以利用单片机对身边的任意一款遥控器进行解码并将遥控器与单片机的实际应用联系在一起。 二、测试结果展示 1、实验材料介绍 实验材料硬件部分 软件部分 为KEIL V2 编程软件 和 单片机程序下载软件STC_ISP_V479 为了高效率学习程序编写,本实验平台采用单片机教程网的51hei-5单片机开发
[单片机]
单片机<font color='red'>定时器</font>-遥控器解码程序分析
按键驱动--定时器消抖
驱动源码: #include linux/module.h #include linux/kernel.h #include linux/fs.h #include linux/init.h #include linux/delay.h #include linux/irq.h #include asm/uaccess.h #include asm/irq.h #include asm/io.h #include asm/arch/regs-gpio.h #include asm/hardware.h #include linux/poll.h int major = 0; static struct
[单片机]
单片机学习心得1:89c51单片机定时器应用!
定时器的应用涉及到中断方面的知识,可以先了解中断的概念再来看定时器 如,一个16位的定时器,它所能计数的范围是0~65535,如果单片机采用的是12M的晶振,那么定时器单次最长的时间为65535((1/12)12),因为一个一个机器周期等于12个振荡周期,那么定时器加一所用的时间是1/12M*12是1us,也就是一个12MHz晶振的51单片机单次最长时间约为65ms. 定时器的控制 89c51的定时器由两个寄存器控制,分别是工作模式寄存器TMOD和控制寄存器TCON 工作模式寄存器TMOD是用于控制定时器0/1的工作模式,通过对TMOD进行赋值,则可以改变定时器的工作模式 具体各位的定义如下 当我们使用定时器功能时,就只
[单片机]
单片机学习心得1:89c51单片机<font color='red'>定时器</font>应用!
ATMEGA128定时器1的使用
//环境:winavr+avr studio char temp=0; ISR(TIMER1_COMPA_vect )//中断函数 { // user code here temp++; if (temp==10) temp=0; PORTA=temp; DDRA=0xff; } void mytimer_init(void) { //关总中断 cli(); //TCCR1A为配置引脚输出模式,这里取默认为0,未连接即可,因此不需要为其赋值 //T/C1时钟源选择为clk/64,CLK现为内部晶振4MHZ,因此时钟为4,000,000/64 HZ = 62500 HZ TCCR1B &= ~
[单片机]
用555定时器设计一个自由多谐振荡器
要求 振荡 周期T=1~10S,选择电阻、电容参数,并画出连线图。 解 电路如图9-4所示,其振荡周期C)RR(.T21270+=。如果选择 所以可变电位器的阻值范围为 Ω=−=K~)S~(R11711270101 故选择Ω=KR12即可。最小振荡周期
[工业控制]
用555<font color='red'>定时器</font>设计一个自由多谐振荡器
lesson3 数码管静态显示及定时器和中断应用
1、电容帮助晶振起振。 2、发光二极管LED(Light Emitting Diode),液晶LCD(Liquid Crystal Display)。 3、数码管原理: 4、中断系统:中断发生——中断响应和中断服务——中断返回。(中断嵌套) 5、优点:1.分时操作;2.实时响应;3.可靠性高。 6、80C51单片机的中断优先级有三条原则:CPU同时接收到几个中断时,首先响应优先级别最高的中断请求。 正在进行的中断过程不能被新的同级或低优先级的中断请求所中断。 正在进行的低优先级中断服务,能被高优先级中断请求所中断。 为了实现上述后两条原则,中断系统内部设有两个用户不能寻址的优先级状态触发器。其中一个置1,表示正在响应高优先级的
[单片机]
lesson3 数码管静态显示及<font color='red'>定时器</font>和中断应用
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved