S3C2440 的定时器的设置(转)(笔记)

在前面的几篇文章中,每当程序需要延时时,我们是利用循环语句来实现。这种方法的延时简单,但不是很精确,就是说不能得到确切的一段时间的延时。因此当需要精确延时时,就不能采用这种方法了。一般是利用定时器来实现。在这里,我们就介绍一下s3c2440定时器的使用方法。

在讲解之前,先介绍一下s3c2440时钟系统。一般来说,MCU的主时钟源主要是外部晶振或外部时钟,而用的最多的是外部晶振。在正确情况下,系统内所使用的时钟都是外部时钟源经过一定的处理得到的。由于外部时钟源的频率一般不能满足系统所需要的高频条件,所以往往需要PLL(锁相环)进行倍频处理。在s3c2440中,有2个不同的PLL,一个是MPLL,另一个是UPLL。UPLL是给USB提供48MHz。在这里,我们主要介绍MPLL。外部时钟源经过MPLL处理后能够得到三个不同的系统时钟:FCLK、HCLK和PCLK。FCLK是主频时钟,用于ARM920T内核;HCLK用于AHB总线设备,如ARM920T,内存控制,中断控制,LCD控制,DMA以及USB主模块;PCLK用于APB总线设备,如外围设备的看门狗,IIS,I2C,PWM,MMC接口,ADC,UART,GPIO,RTC以及SPI。这三个系统时钟(FCLK、HCLK和PCLK)是有一定的比例关系,这种关系是通过寄存器CLKDIVN中的HDIVN位和PDIVN位来控制的,因此我们只要知道了FCLK,再通过这两位的控制,就能确定HCLK和PCLK。而FCLK是如何得到的呢?它是通过输入时钟(即外部时钟源)的频率,经过一个计算公式(具体公式请查阅数据手册)得到的,这个计算公式还需要三个参数(MDIV、PDIV、SDIV),而这三个参数是经过寄存器MPLLCON配置得到的。最后,我们用最清晰的线路来绘制一下时钟的产生过程:外部时钟源→通过寄存器MPLLCON得到FCLK→再通过寄存器CLKDIVN得到HCLK和PCLK。这个配置过程在启动文件中就已完成。在本开发板上,外部晶振为12MHz,进过MPLL倍频以后得到400MHz的FCLK,而FCLK、HCLK、PCLK之间的比例关系为1:4:8,因此HCLK为100MHz,PCLK为50MHz。

s3c2440的时钟系统就介绍到这里,我们再回到定时器的配置上来。如何才能得到精确的定时呢?那就要靠TCFG0和TCFG1这两个寄存器来配置定时器的频率,即要确定TCNTOn每递减一个数所需要的时间,它们之间是倒数的关系。具体的计算公式为:

定时器输出时钟频率=PCLK ÷ (prescaler+1) ÷ divider

其中prescaler值由TCFG0决定,divider值由TCFG1决定,而prescaler只能取0~255之间的整数,divider只能取2、4、8和16。比如已知PCLK为50MHz,而我们想得到某一定时器的输出时钟频率为25kHz,则依据公式可以使prescaler等于249,divider等于8。有了这个输出时钟频率,理论上我们通过设置寄存器TCNTBn就可以得到任意与0.04毫秒(1÷25000×1000)成整数倍关系的时间间隔了。例如我们想要得到1秒钟的延时,则使TCNTBn为25000(1000÷0.04)即可。

下面我们通过一段程序来演示利用定时器得到精确延时。这里我们用到的是定时器4。这段程序的作用是让蜂鸣器每隔2秒钟响一次,持续时间为0.5秒,蜂鸣器响的同时伴随着LED亮。

#define _ISR_STARTADDRESS 0x33ffff00

#define U32 unsigned int

#define
pISR_TIMER4         (*(unsigned
*)(_ISR_STARTADDRESS+0x58))

#define rSRCPND     (*(volatile unsigned
*)0x4a000000)     //Interrupt request status

#define rINTMSK     (*(volatile unsigned
*)0x4a000008)      //Interrupt mask control

#define rINTPND     (*(volatile unsigned
*)0x4a000010)      //Interrupt request status

#define rGPBCON    (*(volatile unsigned
*)0x56000010)      //Port B control

#define rGPBDAT    (*(volatile unsigned
*)0x56000014)       //Port B data

#define rGPBUP     (*(volatile unsigned
*)0x56000018) //Pull-up control B

#define rTCFG0  (*(volatile unsigned
*)0x51000000)      //Timer 0 configuration

#define rTCFG1  (*(volatile unsigned
*)0x51000004)      //Timer 1 configuration

#define rTCON   (*(volatile unsigned
*)0x51000008)      //Timer control

#define rTCNTB4 (*(volatile unsigned
*)0x5100003c)       //Timer count buffer
4

void __irq Timer4_ISR(void)

{

static int count;

count ++;

rSRCPND = rSRCPND |
(0x1<<14);

rINTPND = rINTPND |
(0x1<<14);

//每隔2秒蜂鸣器响一次,持续时间为0.5秒,并伴随着LED亮

if (count % 4 ==0)

rGPBDAT
=
~0x1e0;            //蜂鸣器响,LED亮

else if (count % 4 ==1)

rGPBDAT
= 0x1e0;      //蜂鸣器不响,LED灭

}

void Main(void)

