接口技术-8定时部件_第1页
接口技术-8定时部件_第2页
接口技术-8定时部件_第3页
接口技术-8定时部件_第4页
接口技术-8定时部件_第5页
已阅读5页,还剩145页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第八章定时/计数器接口设计2/1/2023本章学习目标与要求1.

掌握定时/计数器的基本原理。2.掌握实时时钟RTC的编程方法。3.掌握看门狗定时器的设计方法。4.掌握tick中断的设计方法。5.掌握PWM的设计方法。基于ARM的嵌入式系统接口技术定时控制部件定时部件是嵌入式系统中常用的部件,其主要用作定时功能或计数功能。不同的定时部件在使用上有所差异,但它们的逻辑原理是相同的。S3C2410芯片中的定时部件有多个,不同的定时部件有不同的应用。这里主要介绍其中的看门狗定时器、RTC部件和Timer部件的控制原理及应用。基于ARM的嵌入式系统接口技术8.1工作场景导入2/1/20238.1.1工作场景一设计一个简单的电子钟可以在超级终端上显示实时时间的年月日时分秒,时间实时更新,即每秒钟更新;通常电子时钟校准时间只能校准时分,该闹钟可以实现秒校准;另外,可以设置在重要的时间点的报时功能。具体功能如下。(1)给系统设置一个起始时间,如2010/12/2509:35:00,星期六,要求时间每隔一秒更新显示,即可以看到时间在一秒一秒变化(时间显示通过串口通信在超级终端上显示)。基于ARM的嵌入式系统接口技术8.1.1工作场景一(2)具有小范围校准秒时间的功能:当显示的时间有误差时,可以通过按键2(接外部中断EINT2),在实时时间秒数大于40秒时,进位到整秒时间;实时时间秒数小于40秒时,退到00秒(如在09:36:47时,按下按键2则变成09:37:00;如在09:36:37时,按下按键2则变成09:36:00)实现时间校准。(3)设置电子钟的报时功能,在2010/12/2509:38:05时报时,报时时四只发光二极管闪烁三次。基于ARM的嵌入式系统接口技术引导问题(1)如何设置实时时间?(2)如何使显示的时间每秒钟更新一次?(3)通常的电子钟在校准时间时都只有小时和分钟的调整,而没有秒调整,那么如何得到准备到秒的时间?(4)如何设置电子钟报时的功能?基于ARM的嵌入式系统接口技术8.1.2工作场景二带看门狗功能的电子钟如果在工作场景一中所制作的电子钟放在城市的马路上使用,由于无人职守,并且环境条件不好,可能会出现死机、程序跑飞(时间显示不正确)等状况。要解决这个问题,需要增加看门狗的功能,当出现上述状况时,能够自动重启(假设内部时钟正常,重新启动后会显示正确的时间)。在实验环境中,通常程序不会出现问题,因此实验中采用的方法是:加入看门狗后,定时喂狗则程序正常执行;如果人为修改程序不喂狗,则会使实验箱重新启动。基于ARM的嵌入式系统接口技术引导问题(1)看门狗在程序中起什么作用?(2)如何初始化看门狗?如何启动看门狗工作?(3)看门狗的定时时间间隔如何计算?基于ARM的嵌入式系统接口技术8.1.3工作场景三用蜂鸣器作闹铃声闹钟在报警时可以发出各种不同的显示效果。在工作场景一(3)中为简化程序使用的报警方法是让发光二极管发光,通常闹钟报警时应该是发出声音。因此我们给闹钟增加声音报警功能:修改工作场景一(3)中的报警方法,改为当报警时间到时蜂鸣器响,并且用PWM控制蜂鸣器。基于ARM的嵌入式系统接口技术引导问题(1)ARM中的定时部件有什么作用?(2)什么是PWM?(3)如何通过PWM控制蜂鸣器发出不同的声音?基于ARM的嵌入式系统接口技术8.2定时/计数器原理2/1/20238.2.1定时/计数器如果将定时器定时到1分钟,那么秒针计数到60次后,时钟闹铃就会响。这里有个计数和定时之间的概念转化,时间表示为秒针计数值,即秒针每一次走动的时间正好是1s,走60次即计数60次为1分钟。基于ARM的嵌入式系统接口技术定时部件的一般性原理定时/计数器内部工作原理图是以一个N位的加1或减1计数器为核心,计数器的初始值由初始化编程设置,计数脉冲的来源有两类:系统时钟和外部事件脉冲。

系统时钟M分频外部事件脉冲N位计数器=0回0信号初始值基于ARM的嵌入式系统接口技术定时部件的一般性原理定时器或计数器的逻辑电路本质上是相同的,它们之间的区别主要在用途上。它们都是主要由带有保存当前值的寄存器和当前寄存器值加1或减1逻辑组成。定时器的计数信号是由内部的、周期性的时钟信号承担,以便产生具有固定时间间隔的脉冲信号,实现定时的功能。计数器的计数信号是由非周期性的信号承担,通常是外部事件产生的脉冲信号,以便对外部事件发生的次数进行计数。因为同样的逻辑电路可用于这两个目的,所以该功能部件通常被称为“定时/计数器”。基于ARM的嵌入式系统接口技术定时部件的一般性原理若编程设置定时/计数器为定时工作方式时,则N位计数器的计数脉冲来源于内部系统时钟,并经过M分频。每个计数脉冲使计数器加1或减1,当N位计数器里的数加到0或减到0时,则会产生一个“回0信号”,该信号有效时表示N位计数器里的当前值是0。因为系统时钟的频率是固定的,其M分频后所得到的计数脉冲频率也就是固定的,因此通过对该频率脉冲的计数就转换为定时,实现了定时功能。基于ARM的嵌入式系统接口技术定时部件的一般性原理若编程设置定时/计数器为计数方式时,则N位计数器的计数脉冲来源于外部事件产生的脉冲信号。有一个外部事件脉冲,计数器加1或减1,直到N位计数器中的值为0,产生“回0信号”。N位计数器里初始值的计算,在不同的定时部件中其具体的计算公式是不同的。

