s3c2440定时器中断的应用

发布者:760802csy最新更新时间:2016-05-30 来源: eefocus关键字: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)
       {
              ;         
       }    
}
 
关键字:s3c2440  定时器中断 引用地址:s3c2440定时器中断的应用

上一篇:s3c2440看门狗定时器的应用
下一篇:s3c2440的PWM应用

推荐阅读最新更新时间:2024-03-16 14:55

基于CAN总线的嵌入式数控系统网络化研究
0 引言 近些年,随着现场总线技术和嵌入式技术在工业控制领域的应用,给整个制造业领域带来了巨大的变革,极大的提高了生产力发展水平。本文设计了一种基于ARM9系列微处理器S3C2440和专业运动芯片MCX314As嵌入式数控系统,并在微处理器中移植经过裁剪的开源Linux操作系统,使其具有多任务处理能力。该数控系统结构简单、成本低、插补精度高等优点是符合新一代开放式标准的经济性数控系统。通过在ARM上面扩展CAN总线接口电路,利用CAN总线技术对嵌入式数控系统进行网络化,组建基于CAN总线的局域网数控加工网络。CAN总线在数据通信方面具有突出的可靠性、实时性和灵活性,特别适合工业现场自动化设备的相互连接。根据实际情况,考虑到企
[单片机]
基于CAN总线的嵌入式数控系统网络化研究
S3C2440串口(1)
1.S3C2440串口概述 串口通讯一般要增加电平转换电路,原因是TTL/CMOS电平与RS232电平不一致: TTL/CMOS电平: CMOS电平: 常用的电平转换芯片是MAX3232。 S3C2440有3个独立的异步串口,可以选择工作在中断或DMA方式下。每个UART包括一个波特率发生器、发送器、接收器和一个控制单元。 UART有FIFO模式和非FIFO模式。FIFO模式下可以利用64字节的发送/接收缓冲寄存器,非FIFO模式下只使用了发送/接收缓冲寄存器中的1个字节。本篇入门级以非FIFO为例。 2.串口设置及相关寄存器 串口引脚是GPIO复用的。本篇UART只用3根引脚:TXD、RXD、GND。 TXD0 – G
[单片机]
S3C2440 UART串口驱动
1.1 UART串口 通用异步接收器和发送器(Universal Asynchronous Receiver and Transmitter) 简称UART。通常是嵌入式设备中默认都会配置的通信接口。这是因为,很多嵌入式设备没有显示屏,无法获得嵌入式设备实时数据信息,通过UART串口和超级终端相连,打印嵌入式设备输出信息。并且在对嵌入式系统进行跟踪和调试时,UART串口了是必要的通信手段。比如:网络路由器,交换机等都要通过串口来进行配置。UART串口还是许多硬件数据输出的主要接口,如GPS接收器就是通过UART串口输出GPS接收数据的。 1.1.1 异步通信和同步通信 图2-56同步信号与异步信号 同步通信技术 在发送
[单片机]
<font color='red'>S3C2440</font> UART串口驱动
04-S3C2440u-boot学习之u-boot分析(2)之Makefile结构分析
看uboot说明知道,uboot编译需要 (1)先配置 make 。。。 (2)make。 一:配置过程 make 100ask24x0 (1)解压打号补丁的u-boot-1.1.6,打开makefile。 (2)make 100ask24x0_config相当于执行: a.首先执行make uconfig,删除相关配置文件。 b.@$(MKCONFIG) $(@:_config=) arm arm920t 100ask24x0 NULL s3c24x0 MKCONFIG:= $(SRCTREE)/mkconfig(根目录下有个mkconfig脚本文件) $(@:_config=)
[单片机]
04-S3C2440u-boot学习之u-boot分析(2)之Makefile结构分析
基于ARM9芯片的S3C2440和Linux操作系统设计SPI驱动程序
  在嵌入式开发过程中,许多系统通常使用串口驱动来满足通信要求,但在实际应用中,使用SPI通信方式会更加高效和快捷[2]。SPI接口是一种高速、高效的串行接口技术,因而SPI设备在数据通信应用中十分方便[3]。本文基于ARM9芯片的S3C2440和Linux操作系统,设计了一种SPI驱动程序,该驱动程序功能可靠灵活、易于移植,可应用于多种嵌入式平台,实现ARM与设备之间的通信。   1 硬件说明   1.1 S3C2440开发平台   采用三星公司的SoC芯片S3C2440[4]作为核心处理器,主频为400 MHz,并与64 MB SDRAM和64 MB NAND Flash共同组成核心部分。此外,该平台也为用户提供了大量的通
[单片机]
基于ARM9芯片的<font color='red'>S3C2440</font>和Linux操作系统设计SPI驱动程序
嵌入式学习笔记10——51单片机之中断定时器中断
1. CPU时序的有关知识 (1)振荡周期:为单片机提供定时信号的振荡源的周期(晶振周期或外加振荡周期)。 (2)状态周期:2个振荡周期为1个状态周期,用S表示。振荡周期又称S周期或时钟周期。 (3)机器周期:1个机器周期含6个状态周期,12个振荡周期(使用计时器时,每隔一个机器周期计时器加1)。 (4)指令周期:完成1条指令所占用的全部时间,它以机器周期为单位。 2. 学习定时器前须明白: (1)51单片机有2组定时器/计数器(52单片机有三组),可定时或计数。 (2)定时器/计数器和单片机的CPU是相互独立的,定时器/计数器工作的过程是自动完成的,不需要CPU的参与。 (3)51单片机中的定时器/计
[单片机]
嵌入式学习笔记10——51单片机之<font color='red'>中断</font><font color='red'>定时器</font><font color='red'>中断</font>
S3C2440 LCD字符显示
其实每一字符就是一幅图像,字符的大小对应于图像的大小,字符的笔画对应于图像的内容。那么如何把字符转换为图像呢?简单的方法是使用 字模提取 之类的软件,它能够把任意的字符转换为一个字节型的数组,数组元素中的每一位代表LCD上的一个像素点,当为1时,表示该位置为字符的一个笔画,需要上色,而为0时,表示不是笔画,学过12864无字库液晶的相信肯定会使用LCD字符显示。比较简单,贴两个函数仅供参考。 /************************************************************** * 在LCD屏幕上指定坐标点写ASCII码(8X16) * 取模方式为 阴码 逐行式 顺
[单片机]
ARM9 S3C2440—GPIO初始化设置
用于外部输入输出的GPIO配置主要有以下几步: 1.GPxCON的配置。 每个IO引脚的功能都是复用的,由GPxCON决定引脚的功能是输出(01)输入(00)还是其他功能(外部中断、串口等等),两个二进制位表示。 2.GPxUP的配置。 IO口是否开启上拉电阻功能,0表示使用上拉电阻,1表示不使用,上拉电阻的用处是将引脚通过电阻与电源连接,使引脚电平为高电平而不是悬空,芯片引脚悬空容易受外部的干扰,导致错误输入输出。一般设置不使用上拉电阻,即rGPxUP=0xffffffff,每个IO口用1位二进制表示。 3.GPxDAT的设置。 每一位为相应引脚的输出电平或引脚的状态输入电平,一般在初始化中
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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