{

rGPBCON =
0x155555;               //B0输出,给蜂鸣器;B5~B8输出,给LED

rGPBUP  = 0x7ff;

rGPBDAT =
0x1e0;      //蜂鸣器不响,LED灭

rSRCPND = rSRCPND |
(0x1<<14);

rINTPND = rINTPND |
(0x1<<14);

rINTMSK =
~(0x1<<14);            //打开定时器4中断

rTCFG0 &= 0xFF00FF;

rTCFG0 |=
0xf900;        // prescaler等于249

rTCFG1 &=
~0xF0000;

rTCFG1 |=
0x20000;     //divider等于8,则设置定时器4的时钟频率为25kHz

rTCNTB4 =
12500;              //让定时器4每隔0.5秒中断一次

rTCON &= ~0xF00000;

rTCON |= 0x700000;

rTCON &= ~0x200000
;              //定时器4开始工作

pISR_TIMER4 = (U32)Timer4_ISR;

while(1)

{

;

}

}

时间: 2024-08-11 14:30:53

S3C2440 的定时器的设置(转)(笔记)的相关文章

STM32通用定时器库函数设置

通用定时器 STM32的通用定时器为:TIM2.TIM3.TIM4和TIM5 在使用通用定时器时利用库函数直接设置定时器如下: 1.使能定时器TIM_X的时钟:(X=2.3.4.5) RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIMX,ENABLE); 2.计算要定时的时间,根据定时时间来设定分频数和最大计数值(以向上计数为例子),其中计算关系如下: 系统时钟(一般为72MHZ) = 定时器分频数 * 计数值 假如分频数为7200,则定时器时钟为:72MHZ/7

s3c2440x系统时钟设置及定时器的设置与应用

一.s3c2440时钟介绍 s3c2440中有三种时钟:FCLK,HCLK,PCLK. FCLK用于CPU核:HCLK用于AHB(Advanced High Performance Bus)总线上的设备,如CPU核.存储器控制器.中断控制器.LCD控制器.DMA和USB主机模块等:PCLK用于APB(Advanced Peripheral Bus)总线上的设备,如WATCHDOG.IIS.I2C.PWM定时器.MMC接口.ADC.UART.GPIO.RTC和SPI. s3c2440中有两个PLL

Echarts字体和线条颜色设置操作笔记

这篇文章主要讲述Echarts设置字体和线条的颜色相关操作笔记,希望文章对你有所帮助,主要是自己的在线笔记吧.我在前面先放各种修改前后图片颜色的对照,后面再详细介绍代码.这样更方便阅读及读者知道,是否对自己有所帮助,其重点是如何在模板动态网页或JSP网站中插入Echarts图片.        1.修改标题及背景颜色    2.设置柱形图颜色 3.修改坐标轴字体颜色        4.设置Legend颜色 5.修改折线颜色    6.修改油表盘字体大小及颜色 7.柱状图文本鼠标浮动上的颜色设置

关于js中两种定时器的设置及清除

1.JS中的定时器有两种: window.setTimeout([function],[interval]) 设置一个定时器,并且设定了一个等待的时间[interval],当到达时间后,执行对应的方法[function],当方法执行完成定时器停止(但是定时器还在,只不过没用了); window.setInterval([function],[interval]) 设置一个定时器,并且设定了一个等待的时间[interval],当到达时间后,执行对应的方法[function],当方法执行完成,定时器

mysql创建定时器(event),查看定时器,打开定时器,设置定时器时间

由于项目需要创建定时器(evevt),所以就百度了一下,发现基本都是来源于一个模板,有些功能还不全,现在自己总结一下. 注:mysql版本是从5.1开始才支持event的.如果你的版本低于5.1就先升级版本吧. 查看版本的方法有很多,这里只给大家提供一个    select version(): 1.查看是否开启evevt与开启evevt. 1.1.MySQL evevt功能默认是关闭的,可以使用下面的语句来看evevt的状态,如果是OFF或者0,表示是关闭的.               sh

LINUX使用一个定时器实现设置任意数量定时器

本例子参考 Don Libes的Title: Implementing Software Timers例子改写 为什么需要这个功能,因为大多数计算机软件时钟系统通常只能有一个时钟触发一次中断.当运行多个任务时,我们会想要多个定时器 的时钟跟踪并发这样可以生成正确的时间重叠,操作系统这样做. 本例子是为了实现使用Linux下的一个定时器,实现任一数量的定时器功能. 首先我们需要一些数据类型用来描述时钟数据结构 #include <stdio.h> #include<time.h> #

Quartz 定时器时间设置

spring定时器的时间设置 时间的配置如下:<value>0 26 16 * * ?</value> 时间大小由小到大排列,从秒开始,顺序为 秒,分,时,天,月,年    *为任意 ?为无限制. 由此上面所配置的内容就是,在每天的16点26分启动buildSendHtml() 方法 具体时间设定可参考 "0/10 * * * * ?" 每10秒触发 "0 0 12 * * ?" 每天中午12点触发 "0 15 10 ? * *&q

window.clearInterval与window.setInterval的用法 定时器的设置

window.setInterval() 功能:按照指定的周期(以毫秒计)来调用函数或计算表达式. 语法:setInterval(code,millisec) code:在指定时间到时要执行的JavaScript代码串或函数. millisec:设定的定时时间,用毫秒数表示. 返回值:定时器的ID值,可用于clearInterval()方法停止指定的定时器. 注:setInterval()方法会不停地调用函数,直到用clearInterval()终止定时或窗口被关闭. window.clearI

【DAY3】shell编程以及linux的其他设置学习笔记

shell编程 ------------------ -lt //less than < -gt //greater than > = //相当 -eq //equals = $# //提取参数个数 $1 //第一个参数 $n //提取第n个参数 $0 //提取命令 $? //存放的上次执行命令的结果,0表示成功,非0失败. [email protected] //输出所有参数 -e //exists 判断文件(夹)是否存在 -d //判断是否是目录 help if //查看if帮助信息 he