基于ARM的嵌入式系统接口技术8.2.2看门狗定时器如果你养了一只狗,让狗看家护院,那么你必须及时喂它,否则它可能不会给你看门,甚至可能会咬你。嵌入式系统经常工作在恶劣的环境下,或者需要在无人状态下连续工作,可能常常会受到来自外界的各种干扰,造成程序紊乱(俗称程序跑飞),而陷入死循环:程序的正常运行被打断,系统无法继续工作,造成整个系统陷入停滞状态,发生不可预料的后果。基于ARM的嵌入式系统接口技术8.2.2看门狗定时器对于嵌入式系统,人们想到在系统中设置一种能够实时监测系统运行状态的功能,当系统程序出现功能错乱、引起系统程序死循环或无法运行下去时,这个功能能中断该系统程序的不正常运行,恢复系统程序的正常运行。Watchdogtimer,中文名称叫做“看门狗定时器”,就是完成这种功能的部件。看门狗定时器计时超时时也会引起事件的发生,只是这个事件除了可以是系统中断外,也可以是一个系统重起信号(ResetSignal),即能发送系统重起信号的定时器就是watchdog。基于ARM的嵌入式系统接口技术8.2.3Timer部件Timer部件是主要用于提供定时功能的部件,能够满足人们控制时间的需求。Timer部件作为定时器,可以得到一定时间间隔的定时信号、一定频率的脉冲信号,充分显示了“定时”的功能,而计时的功能是次要的。即Timer定时器通常用于不带计时功能的定时,如“看门狗”就是一种定时器。基于ARM的嵌入式系统接口技术8.2.3Timer部件Timer部件的典型应用是脉宽调制(PWM)功能,脉宽调制(PWM)是生成占空比可变、频率可变、相位可变的方波的设计方法。PWM是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用于测量、通信、功率控制与变换等许多领域。PWM的一个优点是从处理器到被控系统信号都是数字信号,无需进行数模转换,数字信号可将噪声影响降到最小。基于ARM的嵌入式系统接口技术8.3实时时钟2/1/20238.3.1RTC部件实时时钟部件RTC是用于提供年、月、日、时、分、秒、星期等实时时间信息的定时部件。

RTC部件可以将年、月、日、时、分、秒、星期等信息的8位数据以BCD码格式输出。它由外部时钟驱动工作,外部时钟频率为32.768kHz晶体。同时RTC部件还可以具有报警功能。

基于ARM的嵌入式系统接口技术实时时钟在嵌入式系统中的作用在一个嵌入式系统中,实时时钟单元可以其提供可靠的时钟,包括时分秒和年月日;即使在系统处于关机状态下它也能够正常工作(通常采用后备电池供电),它的外围也不需要太多的辅助电路,典型的就是只需要一个高精度的晶振基于ARM的嵌入式系统接口技术S3C2410内部RTC模块结构框图PMWKUP215时钟分频秒闰年发生器重置寄存器ALMINTRTCALMXTlrtc时钟滴答分时日期星期月控制寄存器年报警发生器XTortc时钟滴答发生器①②④③1Hz⑤基于ARM的嵌入式系统接口技术8.3.2S3C2410RTC的主要特点·年、月、日、时、分、秒、星期等信息采用BCD码表示。·闰年发生器,简单以判断最后两位为00时为闰年,2100年会出错。·具有报警功能,能提供报警中断或者系统在节电模式下的唤醒。·拥有独立的电源引脚(RTCVDD)。·支持RTOS内核时间片所需的毫秒计时中断。·进位复位功能。

基于ARM的嵌入式系统接口技术BCD码BCD码是用4位二进制数来表示1位十进制数中的0~9这10个数码,这种编码形式利用了四个位元来储存一个十进制的数码。RTC部件能将8位数据转换为BCD码的格式传送给CPU。使用BCD码存储各个时间值,BCD码在二进制和十进制之间可以很容易的转换,因此使设置变得很简单。基于ARM的嵌入式系统接口技术8.3.2S3C2410RTC的主要特点RTC的时间片计时器用于产生一个中断请求,TICNT寄存器有一个中断使能位,和计数器中的值一起用来控制中断。当计数器的值变为0时,引起时间片计时中断。中断信号的周期用下列公式计算: 周期=(n+1)/128s

