S3C2440 的定时器的设置

发布时间:2023-07-21  

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

       {

              ;         

       }    

}


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    变频调速器怎么接线_变频调速器怎么设置调速;  变频调速器怎么接线   1、电源应接到变频调速器输入端R、S、T接线端子上,一定不能接到变频调速器输出端(U、V、W)上,否则将损坏变频调速器。接线......
    电机软启动器内部原件是什么_电机软启动器怎么设置;  电机软启动器内部原件是什么   电机软启动器是一种电子设备,其内部包含多种电子元器件和控制部件,下面是常见的电机软启动器内部原件:   整流......
    调速变频器怎样调快慢参数 变频器调速怎么设定 变频器过载故障处理;  调速变频器怎样调快慢参数   调速变频器的调整参数包括基本参数和高级参数两部分,其中基本参数主要包括输出频率、最大频率、最小......
    据需要适时进行参数调整。 在进行恒压变频器参数调试时,建议参考厂商提供的操作手册和技术规范,并在有经验的电气工程师或控制专家的指导下进行。 恒压变频器怎么定时控制选择 恒压变频器通常具有定时控制功能,可以根据预设的时间......
    恒压变频器怎么调试参数 恒压变频器怎么定时控制选择;恒压变频器怎么调试参数 调试恒压变频器的参数是确保其正常工作和满足运行要求的重要步骤。下面是一般的恒压变频器参数调试过程: 1. 了解......
    STM32定时器3配置时钟的坑;STMf1的配置TIM3 我用的是原子的F1精英版,配置定时器3的时候出了点问题 问题描述 这里是主函数,在TIM3_Int_Init函数中,4999是重......
    和代码生成,将某个子定时器的计数方式设置为retriggerable single shot方式,发现该子定时器无PWM输出,在调试模式下发现该子定时器的计数器一直为0,即计数器一直没有启动,但如......
    ,FreeRTOS怎么实现这个功能呢? 我们翻阅FreeRTOS官网,查询API文档,在内核控制函数部分找到了相关的函数。 文档指出实现运行时间功能需要配置外设定时器,即32板载定时器,计时器频率应为滴答计时器......
    以及其他芯片进行同步,本文将对高精度定时器的同步功能进行介绍。 2.定时器同步结构 HRTIME 的整体架构如下图所示,内含由 7 个定时器,主定时器 Master timer 与子定时器......
    调试助手所用到的的引脚为PA8和PA0。测量方案:在第一次外部中断(上升沿触发)到之时,开启定时器,同时计数器清零。然后等待第二次中断到来,在第二次外部中断(上升沿触发)到之时,获取计数器的计数值,同时关闭计数器。因为知道了计数器计数一个数的时间......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>