arm9 s440处理器的定时器原理.docx

上传人:b****8 文档编号:10877433 上传时间:2023-02-23 格式:DOCX 页数:15 大小:1.51MB
下载 相关 举报
arm9 s440处理器的定时器原理.docx_第1页
第1页 / 共15页
arm9 s440处理器的定时器原理.docx_第2页
第2页 / 共15页
arm9 s440处理器的定时器原理.docx_第3页
第3页 / 共15页
arm9 s440处理器的定时器原理.docx_第4页
第4页 / 共15页
arm9 s440处理器的定时器原理.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

arm9 s440处理器的定时器原理.docx

《arm9 s440处理器的定时器原理.docx》由会员分享,可在线阅读,更多相关《arm9 s440处理器的定时器原理.docx(15页珍藏版)》请在冰豆网上搜索。

arm9 s440处理器的定时器原理.docx

arm9s440处理器的定时器原理

一、定时器的工作原理

 在前面实验中,程序需要延时,我们是利用空循环语句来实现。

这种方法的延时简单,但不是很精确。

当需要精确延时时,就不能采用这种方法了。

一般是利用定时器来实现。

定时器的工作原理是在输入时钟MCLK的作用下,采用倒计时方式对减1计数器预先编程设置的计数初始值不断减1,减到0时一次定时过程结束。

所产生的定时时间等于计数初值乘以MCLK时钟周期。

二、S3C2440的时钟源

  在讲解之前,先介绍一下s3c2440时钟系统。

一般来说,MCU的主时钟源主要是外部晶振或外部时钟,而用的最多的是外部晶振。

在正确情况下,系统内所使用的时钟都是外部时钟源经过一定的处理得到的。

由于外部时钟源的频率一般不能满足系统所需要的高频条件,所以往往需要PLL(锁相环)进行倍频处理。

在s3c2440中,有2个不同的PLL,一个是MPLL,另一个是UPLL。

  UPLL是给USB提供48MHz。

在这里,我们主要介绍MPLL。

外部时钟源经过MPLL处理后能够得到三个不同的系统时钟:

FCLK、HCLK和PCLK。

    ♥ FCLK是主频时钟,400MHz,用于ARM920T内核;

    ♥ HCLK用于AHB总线设备,100MHz,如ARM920T,内存控制,中断控制,LCD控制,DMA以及USB主模块;

    ♥ PCLK用于APB总线设备,50MHz,如外围设备的看门狗,IIS,I2C,PWM,MMC接口,ADC,UART,GPIO,RTC以及SPI。

  这三个系统时钟(FCLK、HCLK和PCLK)是有一定的比例关系,这种关系是通过寄存器CLKDIVN中的HDIVN位和PDIVN位来控制的,因此我们只要知道了FCLK,再通过这两位的控制,就能确定HCLK和PCLK。

  而FCLK是如何得到的呢?

它是通过输入时钟(即外部时钟源)的频率,经过一个计算公式得到的,这个计算公式还需要三个参数(MDIV、PDIV、SDIV),而这三个参数是经过寄存器MPLLCON配置得到的。

假如我们想让FCLK=400MHz,那么这三个参数该如何取值呢?

MDIV=92PDIV=1SDIV=1

经过下面的计算得出:

m=(MDIV+8)=92+8=100

p=(PDIV+2)=1+2=3

s=SDIV=1

FCLK=(2*m*Fin)/(p*2s)=(2*100*12)/(3*2)=400M

从上面这个图我们可以发现,MDIV、PDIV、SDIV这三个倍频因子,分别位于MPLLCON寄存器的[19:

12],[9:

4],[1:

0],配合上面的经典值。

rMPLLCON=(92<<12)|(1<<4)|(1<<0);  //92的十六进制是5C

     从上面这个图上我们可以发现,三星公司建议的一些经典的参数值,我们看到当InputFrequency取12MHz的时候,OutputFrequency输出405MHz(接近400MHz),此时MDIV取0X7F,PDIV取0X02,SDIV取0x1。

    即rMPLLCON=(0x7f<<12)|(2<<4)|(1<<0);  这样FCLK=405MHz就设置好啦。

           除了FCLK我们还经常用到HCLK、PCLK这二个时钟,我们该如何由FCLK获得这二个时钟频率呢,那就是通过CLKDIVN和CAMDIVN分频寄存器的设置啦。

 