n:时间片计数器的值,范围为1-127RTC的时间片计时器可以用来产生实时操作系统内核所需要的时间片。基于ARM的嵌入式系统接口技术8.3.3S3C2410RTC的基本操作时钟产生寄存器时间计数器组报警寄存器组中断相关寄存器组基于ARM的嵌入式系统接口技术RTC的基本操作RTC的主要功能是提供时间信息和产生与时间相关的中断。对RTC的操作分为两部分:RTC初始化读RTC时间或产生中断基于ARM的嵌入式系统接口技术RTC的初始化初始化RTC时钟值中断设置启动RTC基于ARM的嵌入式系统接口技术初始化RTC时钟值初始化RTC时钟值是通过设置时间计数器组完成的,时间计数器组包括8个寄存器。一般设置其中七个:如:设置RTC时间为“2009-11-23,星期一,10:30:02”基于ARM的嵌入式系统接口技术1.RTC控制寄存器(RTCCON)注意:读写RTC寄存器前需要先将RTCEN位置1,修改完各数据寄存器后,为防止无意修改,设置RTCEN不使能,即RTCEN位置0。另外还有一点需要注意的是CNTSEL位,RTC默认是使用BCD编码,这样对BCD时钟寄存器的读写就变得非常方便。rRTCCON=0x01; //读写使能…… //设置各个时间计数器的值或者读出各个时间计数器的值rRTCCON=0x00; //禁止读写使能符号位描述初始CLKRST[3]实时时钟计数器复位0:不复位1:复位0CNTSEL[2]BCD计数选择,将计数器设置为BCD模式0:选择BCD模式1:保留0CLKSEL[1]BCD时钟选择0:将输入时钟进行1/223分频1:保留0RTCEN[0]RTC读写使能0:禁止1:使能0基于ARM的嵌入式系统接口技术2.时间计数器组基于ARM的嵌入式系统接口技术秒数据寄存器(BCDSEC)符号位描述初始状态SECDATA[6:4]秒数据十位的BCD码值,范围为0~5-[3:0]秒数据个位的BCD码值,范围为0~9如设置当前时间2010年9月1日9时32分00秒,星期三,其中秒数是00秒,则可以设置如下。要想获得当前实时时间的秒数,即读取秒数据寄存器的值,则编写如下的程序段。//设置各个时间计数器的值,设置秒数据寄存器的值rBCDSEC=0x00; //rBCDSEC是BCDSEC寄存器的名字//读出秒数据寄存器的值,放在已声明的变量sec中sec=rBCDSEC; //sec已声明的变量基于ARM的嵌入式系统接口技术分数据寄存器(BCDMIN)符号位描述初始状态MINDATA[6:4]分数据十位的BCD码值,范围为0~5-[3:0]分数据个位的BCD码值,范围为0~9如设置当前时间2010年9月1日9时32分00秒,星期三,其中分钟是32分,则可以设置如下。要想获得当前实时时间的分钟数,则可以编写如下的程序段。//设置各个时间计数器的值,设置分钟数据寄存器的值rBCDMIN=0x32;//读出分钟数据寄存器的值,放在已声明的变量min中min=rBCDMIN;基于ARM的嵌入式系统接口技术时数据寄存器(BCDHOUR)符号位描述初始状态reserved[7:6]保留HOURDATA[5:4]时数据十位的BCD码值,范围为0~2-[3:0]时数据个位的BCD码值,范围为0~9如设置当前时间2010年9月1日9时32分00秒,星期三,其中小时数是09时,则可以设置如下。要想获得当前实时时间的小时数,则可以编写如下的程序段。//设置各个时间计数器的值,设置时数据寄存器的值rBCDHOUR=0x09;//读出时数据寄存器的值,放在已声明的变量hour中hour=rBCDHOUR; 基于ARM的嵌入式系统接口技术日数据寄存器(BCDDATE)符号位描述初始状态reserved[7:6]保留DATEDATA[5:4]日数据十位的BCD码值,范围为0~3-[3:0]日数据个位的BCD码值,范围为0~9如设置当前时间2010年9月1日9时32分00秒,星期三,其中日期是1日,则可以设置如下。要想获得当前实时时间的日期值,则可以编写如下的程序段。//设置各个时间计数器的值,设置日期数据寄存器的值rBCDDATE=0x01;//读出日期数据寄存器的值,放在已声明的变量date中date=rBCDDATE; 基于ARM的嵌入式系统接口技术星期数据寄存器(BCDDAY)符号位描述初始状态reserved[7:3]保留-DAYDATA[2:0]星期数据的BCD码值,范围为1~7其余略基于ARM的嵌入式系统接口技术因为时间计数器组的各个寄存器都是定义为unsignedchar类型,因此,rBCDYEAR寄存器中也只能存放年份的最后两位,因此设置时虽然设置的是四位十进制数,但保存的只是后面的两位,而取出其中值的时候需要加上前两位值。基于ARM的嵌入式系统接口技术例设置RTC时间为“2009-11-23,星期一,10:30:02”rRTCCON=0x01;//读写使能rBCDSEC=0x02;rBCDMIN=0x30;rBCDHOUR=0x10;rBCDDAY=0x23;rBCDDATE=0x01;rBCDMON=0x11;rBCDYEAR=0x2009;rRTCCON=0x00;基于ARM的嵌入式系统接口技术获取实时时间,即获取实时时钟当前时间、日期rRTCCON=0x01;sec=rBCDSEC;min=rBCDMIN;hour=rBCDHOUR;day=rBCDDAY;date=rBCDDATE;mon=rBCDMON;year=0x2000+rBCDYEAR;rRTCCON=0x00;基于ARM的嵌入式系统接口技术8.3.3.2报警中断可以在RTC中设定在某个时间产生中断,该功能可通过报警中断来实现:当未屏蔽的报警时间寄存器和对应的时间计数器计数值都相匹配时,就产生报警中断,且输出一个约为1.8V的报警输出信号。通过设置报警控制寄存器即可设定报警中断的产生时刻。例如:设置秒时钟告警,则设置:rRTCALM=0x41;//0x41表示使能RTC告警,以及使能秒时钟告警基于ARM的嵌入式系统接口技术报警控制寄存器(RTCALM)符号位描述初始状态保留[7]保留0ALMEN[6]时钟告警总使能/禁止0:禁止1:使能0YEAREN[5]年时钟告警使能/禁止0:禁止1:使能0MONREN[4]月时钟告警使能/禁止0:禁止

1:使能0DAYEN[3]日时钟告警使能/禁止0:禁止1:使能0HOUREN[2]时时钟告警使能/禁止0:禁止1:使能0MINEN[1]分时钟告警使能/禁止0:禁止1:使能0SECEN[0]秒时钟告警使能/禁止0:禁止1:使能0基于ARM的嵌入式系统接口技术日数据寄存器(BCDDATE)报警控制寄存器(RTCALM)用来确定报警功能是否使能以及各报警时间寄存器是否使能(被屏蔽)。RTCALM寄存器是可读/写的如设置秒时钟告警,则需要使能总告警位和秒时钟告警位。

要设置报警时间为每天的9时35分05秒,即相应的时分秒各位都要匹配时报警,应该如下设置。//先设置报警时间,即设置相应的报警数据寄存器的值rRTCALM=0x41;//0x41表示告警总使能bit[6]和使能秒时钟告警bit[0]//先设置报警时间,即设置相应的报警数据寄存器的值rRTCALM=0x47;//0x47表示告警总使能bit[6]=1并使能bit[2:0]=111基于ARM的嵌入式系统接口技术报警时间数据寄存器基于ARM的嵌入式系统接口技术报警秒数据寄存器(ALMSEC)(其余略)符号位描述初始状态reserved[7]保留0SECDATA[6:4]报警定时器秒数据的十位数BCD码值,范围为0~5000[3:0]报警定时器秒数据的个位BCD码值,范围为0~90000如设置报警时间为每天的9时35分05秒,其中秒报警时间为05秒,则可以如下设置。rALMSEC=0x05;基于ARM的嵌入式系统接口技术例设置报警时间为每天的9时35分05秒,可以如下设置。rRTCCON=0x01;//读写使能//以下六行设置各个报警数据寄存器的值rALMSEC=0x05;rALMMIN=0x35;rALMHOUR=0x09;rALMDATE=0x01;rALMMON=0x09;rALMYEAR=0x2010;rRTCALM=0x47; //报警总使能、时、分、秒报警使能rRTCCON=0x00; //禁止读写使能基于ARM的嵌入式系统接口技术8.3.3.2报警中断若要在报警时间到时产生报警中断,还需要进行中断设置,利用第六章的中断处理函数,可以如下设置void__irq

