ARM9 S3C2440 定时器中断

发布者:SerendipityDawn最新更新时间:2024-07-09 关键字:ARM9  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)

       {

              ;         

       }    

}


关键字:ARM9  S3C2440  定时器中断 引用地址:ARM9 S3C2440 定时器中断

上一篇:S3C2440 spi驱动简单测试
下一篇:基于S3C2440和DM9000移植LWIP

推荐阅读最新更新时间:2026-03-24 16:48

s3c2440裸机-异常中断5-irq定时器中断
之前讲过s3c2440时钟体系,看了时钟体系再来看定时器中断会更好的结合运用所学知识点。 S3c2440共有2种定时器: 1.Watchdog看门狗定时器 2.PWM脉冲可调制定时器 下面详细介绍2种定时器的原理,来了解定时器是如何产生定时器中断的。 1. Watchdog看门狗定时器 1)Watchdog看门狗定时器原理 Watchdog定时器的原理很简单,寄存器很少,框图如下: 1.定时器,定时器那肯定是需要用到时钟的,从框图中可以看到Watchdog定时器采用的时钟源是PCLK,从s3c2440时钟体系中也可以体现出来,接的是APB总线。 2.然后到达一个8bit的分频器,可以通过配置WTCON 来设置分频器的预设
[单片机]
S3C2440定时器4中断测试程序
__irq为一个标识,用来表示一个函数是否为中断函数。对于不同的编译器,__irq在函数名中的位置不一样,例如: ADS编译器中 : void __irq IRQ_Eint0(void); Keil编译器中 : void IRQ_Eint0(void) __irq; 但是其意义一样,它所完成的任务是标识该函数为中断函数,在编译器编译是调用此函数时,先保护函数入口现场,然后执行中断函数,函数执行完毕,恢复中断现场,这整个过程不需要用户重新编写代码来完成,由编译器自动完成。因而这也给不具备中断嵌套功能的ARM系统带来了问题,若使用 __irq 时有中断嵌套产生,这现场保护就会混乱。中断嵌套处理可以自己编写中断入口现场保护代码,并不使用
[单片机]
s3c2440定时器中断的应用
在前面的几篇文章中,每当程序需要延时时,我们是利用循环语句来实现。这种方法的延时简单,但不是很精确,就是说不能得到确切的一段时间的延时。因此当需要精确延时时,就不能采用这种方法了。一般是利用定时器来实现。在这里,我们就介绍一下s3c2440定时器的使用方法。 在讲解之前,先介绍一下s3c2440时钟系统。一般来说,MCU的主时钟源主要是外部晶振或外部时钟,而用的最多的是外部晶振。在正确情况下,系统内所使用的时钟都是外部时钟源经过一定的处理得到的。由于外部时钟源的频率一般不能满足系统所需要的高频条件,所以往往需要PLL(锁相环)进行倍频处理。在s3c2440中,有2个不同的PLL,一个是MPLL,另一个是UPLL。UPLL是给US
[单片机]
S3C2440定时器4中断测试程序
__irq为一个标识,用来表示一个函数是否为中断函数。对于不同的编译器,__irq在函数名中的位置不一样,例如: ADS编译器中 : void __irq IRQ_Eint0(void); Keil编译器中 : void IRQ_Eint0(void) __irq; 但是其意义一样,它所完成的任务是标识该函数为中断函数,在编译器编译是调用此函数时,先保护函数入口现场,然后执行中断函数,函数执行完毕,恢复中断现场,这整个过程不需要用户重新编写代码来完成,由编译器自动完成。因而这也给不具备中断嵌套功能的ARM系统带来了问题,若使用 __irq 时有中断嵌套产生,这现场保护就会混乱。中断嵌套处理可以自己编写中断入口现场保护代码,并不使用
[单片机]
ARM9S3C2440)添加驱动的三种方法
(这里我就以beep驱动为例子) 方式一:动态添加(不推荐) 先下载或者找到驱动,一个是.c文件另一个是Makefile(注意makefile里面的命令是要修改的,参考下面的改),将两个文件储存到一个文件夹下,然后make编译,将.ko文件复制到开发板的S3C2440_recover_nogui 的home文件下使用命令insmod+drivername.ko(注释:insmod是指载入模块),利用命令lsmod查看。完毕。 方式二: 先将驱动的.c文件拷贝到/utu-Linux2.6.24_for_utu2440_2009-07-18/drivers/char目录下然后再此目录下的中的Makefile文件中添加 Obj –m
[单片机]
给<font color='red'>ARM9</font>(<font color='red'>S3C2440</font>)添加驱动的三种方法
linux 2.6.32 在arm9s3c2440)平台的移植2 -- Kconfig和Makefile
在ubuntu上按照无数帖子无数文档搞了半天qt环境还有eclipse,最后才发现这些都是无关紧要的东西,首先能在ARM核心板上移植linux才是应该先实现的,自己瞎搞了半天移植,对着make menuconfig的复杂树型选项和添加代码迷糊不已,到了晚上下班才猛然醒悟一切都是因为自己kconfig和makefile的关系不明白,才在原地犯迷糊的。 自己的理解 + 网摘, 参考: http://www.cnblogs.com/sirsunny/archive/2004/12/15/77506.html http://blog.csdn.net/windriver_hf/archive/2010/04/16/5493622.as
[单片机]
ARM9芯片和S3C2440嵌入式系统为核心的以太网接口电路设计
1.引言 随着微电子技术和计算机技术的发展,嵌入式技术得到广阔的发展,已成为现代工业控制、通信类和消费类产品发展的方向。以太网在实时操作、可靠传输、标准统一等方面的卓越性能及其便于安装、维护简单、不受通信距离限制等优点,已经被国内外很多监控、控制领域的研究人员广泛关注,并在实际应用中展露出显着的优势。本文提出了一种基于DM9000AE网络接口芯片和32位三星ARM9处理器S3C2440嵌入式系统的以太网接口的设计方案,并在Windows CE操作系统上开发移植了网络驱动程序实现网络的接入。 2. DM9000AE工作原理 2.1 DM9000的主要特性和总体结构 DM9000AE是DEVICOM(台湾联杰国际)研发的一款10/
[单片机]
以<font color='red'>ARM9</font>芯片和<font color='red'>S3C2440</font>嵌入式系统为核心的以太网接口电路设计
ARM9(S3C2440) ADC
模拟信号/数字信号 (1)、模拟信号是一种在时间上连续,数值上也连续的物理量,具有无穷多的数值,从自然界感知的大部分物理量都是模拟性质的,如速度,压力,温度,声音等。 (2)、数字信号在时间上和数值上均是离散的,而离散信号的值只有真与假,是或不是,因此可以使用二进制中的0与1来表示 。 ADC驱动流程 ADC主要驱动程序 main.c #define ADC_FREQ 2500000 void Main(void) { /*时钟初始化*/ Set_Clk(); /*adc初始化*/ adc_init(); while(1) {
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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