从上面二个图中我们可以发现,如果我们想要FCLK:

HCLK:

PCLK=1:

4:

8的话,若主频FCLK是400MHz,如果按照1:

4:

8的设置,可以先设置CLKDIVN为0101,然后设置CAMDIVN的第9位为0(不设置的时候该位默认为0),此时HCLK是100MHz,PCLK是50MHz。

FCLKHCLKPCLK设置比例

  最后,我们用最清晰的线路来绘制一下时钟的产生过程:

  外部时钟源→通过寄存器MPLLCON得到FCLK→再通过寄存器CLKDIVN得到HCLK和PCLK。

  

3、S3C2440定时器

S3C2440处理器内部集成了定时器0-定时器4共5个16位的定时器,每个可选择中断或DMA方式工作。

5个定时器的主要区别在于:

定时器0~3有脉宽调制功能(PWM);定时器4是一个内部定时器,没有输出引脚;定时器0和定时器1有一个用于大电流设备的死区(DEADZONE)产生器,用于电机等感性负载。

其它功能是相同的。

可编程定时器的主要作用是对频率高的输入时钟进行分频来获得频率较低的输出信号,并且利用输出信号每个周期的边界触发中断,实现处理器的定时事件处理功能。

S3C2440的各定时器通过三级分频结构实现对输入时钟的分频。

(1)首先经过的是一个8位的预分频器,可设置的最大分频值为28,通过定时器配置寄存器TCFG0进行设置。

但定时系统只有两个预分频器,其中定时器0和1共享一个8位的预分频器,定时器2、3、4共享另一个8位预分频器。

经过该分频器后的输出信号将作为第二级分频器的输入时钟信号。

(2)第二级分频器是一个进行粗粒度分频的电路,称为粗分频器,同样是每2组或3组共用一个,具有1/2、1/4、1/8、1/164个可选的分频值,具体可通过对定时器配置寄存器1进行选择设置。

该级的输出信号作为第三级的输入时钟。

此级的TCLK0和TCLK1为外部输入时钟,当选择是外部时钟时,8位的预分频器和粗分频器失效。

(3)第三级的分频器是由每个定时器都具有的细粒度16位计数缓冲寄存器TCNTBn(也称为分频初值寄存器)以及一个具体完成分频操作的16位减1计数器TCNTn构成。

计数缓冲寄存器TCNTBn存放的是用户设置的分频初值(也就是倒计时值),在定时器开始工作时需要将用户设置的分频初值传送到减1计数器TCNTn,粗分频器产生的每个输出时钟周期会使其减1。

当其值减到0时,将完成一次定时过程并产生定时器中断请求,以通过CPU定时时间到。

计数缓冲寄存器TCNTBn存放的是计数初值,在定时器开始工作时需要将计数初值传送到减1计数器TCNTn,此时必须是手动更新方式向TCNTn传输TCNTBn的内容,具体操作是利用程序将定时器控制寄存器TCON内对应的位设置为1。

当减1计数器TCNTn的内容减到0后,一次定时过程结束,如果不再进行新的定时计数过程,称为单触发定时模式;一次定时过程结束后,允许继续进行新一轮的定时计数过程而且周而复始,这种方式成为周期定时模式。

对于周期定时模式,可以通过设置自动重载方式使得计数缓冲寄存器TCNTBn自动将其初始值传送到减1计数器TCNTn内,以实现连续不断的循环定时器计数操作。

通过设置定时器控制寄存器TCON内对应的位为1即可选择周期模式(自动重载模式),为0即可选择单触发模式。

如果在定时器计数工作过程中,定时器控制寄存器TCONn内的定时器工作允许位设置为1即正常工作,但通过清除定时器控制寄存器TCONn内的定时器工作允许位使定时器停止工作后,计数缓冲寄存器TCNTBn将会停止将其初始值拷贝到减1计数器TCNTn的操作。