rtc_int_isr(void); //放在函数外,声明中断处理函数Irq_Request(IRQ_RTC,rtc_int_isr); //请求中断,IRQ_RTC为中断号//此处加入设置报警时间及方式的语句或函数调用Irq_Enable(IRQ_RTC); //使能中断//在中断处理函数里清除中断Irq_Clear(IRQ_RTC);基于ARM的嵌入式系统接口技术8.3.3.2报警中断ALMEN使能,对应RTCALM都相应使能。设置相应告警时分秒寄存器。当RTC时钟运行到跟我们设定的告警时钟值相等瞬间发生一次告警中断,RTC时钟跟告警时钟比较时,只是按照RTCALM中设定的使能的年月日时分秒顺序比较,均想等时才发生,如果其中的RTCALM中的某位设为禁止,则不对此位作比即可。基于ARM的嵌入式系统接口技术8.3.3.3进位复位功能在S3C2410的RTC单元中有一个循环复位寄存器(RTCRST),具有进位复位的功能,即可以把实时时间直接调整到整分钟值,把秒置为00。更具体地说,秒的进位周期可以选择,进位周期可以设置为30、40、50。有两种调整方式:大于设定的进位周期时,分钟数据加1,秒置为00;小于设定的进位周期时,分钟数据不变,秒置00。这个功能类似于数学上“四舍五入”的计算方法。基于ARM的嵌入式系统接口技术8.3.3.3进位复位功能例如,当进位周期选为40秒,若当前时间是09:36:47,通过使能循环复位位,则当前时间将变为09:37:00;若当前时间是09:36:37,通过使能循环复位位,则当前时间将变为09:36:00。进位复位功能是通过循环复位寄存器(RTCRST)完成的。基于ARM的嵌入式系统接口技术循环复位寄存器(RTCRST)符号位描述初始状态SRSTEN[3]秒循环复位使能位1:使能

0:不使能0SCCR[2:0]确定秒循环进位的周期011=超过30秒100=超过40秒101=超过50秒000秒的进位周期可以进行选择(30、40、50),在进位复位发生后秒,秒的数值又循回到0。例如,当前时间是23:37:47,进位周期选为40秒,则当前时间将变为23:38:00。基于ARM的嵌入式系统接口技术8.3.3.4时钟节拍中断RTC的时间片计时器即时钟节拍用于中断请求,可以用来产生实时操作系统内核所需的时间片。在TICNT寄存器中有一个时间片计数器,该寄存器共有八位,有一位中断使能位和一个计数数值n(n占7位,因此n的取值范围为1~127(27-1=127)),该计数器是减1计数器,启动计数后,当计数器的值减到0后,则产生一个毫秒级中断,叫做时间片计时中断或时钟节拍中断。基于ARM的嵌入式系统接口技术实时时钟计数器(时间片计数器)TICNT符号位描述初始状态TICKINTENABLE[7]中断使能/禁止0:禁止1:使能0TICKTIMECOUNT[6:0]实时时钟计数器0000000当计数值减少到0则产生时间片计时(时钟节拍)中断。那么中断周期就是: 周期=(n+1)/128sec其中n为时间片计数器中的值(Ticktimecountvalue),范围是1-127。基于ARM的嵌入式系统接口技术8.3.3.4时钟节拍中断例如,程序中设置每秒钟引发一次中断rRTCCON=0x0; //禁止RTC寄存器读写使能rTICNT=0x7f|0x80; //TICK中断使能,周期为(1+127)/128秒//0x80即设置此寄存器的位[7]为1,使能时间片计数中断基于ARM的嵌入式系统接口技术8.4回到工作场景一2/1/2023工作过程一1)通过超级终端显示实时时间的时、分、秒首先设置实时时间,然后读取实时时间值,并在超级终端上打印出来。建立一个工程打开CodeWarriorIDE,新建一个工程,输入工程名rtc,存放在D:\test\rtc目录下;新建一个C语言源文件,输入文件名rtctest.c,存放在D:\test\rtc目录下并加入到工程rtc中。基于ARM的嵌入式系统接口技术工作过程二编写rtctest.c程序首先包含寄存器地址定义的头文件。/*包含文件*/#include"2410addr.h"/*在此头文件中有对RTC中用到的寄存器的定义,例如#definerRTCCON (*(volatileunsignedchar*)0x57000040)//RTCcontrol#definerTICNT (*(volatileunsignedchar*)0x57000044)//Ticktimecount#definerRTCALM (*(volatileunsignedchar*)0x57000050)//RTCalarmcontrol#definerALMSEC (*(volatileunsignedchar*)0x57000054)//Alarmsecond……*/基于ARM的嵌入式系统接口技术工作过程二编写rtctest.c程序在程序中,定义一个函数rtcset(),用来设置当前时间,函数的参数为要设置的时间,用数组(年只存储后面两位)或结构体(可以表示不同的数据类型)来定义此参数更加方便。假设设置的时间为2010/12/2509:35:00,星期六。①定义一个结构体类型rtc_date。typedef

structST_DATE //定义结构体类型,该类型命名为rtc_date{ shortyear; //年,定义为short类型,可以存储4位的年份

char mon; //月

char day; //日

char week; //星期

char hour; //时

char min; //分

char sec; //秒}rtc_date; //用typedef定义结构体类型的别名为rtc_date基于ARM的嵌入式系统接口技术工作过程二编写rtctest.c程序②定义函数rtcset(rtc_date*p_date),用于设置系统的实时时间,其中p_date是rtc_date类型的结构体变量。rtcset(rtc_date*p_date){

rRTCCON=0x01; //读写使能

rBCDSEC=p_date->sec; //以下使用结构体成员赋值,

rBCDMIN=p_date->min; //用指针取成员时用->运算符

rBCDHOUR=p_date->hour;

rBCDDAY=p_date->week;

rBCDDATE=p_date->day;

rBCDMON=p_date->mon;

rBCDYEAR=p_date->year;

rRTCCON=0x00; //禁止读写}基于ARM的嵌入式系统接口技术工作过程二编写rtctest.c程序③再定义一个获取时间的函数rtcget(rtc_date*p_date),用于取出实时时间。rtcget(rtc_date*p_date){

rRTCCON=0x01; //读写使能

p_date->sec=rBCDSEC; //以下取出时间计数器组的值赋给结构体成员

p_date->min=rBCDMIN;

p_date->hour=rBCDHOUR;

p_date->week=rBCDDAY;

p_date->day=rBCDDATE;

p_date->mon=rBCDMON;

p_date->year=rBCDYEAR;

rRTCCON=0x00; //禁止读写}基于ARM的嵌入式系统接口技术工作过程二编写rtctest.c程序④实时时间要通过串口在超级终端上显示,因此在主函数中,首先要初始化时钟和串口,参见第十章,在这里仍然直接调用已有的函数设置。voidMain(void){ SetClockDivider(1,1); SetMPllValue(0xa1,0x3,0x1);

Isr_Init();

Port_Init(); uart0_init(); …… //下面是具体的对RTC的操作}基于ARM的嵌入式系统接口技术工作过程二编写rtctest.c程序⑤因为要求每隔一秒更新显示时间,所以在这里利用秒中断,每秒中断一次,重新显示实时时间,秒中断的设置也定义为函数,把相应的中断请求和中断使能都在函数中实现。#include"interrupt.h" //包含处理中断相关的头文件void__irqrtctick_isr(void); //在主函数前声明中断处理函数……rtc_tickset(chartick){ pISR_TICK=(unsigned)rtctick_isr; //请求中断

