1、arm9s440处理器的定时器原理课案一、定时器的工作原理在前面实验中,程序需要延时,我们是利用空循环语句来实现。这种方法的延时简单,但不是很精确。当需要精确延时时,就不能采用这种方法了。一般是利用定时器来实现。定时器的工作原理是在输入时钟MCLK的作用下,采用倒计时方式对减1计数器预先编程设置的计数初始值不断减1,减到0时一次定时过程结束。所产生的定时时间等于计数初值乘以MCLK时钟周期。二、S3C2440的时钟源在讲解之前,先介绍一下s3c2440时钟系统。一般来说,MCU的主时钟源主要是外部晶振或外部时钟,而用的最多的是外部晶振。在正确情况下,系统内所使用的时钟都是外部时钟源经过一定的处
2、理得到的。由于外部时钟源的频率一般不能满足系统所需要的高频条件,所以往往需要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接口,
3、ADC,UART,GPIO,RTC以及SPI。这三个系统时钟(FCLK、HCLK和PCLK)是有一定的比例关系,这种关系是通过寄存器CLKDIVN中的HDIVN位和PDIVN位来控制的,因此我们只要知道了FCLK,再通过这两位的控制,就能确定HCLK和PCLK。而FCLK是如何得到的呢?它是通过输入时钟(即外部时钟源)的频率,经过一个计算公式得到的,这个计算公式还需要三个参数(MDIV、PDIV、SDIV),而这三个参数是经过寄存器MPLLCON配置得到的。假如我们想让FCLK=400MHz,那么这三个参数该如何取值呢?MDIV=92 PDIV=1 SDIV=1经过下面的计算得出:m=(MDI
4、V+8)=92+8=100 p=(PDIV+2)=1+2=3s=SDIV=1FCLK=(2*m*Fin)/(p*2s)=(2*100*12)/(3*2)=400M从上面这个图我们可以发现,MDIV、PDIV、SDIV这三个倍频因子,分别位于MPLLCON寄存器的19:12,9:4,1:0,配合上面的经典值。rMPLLCON = (9212)|(14)|(10); /92的十六进制是5C 从上面这个图上我们可以发现,三星公司建议的一些经典的参数值,我们看到当Input Frequency取12MHz的时候,Output Frequency输出405MHz(接近400MHz),此时MDIV取0X7
5、F,PDIV取0X02,SDIV取0x1。 即rMPLLCON = (0x7f12)|(24)|(10); 这样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。FC
6、LK HCLK PCLK设置比例最后,我们用最清晰的线路来绘制一下时钟的产生过程:外部时钟源通过寄存器MPLLCON得到FCLK再通过寄存器CLKDIVN得到HCLK和PCLK。3、S3C2440定时器 S3C2440处理器内部集成了定时器0-定时器4共5个16位的定时器,每个可选择中断或DMA方式工作。5个定时器的主要区别在于:定时器03有脉宽调制功能(PWM);定时器4是一个内部定时器,没有输出引脚;定时器0和定时器1有一个用于大电流设备的死区(DEAD ZONE)产生器,用于电机等感性负载。其它功能是相同的。 可编程定时器的主要作用是对频率高的输入时钟进行分频来获得频率较低的输出信号,并
7、且利用输出信号每个周期的边界触发中断,实现处理器的定时事件处理功能。S3C2440的各定时器通过三级分频结构实现对输入时钟的分频。(1)首先经过的是一个8位的预分频器,可设置的最大分频值为28 ,通过定时器配置寄存器TCFG0进行设置。但定时系统只有两个预分频器,其中定时器0和1共享一个8位的预分频器,定时器2、3、4共享另一个8位预分频器。经过该分频器后的输出信号将作为第二级分频器的输入时钟信号。(2)第二级分频器是一个进行粗粒度分频的电路,称为粗分频器,同样是每2组或3组共用一个,具有1/2、1/4、1/8、1/16 4个可选的分频值,具体可通过对定时器配置寄存器1进行选择设置。该级的输出
8、信号作为第三级的输入时钟。此级的TCLK0和TCLK1为外部输入时钟,当选择是外部时钟时,8位的预分频器和粗分频器失效。(3)第三级的分频器是由每个定时器都具有的细粒度16位计数缓冲寄存器TCNTBn(也称为分频初值寄存器)以及一个具体完成分频操作的16位减1计数器TCNTn构成。计数缓冲寄存器TCNTBn存放的是用户设置的分频初值(也就是倒计时值),在定时器开始工作时需要将用户设置的分频初值传送到减1计数器TCNTn,粗分频器产生的每个输出时钟周期会使其减1。当其值减到0时,将完成一次定时过程并产生定时器中断请求,以通过CPU定时时间到。 计数缓冲寄存器TCNTBn存放的是计数初值,在定时器
9、开始工作时需要将计数初值传送到减1计数器TCNTn,此时必须是手动更新方式向TCNTn传输TCNTBn的内容,具体操作是利用程序将定时器控制寄存器TCON内对应的位设置为1。 当减1计数器TCNTn的内容减到0后,一次定时过程结束,如果不再进行新的定时计数过程,称为单触发定时模式;一次定时过程结束后,允许继续进行新一轮的定时计数过程而且周而复始,这种方式成为周期定时模式。对于周期定时模式,可以通过设置自动重载方式使得计数缓冲寄存器TCNTBn自动将其初始值传送到减1计数器TCNTn内,以实现连续不断的循环定时器计数操作。通过设置定时器控制寄存器TCON内对应的位为1即可选择周期模式(自动重载模
10、式),为0即可选择单触发模式。如果在定时器计数工作过程中,定时器控制寄存器TCONn内的定时器工作允许位设置为1即正常工作,但通过清除定时器控制寄存器TCONn内的定时器工作允许位使定时器停止工作后,计数缓冲寄存器TCNTBn将会停止将其初始值拷贝到减1计数器TCNTn的操作。 以此可以看出,定时器最初的输入时钟来自处理器的内部时钟PCLK,经过8位的预分频器后,再经过1/N的粗分频,然后送到16位减1计数器TCNTn进行最大可达216的细分频,最终产生输出时钟频率。公式:定时器输出时钟频率=PCLK (8位的预分频器的值+1) * 粗分频的值 16位计数缓冲寄存器其中8位的预分频器的值由TC
11、FG0决定,粗分频的值由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、
12、设置定时器配置寄存器TCFG0配置8位的预分频值; 3、设置定时器配置寄存器TCFG1粗分频的值 4、设置计数缓冲寄存器TCNTB4的初始值 5、设置TCON寄存器,设置为手工方式加载; 6、启动定时器,并设置为自动装载。四、脉宽调制PWM 通过设置预分频值、粗分频值及计数初值等三级分频值可以产生具有不同周期(频率)的输出信号Fcnt,但无论输出信号的周期时间如何变化,变化的部分仅仅在于低电平部分,其中高电平都只有一个输入时钟周期的宽度,即得到的是一个窄脉冲信号。为了得到具有不同占空比(占空比是指高电平在一个周期之内所占的时间比率)的输出信号,S3C2440定时器还设置了脉宽调制PWM逻辑部分
13、。PWM就是一个占空比可以根据设置值自动调整的功能单元,具有通过调整一个周期中高电平的宽度就可以向被控对象提供不同的功率的特点。最典型的应用就是控制电机的运转方式,一个输出信号周期内高电平越宽,电机旋转越快。为了实现PWM的功能,每个定时器单元内部除了用于分频的逻辑部件外,还设置了PWM电路、一个定时比较缓存寄存器TCMPBn和一个定时比较寄存器TCMPn。定时比较缓存寄存器TCMPBn用于设置一个一个小于计数缓冲寄存器TCNTBn的初始设置值,该值被自动拷贝到定时比较寄存器TCMPn内,并用于和减1计数器TCNTn的内容进行比较,当减1计数器TCNTn的值减少到与定时比较寄存器TCMPn内的
14、值相同时,PWM脉宽调制电路立刻将输出由低电平变为高电平,并维持到减1计数器TCNTn的值减少到0,从而获得不同占空比的输出信号。TCNTn称为观察寄存器,作用是当需要读取减1计数器TCNTn的当前值时缓存其当前值。因为减1计数器TCNTn的值是随输入时钟不断变化的,所以不能直接对其进行读操作,而需要先将某时刻采样到TCNTn的值锁存在观察寄存器TCNTn中再读取。5、PWM电平反转原理 定时器启动后,输出引脚输出低电平,TCNTn开始减一计数,当TCNTn的值和TCMPn的值相同时,定时器n有一个反转,将输出一个高电平,然后TCNTn继续减1,直至为0,再发生一次反转,将输出一个低电平,这样
15、就实现了高低电平的反转,减为0时会触发中断。若TCON 设为自动加载,TNCTn/TCMPNn 的值被重装。(变相器开关决定了起始输出为高电平还是低电平) 当由TCNTBn 选定的频率值保持不变时,PWM输出信号的占空比可以通过设置TCMPBn来调节,为了得到较窄的高电平输出(占空比较小),可减少TCMPBn的值,反之要得到较宽的高电平输出(占空比较大)就应增加TCMPBn的值。 双缓冲功能允许对于下个 PWM 周期在当前PWM 周期任意时间点由 ISR 或其他程序改写TCMPBn.六、PWM控制蜂鸣器本实验通过PWM控制器控制蜂鸣器的发声,JXARM9-2410教学实验系统的蜂鸣器脉冲输入端
16、口连接到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引脚,
17、对其测试验证。1、本实验通过定时器0的PWM控制器控制蜂鸣器的发声,编写程序设置输出频率为8000Hz,占空比为2/3的数字信号; 通过修改rTCNTB0和rTCMPB0来设置初始值和占空比。rTCNTB0用于设置初始计数值,其值的计算公式如下:div = PCLK / prescaler value + 1 / divider value/freqprescaler value = 0-255 由rTCFG0设定divider value = 2, 4, 8, 16, 32 由rTCFG1设定通过设置rTCMPB0寄存器调整占空比(rate),公式如下:value = div * rate
18、/*rate 1*/ 编程过程:1)、设置定时器配置寄存器TCFG0配置8位的预分频值;2)、设置定时器配置寄存器TCFG1粗分频的值 3)、设置计数缓冲寄存器TCNTB0的初始值 4)、设置定时比较缓存寄存器TCMPBn的初始值 5)、设置TCON寄存器,设置为手工方式加载;6)、启动定时器,并设置为自动装载。 7)、延时一段时间,听蜂鸣器输出效果; 8)、关闭定时器。2、编写程序改变PWM控制器输出频率,重新编译、下载并运行,听蜂鸣器输出效果; 输出脉冲:频率从4000HZ到14000HZ, 使用2/3的占空比3、编写程序改变PWM控制器输出占空比,重新编译、下载并运行,听蜂鸣器输出效果。
19、输出频率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= di
20、v; 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