以此可以看出,定时器最初的输入时钟来自处理器的内部时钟PCLK,经过8位的预分频器后,再经过1/N的粗分频,然后送到16位减1计数器TCNTn进行最大可达216的细分频,最终产生输出时钟频率。

公式:

定时器输出时钟频率=PCLK÷(8位的预分频器的值+1)*粗分频的值÷16位计数缓冲寄存器

其中8位的预分频器的值由TCFG0决定,粗分频的值由TCFG1决定,16位计数缓冲寄存器是由TCNTBn决定。

比如已知PCLK为50MHz,可以使8位的预分频器的值等于249,粗分频的值等于1/8,例如我们想要得到1秒钟的延时,可以使TCNTBn为25000即可。

50000000÷(249+1)*1/8÷25000=1HZ

定时器采用双缓冲机制,在周期定时模式中,不修改计数初值,定时器输出将产生等周期的输出信号,若在周期定时模式中修改了计数初值,则要在本次定时计数结束后按新的定时计数初值计数。

本实验通过定时器4实现每隔2秒,跑马灯轮流点亮,并在数码管上输出数据。

编程过程:

    1、在原先的外部中断3修改为定时器4中断

2、设置定时器配置寄存器TCFG0配置8位的预分频值;

    3、设置定时器配置寄存器TCFG1粗分频的值

4、设置计数缓冲寄存器TCNTB4的初始值

5、设置TCON寄存器,设置为手工方式加载;

    6、启动定时器,并设置为自动装载。

 

四、脉宽调制PWM

通过设置预分频值、粗分频值及计数初值等三级分频值可以产生具有不同周期(频率)的输出信号Fcnt,但无论输出信号的周期时间如何变化,变化的部分仅仅在于低电平部分,其中高电平都只有一个输入时钟周期的宽度,即得到的是一个窄脉冲信号。

为了得到具有不同占空比(占空比是指高电平在一个周期之内所占的时间比率)的输出信号,S3C2440定时器还设置了脉宽调制PWM逻辑部分。

PWM就是一个占空比可以根据设置值自动调整的功能单元,具有通过调整一个周期中高电平的宽度就可以向被控对象提供不同的功率的特点。

最典型的应用就是控制电机的运转方式,一个输出信号周期内高电平越宽,电机旋转越快。

为了实现PWM的功能,每个定时器单元内部除了用于分频的逻辑部件外,还设置了PWM电路、一个定时比较缓存寄存器TCMPBn和一个定时比较寄存器TCMPn。

定时比较缓存寄存器TCMPBn用于设置一个一个小于计数缓冲寄存器TCNTBn的初始设置值,该值被自动拷贝到定时比较寄存器TCMPn内,并用于和减1计数器TCNTn的内容进行比较,当减1计数器TCNTn的值减少到与定时比较寄存器TCMPn内的值相同时,PWM脉宽调制电路立刻将输出由低电平变为高电平,并维持到减1计数器TCNTn的值减少到0,从而获得不同占空比的输出信号。

TCNTn称为观察寄存器,作用是当需要读取减1计数器TCNTn的当前值时缓存其当前值。

因为减1计数器TCNTn的值是随输入时钟不断变化的,所以不能直接对其进行读操作,而需要先将某时刻采样到TCNTn的值锁存在观察寄存器TCNTn中再读取。

5、PWM电平反转原理

定时器启动后,输出引脚输出低电平,TCNTn开始减一计数,当TCNTn的值和TCMPn的值相同时,定时器n有一个反转,将输出一个高电平,然后TCNTn继续减1,直至为0,再发生一次反转,将输出一个低电平,这样就实现了高低电平的反转,减为0时会触发中断。

若TCON设为自动加载,TNCTn/TCMPNn的值被重装。

(变相器开关决定了起始输出为高电平还是低电平)

当由TCNTBn选定的频率值保持不变时,PWM输出信号的占空比可以通过设置TCMPBn来调节,为了得到较窄的高电平输出(占空比较小),可减少TCMPBn的值,反之要得到较宽的高电平输出(占空比较大)就应增加TCMPBn的值。