rRTCCON=0x0; //设置前禁止对数据寄存器读写

rTICNT=(tick&0x7f)|0x80; //bit[7]=1,使能TICK中断,周期为(1+tick)/128秒

Irq_Enable(IRQ_TICK); //使能中断,在中断处理函数中清除}基于ARM的嵌入式系统接口技术工作过程二编写rtctest.c程序⑥调用上面的两个函数进行实时时间的设置,再取出实时时间,并设置一个全局变量,标识是否需要更新显示的内容,最后把实时时间通过串口显示在超级终端里。(程序清单见书上。)上述写法,每隔一秒钟重新获取时间,再更新超级终端的显示。如果不用秒中断而直接在while(1)循环中显示实时时间,如下面的写法,虽然也可以实时更新显示,但这样的写法,程序一直在取时间并显示,浪费资源。基于ARM的嵌入式系统接口技术工作过程二编写rtctest.c程序while(1){

rtcget(&m_date);

Uart_Printf(“\b\b\b\b\b\b\b\b%02x:%02x:%02x”,m_date.hour,m_date.min,m_date.sec);}基于ARM的嵌入式系统接口技术工作过程二编写rtctest.c程序⑦只要设置好了时间片中断计数器,到时间就会产生中断,时间片中断的中断处理函数很简单,只要更改一下标识,保证每秒钟重新到时间计数器组取实时时间值。voidrtctick_isr(void){

Irq_Clear(IRQ_TICK); //清除TICK中断

flag++; //使flag=flag+1}基于ARM的嵌入式系统接口技术工作过程三设置工程并编译工程①加入需要的启动文件和其他需要的文件。 加入2410init.s和2410slib.s; 加入2410lib.c,interrupt.c(从提供的光盘资料中拷贝到D:\test目录),并在工程窗口的LinkOrder标签页设置把它们放在主程序前面;②在工程属性对话框中的Target\AccessPaths设置包含的头文件路径,对工程的ARMLinker进行设置,同前。③编译工程。基于ARM的嵌入式系统接口技术工作过程四、五下载程序打开AXDDebugger,选择File|LoadImage命令,加载要调试的文件D:\test\rtc\rtc_Data\DebugRel\rtc.axf,将程序下载到目标系统。调试、运行打开超级终端,下载完成后调试运行,可以在超级终端上看到实时时间年月日时分秒的显示。此工作场景是在超级终端上显示实时时间,也可以用六只数码管显示年月日,再显示时分秒,程序见第11章11.10节“工作实训营”的训练实例1。基于ARM的嵌入式系统接口技术工作过程一2)校准秒时间在1)所完成的实时时间显示程序基础上填加功能:通过按下按键2,在实时时间秒数大于40秒时,进位到整秒时间;实时时间秒数小于40秒时,退到00秒(如在09:36:47时,按下按键2则变成09:37:00;如在09:36:37时,按下按键2则变成09:36:00。)假设按键2接外部中断2。修改rtctest.c程序因为需要使用外部中断,所以要增加中断设置编程。基于ARM的嵌入式系统接口技术工作过程二①在包含文件部分加入(如果没有)处理中断需要用到的头文件:interrupt.h,2410lib.h(前面用到了tick中断,已经有一部分中断设置,只需填加和EINT2相关的中断处理部分),在主函数外部,定义中断处理函数。/*定义中断处理函数*/void__irqeint2_isr(void);基于ARM的嵌入式系统接口技术工作过程二②在主函数中,加入对EINT2中断处理过程的函数,包括请求中断、使能中断。voidMain(void){

......

//已有端口设置和中断初始化

pISR_EINT2=(unsigned)eint2_isr; //请求中断

Irq_Enable(IRQ_EINT2); //使能中断

......}基于ARM的嵌入式系统接口技术工作过程二③在中断处理函数中,设置RTCRST寄存器,主要是使能秒循环复位,设置如何循环复位可以在主函数中设置也可以在中断函数中设置。voideint2_isr(void){ Irq_Clear(IRQ_EINT2);//清除中断

rRTCCON=0x01;//因为复位置位要修改时间计数器组的值,因此允许其读写

rRTCRST|=0xB; //或者在Main中,rRTCRST=0x3,这里rRTCRST|=0x8

rRTCCON=0x00;//修改完后使读写禁止,防止被误修改}基于ARM的嵌入式系统接口技术工作过程二重新编译工程、下载并运行重新编译工程,并下载到实验箱上运行,分别在不同的时刻按下按键2,在超级终端的时间显示上,观察秒和分钟值的变化。基于ARM的嵌入式系统接口技术工作过程一3)设置在每分钟的第5秒时报时,报时时间到时四只发光二极管闪烁三次。修改rtctest.c程序①报警功能也是中断,因此也需要进行中断处理。在前面已经设置好包含文件,在主函数外部,定义中断处理函数,报警中断的中断号命名为IRQ_RTC。/*定义中断处理函数*/void__irqalarm_isr(void);基于ARM的嵌入式系统接口技术工作过程一②对于报警的时间和报警方式的设置,也用一个函数来完成。在程序中主函数的前面定义函数alarmset(rtc_date*p_date,unsignedcharalmmode),这个函数有两个参数,第一个是报警的时间,和上面设置实时时间及获得实时时间的参数一样;第二个参数是报警的方式,也就是RTCALM报警控制寄存器(RTCALM)中的内容,此寄存器共有七位有效位,因此设置参数类型为unsignedchar。基于ARM的嵌入式系统接口技术工作过程一alarmset(rtc_date*p_date,unsignedcharalmmode){

rRTCCON=0x01; //读写使能

rALMSEC=p_date->sec;

rALMMIN=p_date->min;

rALMHOUR=p_date->hour;

rALMDATE=p_date->day;

rALMMON=p_date->mon;

rALMYEAR=p_date->year;

rRTCALM=almmode;

rRTCCON=0x00; //禁止读写}基于ARM的嵌入式系统接口技术工作过程一③在主函数中,加入中断处理过程的函数,包括中断初始化、端口初始化、请求中断、并调用上面的函数实现报警中断设置,最后使能中断。voidMain(void){

......

Isr_Init();//中断初始化,如果有其他中断已经调用此函数,不用调用两次

Port_Init(); //初始化端口,说明同上

pISR_RTC=(unsigned)alarm_isr; //请求中断

m_date.sec=0x05; //设置告警时间,与设置实时时间类似

m_date.min=0x35;//变量m_date只在赋初值时用到,此处可以重复使用

m_date.hour=0x09;

m_date.date=0x25;

m_date.mon=0x12;

m_date.year=0x10;/*以上赋值语句其实只修改了m_date.sec的值,其他没变的赋值语句可以不用*/ alarmset(&m_date,0x41); //调用函数设置报警的时间和方式

Irq_Enable(IRQ_RTC); //使能中断

......}基于ARM的嵌入式系统接口技术工作过程一④在中断处理函数中,使四只二极管闪烁三次,假设二极管由0x10000000的bit[7:4]控制。voidrtc_alarm_isr(void){

Irq_Clear(IRQ_RTC); //清除中断

for(intm=0;m<3;m++){ //闪烁三次 *((unsignedchar*)0x10000000)=0x0f;//0x10000000用于控制二极管

Delay(10); //调用延时函数 *((unsignedchar*)0x10000000)=0xff; Delay(10); //调用延时函数

}//因为这段程序执行时间不长,所以放在中断处理函数里。}基于ARM的嵌入式系统接口技术工作过程二重新编译工程、下载并运行重新编译工程,并下载到实验箱上运行,观察当秒值为5时发光二极管的变化。基于ARM的嵌入式系统接口技术8.5看门狗定时器2/1/20238.5.1看门狗定时器的原理S3C2410芯片看门狗定时器的作用是,当系统程序出现功能错乱,引起系统程序死循环时,能中断该系统程序的不正常运行,恢复系统程序的正常运行。基于ARM的嵌入式系统接口技术五基础知识8.5.1看门狗定时器的原理其基本原理为:设本系统程序完整运行一周期的时间是Tp,看门狗的定时周期为Ti,Ti>Tp,在程序运行一周期后就修改定时器的计数值,只要程序正常运行,定时器就不会溢出,若由于干扰等原因使系统不能在Tp时刻修改定时器的计数值,定时器将在Ti时刻溢出,引发系统复位,使系统得以重新运行,从而起到监控作用。在一个完整的嵌入式系统或单片机小系统中通常都有看门狗定时器,且一般集成在处理器芯片中,看门狗实际上就是一个定时器,只是它在期满后将自动引起系统复位。基于ARM的嵌入式系统接口技术输入时钟为PCLK(该时钟频率等于系统的主频),它经过两级分频,最后将分频后的时钟作为该定时器的输入时钟,当计数器期满后可以产生中断或者复位信号。S3C2410的看门狗定时器有两个功能作为常规定时器使用,并且可以产生中断作为看门狗定时器使用,期满时,它可以产生128个时钟周期的复位信号系统时钟M分频外部事件脉冲N位计数器=0回0信号初始值基于ARM的嵌入式系统接口技术8.5.1看门狗定时器的原理Watchdog根据系统时钟、预分频值、分割器因子会产生一个watchdog自己的工作周期,t_watchdog=1/(PCLK/(Prescalervalue+1)/Division_factor)watchdog在一个t_watchdog周期结束时会产生一个记数递减信号,每当这个信号产生时,WTCNT中的值便减1,若在WTCNT递减为0(TimerOut)的时候软件层还没有重新往WTCNT中写入数值(喂狗),则watchdog触发ResetSignal,系统重起。基于ARM的嵌入式系统接口技术8.5.1看门狗定时器的原理预分频器的值和频率分解因子可由看门狗定时器的控制寄存器(WTCON)进行编程设定。预分频器值的可选范围是:

0~28-1。频率分割因子可选择的值为16,32,64,128。使用下面公式来计算看门狗定时器的计数时钟周期: 计数时钟周期

=1/(PCLK/(预分频器值

+1)/分割因子)看门狗的定时周期

T=WTCNT*计数时钟周期#defineFCLK202800000#defineHCLK(FCLK/2)#definePCLK(FCLK/4)#defineUCLKPCLK基于ARM的嵌入式系统接口技术8.5.1看门狗定时器的原理一旦看门狗定时器被启动工作,看门狗定时器中的计数常数寄存器(WTDAT)就无法自动的重载到计数寄存器(WTCNT)中。因此,应该在看门狗定时器启动工作之前,通过初始化编程使计数常数写入计数寄存器(WTCNT)中。voidwatchdog_init(){

rWTCNT=8448*2; /*设置看门狗初始值*/

rWTCON=WDT_ENABLE|WDT_RST_ENABLE|WDT_CLK_SEL|WDT_PRE_SCALER; /*打开看门狗*/}基于ARM的嵌入式系统接口技术五基础知识8.5.2看门狗定时器的基本操作与看门狗定时器相关的有如下三个寄存器。看门狗控制寄存器(WTCON)。看门狗数据寄存器(WTDAT)。看门狗计数寄存器(WTCNT)。基于ARM的嵌入式系统接口技术五基础知识8.5.2看门狗定时器的基本操作使用看门狗定时器时,需要进行以下三个基本操作步骤的设置。(1)给减1计数器WTCNT一个值,用来设置定时的时钟周期个数,通过这个值计算出来的定时长度应该大于程序运行的周期。(2)设置计数脉冲值,即设置预分频器值及分割器因子值;设置计数器溢出时的动作。(3)启动看门狗定时器。基于ARM的嵌入式系统接口技术1.看门狗控制寄存器(WTCON)符号位描述初始状态PrescalerValue[15:8]预分频值,有效范围为:0到(28-1)0x80Reserved[7:6]保留,必须为0000WatchdogTimer[5]看门狗定时器使能/禁止0:禁止看门狗定时器1:使能看门狗定时器1ClockSelect[4:3]决定时钟分频因子(分割器因子)

00:1/1601:1/3210:1/6411:1/12800InterruptGeneration[2]中断使能/禁止0:禁止产生中断1:使能产生中断0Reserved[1]保留,必须为00ResetEnable/Disable[0]看门狗定时器输出引发复位信号的使能/禁止位0:禁止看门狗定时器的复位功能1:看门狗定时器超时后引发复位信号1基于ARM的嵌入式系统接口技术五基础知识8.5.2看门狗定时器的基本操作设置计数脉冲也就是设置预分频值和分割器因子值。预分频器的值和频率分割器因子可由看门狗定时器的控制寄存器(WTCON)进行编程设定:控制寄存器(WTCON)的bit[15:8]共8位二进制数决定预分频器的分频值,因此预分频器值的可选范围是0~28-1;控制寄存器(WTCON)的bit[4:3]2位决定频率分割因子的值,可选择的值为16,32,64,128。基于ARM的嵌入式系统接口技术五基础知识8.5.2看门狗定时器的基本操作控制寄存器还可以设置定时器溢出时产生什么动作,由控制寄存器(WTCON)的bit[2]设定是否产生中断信号,bit[0]设定是否产生复位信号。最后设置好上面几位之后,把该寄存器的bit[5]置1则启动看门狗开始工作。基于ARM的嵌入式系统接口技术例要设置预分频值为255,分割器因子选择16,计数器溢出时产生复位信号,不生产中断信号,同时启动看门狗,则设置语句:rWTCON=0x7F21;//[15:8]设为0x7f,[5]设为1,[4:3]设为00,[2]设为0,[0]设为1,其余位设为0使用下面公式来计算看门狗定时器的计数时钟周期(也就是一个脉冲的时间)。 计数时钟周期(t_watchdog)=1/(PCLK/(预分频器值+1)/分割因子)基于ARM的嵌入式系统接口技术2.计数器寄存器(WTCNT)计数器寄存器(WTCNT)中存放的是当前的计数值,正常情况下用作减1计数器,每来一个计数时钟脉冲,计数器的值减1。重载计数值即计数常数的计算:计数常数