双缓冲功能允许对于下个PWM周期在当前PWM周期任意时间点由ISR或其他程序改写TCMPBn.

六、PWM控制蜂鸣器

本实验通过PWM控制器控制蜂鸣器的发声,JXARM9-2410教学实验系统的蜂鸣器脉冲输入端口连接到S3C2440的TOUT0端口,即定时器0的脉冲输出端口,S3C2440的TOUT0端口在B组控制寄存器里[1:

0]。

在我们搭建好2440的硬件平台后,我们在调试硬件的时候,通常需要将系统的时钟测试引脚引出来测试,以确认系统是否达到设计的要求。

若主频FLCK是400MHz,如果按照1:

4:

8的设置,可以先设置CLKDIVN为101,然后设置CAMDIVN的第9位为0(不设置的时候该位默认为0),此时HLCK是100MHz,PLCK是50MHz。

2440提供了CLKOUT0和CLKOUT1时钟信号输出,用于在H组控制寄存器里[19:

18]和[21:

20]进行配置,将PCLK映射到CLKOUT0引脚,对其测试验证。

 

1、本实验通过定时器0的PWM控制器控制蜂鸣器的发声,编写程序设置输出频率为8000Hz,占空比为2/3的数字信号;

通过修改rTCNTB0和rTCMPB0来设置初始值和占空比。

rTCNTB0用于设置初始计数值,其值的计算公式如下:

div=PCLK/{prescalervalue+1}/{dividervalue}/freq

{prescalervalue}=0-255由rTCFG0设定

{dividervalue}=2,4,8,16,32由rTCFG1设定

通过设置rTCMPB0寄存器调整占空比(rate),公式如下:

value=div*rate/*{rate}<1*/

编程过程:

    1)、设置定时器配置寄存器TCFG0配置8位的预分频值;

    2)、设置定时器配置寄存器TCFG1粗分频的值

3)、设置计数缓冲寄存器TCNTB0的初始值

4)、设置定时比较缓存寄存器TCMPBn的初始值

5)、设置TCON寄存器,设置为手工方式加载;

    6)、启动定时器,并设置为自动装载。

7)、延时一段时间,听蜂鸣器输出效果;

8)、关闭定时器。

2、编写程序改变PWM控制器输出频率,重新编译、下载并运行,听蜂鸣器输出效果;

输出脉冲:

频率从4000HZ到14000HZ,使用2/3的占空比

3、编写程序改变PWM控制器输出占空比,重新编译、下载并运行,听蜂鸣器输出效果。

输出频率8000HZ,使用1/100-95/100的占空比

 

2)编程改变输出的频率

rTCFG0=0xFF;/*设置定时器的预分频率值:

TIME0/1=255,TIME2/3=0,TIME4/5=0*/

rTCFG1=0x1;/*设置定时器的工作模式:

中断模式*/

/*设置定时器的分频率值:

TIME0为1/4,其他为1/2*/

/*输出脉冲:

频率从4000HZ到14000HZ,使用2/3的占空比*/

for(freq=4000;freq<14000;freq+=1000){

div=(PCLK/256/4)/freq;

rTCON=0x0;

rTCNTB0=div;

rTCMPB0=(2*div)/3;

rTCON=0xa;/*手工装载定时器的计数值*/

rTCON=0x9;/*启动定时器*/

for(index=0;index<100000;index++);

rTCON=0x0;/*延时并停止定时器*/

}

3)编程改变输出的占空比

div=(PCLK/256/4)/8000;/*输出频率8000HZ,使用1/100-95/100的占空比*/

for(rate=1;rate<100;rate+=5){

rTCNTB0=div;

rTCMPB0=(rate*div)/100;/*修改占空比*/

rTCON=0xa;/*手工装载定时器的计数值*/

rTCON=0x9;/*启动定时器*/

for(index=0;index<100000;index++);

rTCON=0x0;/*延时并关闭定时器*/

for(index=0;index<10000;index++);

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1