=所需时间间隔/计数时钟周期=所需时间间隔*(PCLK/(预分频器值

+1)/分割因子)位描述初始状态[15:0]看门狗定时器的重载计数值0x8000基于ARM的嵌入式系统接口技术2.计数器寄存器(WTCNT)设置计数器的初始值以及重置计数器值的语句如下。rWTCNT=d; //d表示计数常数(十进制或十六进制),由上面的公式计算得到基于ARM的嵌入式系统接口技术3.数据寄存器(WTDAT)位描述初始状态[15:0]看门狗定时器的当前计数值0x8000数据寄存器(WTDAT)里存放的是看门狗定时器的计数常数值,即看门狗定时器的溢出时间间隔值。数据寄存器(WTDAT)是可读/写的,这个寄存器的功能很简单,就是保存计数常数值,这里存放的值始终不变,并不做减1的操作。基于ARM的嵌入式系统接口技术3.数据寄存器(WTDAT)位描述初始状态[15:0]看门狗定时器的当前计数值0x8000数据寄存器(WTDAT)里存放的是看门狗定时器的计数常数值,即看门狗定时器的溢出时间间隔值。数据寄存器(WTDAT)是可读/写的,这个寄存器的功能很简单,就是保存计数常数值,这里存放的值始终不变,并不做减1的操作。基于ARM的嵌入式系统接口技术8.5.2看门狗定时器的基本操作下面通过一个例子,看看看门狗定时器是如何工作的。例:假设要监测的系统程序的周期不大于40μs,系统时钟频率PCLK=50MHz,设计时假设取分割器因子为16,预分频值为0,则可以得到计数时钟周期如下。计数时钟周期=1/(PCLK/(预分频器值+1)/分割因子)=0.32μs即一个计数脉冲的时间是0.32μs,要产生一个大于40μs的时间间隔,则计数脉冲的个数即计数常数的计算公式如下。计数常数=所需时间间隔/计数时钟周期=40/0.32=125(0x7d)基于ARM的嵌入式系统接口技术8.5.2看门狗定时器的基本操作voidmain()

{

init_system();

.

...

.....

enable_watchdog();

.

...

.....

while(1)

{

feed_dog();

}

}在实际应用中,一般来说feed_dog函数的调用是被安插在定时器的中断服务例程中。定时器的timeout(不是watchdog的timeout)时间长度必须合适,否则在定时器还没来得及发生中断调用feed_dog函数之前,watchdog已经timeout了,将引起系统重起基于ARM的嵌入式系统接口技术例如:监测系统程序的周期不大于40μs,PCLK=50MHz。#definerWTCON(*(volatileunsigned*)0x53000000)#definerWTDAT(*(volatileunsigned*)0x53000004)#definerWTCNT(*(volatileunsigned*)0x53000008)voidwatchdog_init(){

rWTCNT=0x7d;

rWTCON=0x21;}取分割因子为:16,预分频值为:取0计数时钟周期=1/(PCLK/(预分频器值+1)/分割因子)=0.32μs定时周期:T=计数值*计数时钟周期,T=40μs,因此计数值=T/计数时钟周期=40/0.32=125基于ARM的嵌入式系统接口技术汇编语言实现ldr

r0,=WTDAT

;WTDAT寄存器对应的地址赋给R0

ldr

r1,=0x7d

;计数器初始值

str

r1,[r0]

ldr

r0,=WTCON

;WTCON寄存器对应的地址赋给R0

ldr

r1,=0x0021

;使能看门狗及其复位功能,分割器值设为16

str

r1,[r0]

基于ARM的嵌入式系统接口技术8.6回到工作场景二2/1/2023工作过程一修改rtctest.c程序在8.4节所编写的C程序基础上,填加看门狗定时器的功能。在本程序中我们设置在时钟节拍中断里喂狗,每秒中断一次,即每秒喂狗一次。①在主函数中加入看门狗定时器的初始化程序,初始化程序中设置WTCNT计数器的值,并设置看门狗控制寄存器,(这段程序加在Main()函数里面,在设置部分即可,只要不是在while(1)中)。voidMain(void){

……

rWTCNT=0x0800; //此计数值根据程序执行的时间调整

rWTCON=0x7f21;

……}基于ARM的嵌入式系统接口技术工作过程一②时钟节拍中断的设置已经在工作场景一中的程序中完成,在工作场景一中,通过时钟节拍中断使显示的时间每秒钟更新一次。在本场景中,时钟节拍中断除了完成上述功能外,还要在时钟节拍中断的中断处理函数中喂狗。时钟节拍中断的中断处理函数内容如下。voidrtctick_isr(void){Irq_Clear(IRQ_TICK); //清除TICK中断flag++; //原来程序中的内容rWTCNT=0x0800; //加入喂狗}基于ARM的嵌入式系统接口技术工作过程二重新编译工程、下载并运行重新编译工程,并下载到实验箱上运行,观察程序的运行情况,再把中断处理函数中的喂狗部分注释掉,再重新编译工程,并下载到实验箱上运行,观察此时程序运行的情况。结论:当加入看门狗功能,并且每秒中喂狗一次时,程序运行和原来一样;当注释掉喂狗的语句后,程序很快就会重新启动。基于ARM的嵌入式系统接口技术8.7Timer部件2/1/20238.7.1基础知识Timer部件主要是用于提供定时功能、脉宽调制(PWM)功能的部件,它的应用比较灵活,对于需要一定频率的脉冲信号、一定时间间隔的定时信号的应用场合,它都能提供应用支持。s3c2410提供了5个16位的Timer(Timer0~Timer4),其中Timer0~Timer3支持PulseWidthModulation——PWM(脉宽调制)。Timer4是一个内部定时器(internaltimer),没有输出引脚(outputpins)。定时器0有Dead-zone发生器,可以保证一对反向信号不会同时改变状态,常用于大电流设备中。基于ARM的嵌入式系统接口技术8.7.1基础知识脉宽调制(PWM)就是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。广泛应用在从测量、通信到功率控制与变换的许多领域中,例如多相位电机控制、灯光亮度控制、DC-DC转换器等场合。PWM从处理器到被控系统信号都是数字式的,无需进行数模转换。让信号保持为数字形式可将噪声影响降到最小。PWM控制器使得ARM具备了强大的矩形波输出能力,可以十分方便地输出不同频率、不同占空比的矩形波。基于ARM的嵌入式系统接口技术8.7.1基础知识PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。基于ARM的嵌入式系统接口技术PWM信号占空比为10%的PWM输出0.9V的模拟信号供电电压为9V占空比为50%的PWM输出4.5V的模拟信号占空比为70%的PWM输出6.3V的模拟信号基于ARM的嵌入式系统接口技术接通时间、周期、占空比和调制频率以上页例子为例,接通时间为灯泡点亮时间周期为一次通断的时间占空比是接通时间与周期之比调制频率为周期的倒数。要想取得调光灯(保持点亮)的效果,必须提高调制频率。通常调制频率为1kHz到200kHz之间。基于ARM的嵌入式系统接口技术8.7.2Timer部件的基本原理Timer定时器的基本功能原理和通用定时/计数器的原理是相同的,如图所示,图中是S3C2410处理器中五个Timer中的一个Timer的功能原理图,其他四个基本原理与此相同。基于ARM的嵌入式系统接口技术8.7.2Timer部件的基本原理PCLK是Timer的信号源,我们通过设置每个Timer相应的Prescaler和ClockDivider把PCLK转换成输入时钟信号传送给各个Timer的逻辑控制单元(ControlLogic),事实上每个Timer都有一个称为输入时钟频率(TimerinputclockFrequency)的参数,这个频率就是通过PCLK,Prescaler和ClockDivider确定下来的,每个Timer的逻辑控制单元就是以这个频率在工作。基于ARM的嵌入式系统接口技术8.7.2Timer部件的基本原理输入时钟频率的公式:

定时器输入时钟频率=PCLK/(预分频系数+1)/(分割器值)

预分频系数的范围=0~255

分割器值的取值范围=2,4,8,16

定时器在一个工作周期(Timerinputclockcycle)内的具体工作内容主要有3个。分别是:

1.对一个数值进行递减操作

2.把递减后的数值和另一个数值进行比较操作

3.产生中断或执行DMA操作基于ARM的嵌入式系统接口技术8.7.3S3C2410的Timer部件S3C2410提供了5个16位的定时器Timer(Timer0~Timer4)Timer0~Timer3支持PulseWidthModulation——PWM(脉宽调制)。Timer4是一个内部定时器(internaltimer),没有输出引脚(outputpins)。定时器0有Dead-zone发生器,可以保证一对反向信号不会同时改变状态,常用于大电流设备中。基于ARM的嵌入式系统接口技术8.7.3S3C2410的Timer部件定时器0和定时器1使用相同的分频器,但他们的计数器以及控制器是各自独立的,定时器2/3/4情况相同。基于ARM的嵌入式系统接口技术8.7.4Timer部件的基本操作S3C2410定时器有关的寄存器定时器配置寄存器定时器初值计数器以及比较计数器定时器控制寄存器计数观察寄存器(TCNTOn)基于ARM的嵌入式系统接口技术8.7.4Timer部件的基本操作在启用Timer之前我们会对Timer进行一系列初始化操作,然后启动定时器工作。初始化定时器就是设置定时器的预分频系数、设置分割器值、将初始值写到TCNTB和TCMPB寄存器、设置定时器手动更新位。下面我们通过一个简单的例子,利用Timer0做定时器,了解Timer部件的操作步骤。基于ARM的嵌入式系统接口技术1.初始化控制定时器的寄存器符号位描述初始状态reserved[31:24]保留0x00Deadzonelength[23:16]确定死区长度,死区长度的1个单位等于Timer0的定时间隔。0x00Prescaler1[15:8]确定Timer2、Timer3、Timer4的预分频器值0x00Prescaler0[0:7]确定Timer0、Timer1的预分频器值。0x00(1)定时器配置寄存器0(TCFG0)设置预分频系数如要设置Timer0的预分频系数为119:rTCFG0=119; //TCFG0寄存器的位[7:0]确定Timer0、Timer1的预分频器值基于ARM的嵌入式系统接口技术1.初始化控制定时器的寄存器符号位描述初始状态reserved[31:24]保留DMAmode[23:20]选择产生DMA请求的定时器。0000=不选择(所有采用中断请求)0001=Timer0

0010=Timer10011=Timer2

0100=Timer30101=Timer4

0110=保留0000……………………MUX1[7:4]选择Timer1的分割器值。0000=1/2

0001=1/4

0010=1/80011=1/16

01XX=外部TCLK10000MUX0[3:0]选择Timer0的分割器值。0000=1/2

0001=1/4

0010=1/80011=1/16

01XX=外部TCLK10000(2)定时器配置寄存器1(TCFG1)基于ARM的嵌入式系统接口技术1.初始化控制定时器的寄存器(2)定时器配置寄存器1(TCFG1)定时器配置寄存器1(TCFG1)主要用来设置分割器值,并且设置定时器的工作模式为产生中断还是执行DMA操作。TCFG1寄存器是可读/写的如要设置Timer0的分割器值为16

rTCFG1=3; //TCFG1寄存器的位[3:0]选择Timer0的分割器值,0011=1/16基于ARM的嵌入式系统接口技术1.初始化控制定时器的寄存器通过TCFG0、TCFG1的设置,可以确定预分频系数和分割器值,最终通过下面公式计算定时器输入时钟频率。 定时器输入时钟频率=PCLK/(预分频系数+1)/(分割器值)本例中,由上面的条件可以得到Timer0的输入时钟频率如下。

Timer0的输入时钟频率=50700000/(119+1)/16=26406基于ARM的嵌入式系统接口技术1.初始化控制定时器的寄存器符号位描述初始状态TCNTB0[15:0]存放Timer0的计数初始值0x0000TCMPB0[15:0]存放Timer0的比较缓冲值0x0000(3)Ti

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论