收藏 分享(赏)

第八讲 定时器.ppt

上传人:kpmy5893 文档编号:8465249 上传时间:2019-06-29 格式:PPT 页数:45 大小:120KB
下载 相关 举报
第八讲 定时器.ppt_第1页
第1页 / 共45页
第八讲 定时器.ppt_第2页
第2页 / 共45页
第八讲 定时器.ppt_第3页
第3页 / 共45页
第八讲 定时器.ppt_第4页
第4页 / 共45页
第八讲 定时器.ppt_第5页
第5页 / 共45页
点击查看更多>>
资源描述

1、第八讲 定时器,内容提要,总体特性功能概述函数讲解举例,8.1 总体特性,在LM3S9B96内部通常集成有4个通用定时器模块(General-Purpose Timer Module,GPTM),分别为Timer0、Timer1、Timer2和Timer3。,Timer模块具有非常丰富的功能:,32位定时器模式 16位定时器模式 16位输入捕获模式 16位PWM模式 ,每个Timer模块都可以配置为一个32位定时器;也可以拆分为两个16位的定时/计数器TimerA和TimerB,它们可以被配置为独立运行的定时器、事件计数器或PWM。,8.2 Timer功能概述,Timer模块的功能在总体上可以

2、分成32位模式和16位模式两大类。在32位模式下,TimerA和TimerB被连在一起形成一个完整的32位计数器。对Timer的各项操作(如装载初值、运行控制、中断控制等)都用对TimerA的操作作为总体上的32位控制,而对TimerB的操作无任何效果。,在16位模式下,对TimerA的操作仅对TimerA有效,对TimerB的操作仅对TimerB有效,即对两者的操控是完全独立进行的。,8.2.1 32位单次触发/周期定时器,在这两种模式中,Timer都被配置成一个32位的递减计数器,用法类似,只是单次触发模式只能定时一次,如果需要再次定时则必须重新配置,而周期模式则可以周而复始地定时,除非被

3、关闭。在计数到0x00000000时,可以输出一个内部的单时钟周期脉冲信号或在软件的控制下触发中断。,8.2.2 16位单次触发/周期定时器,一个32位的Timer可以被拆分为两个单独运行的16位定时/计数器,每一个都可以被配置成16位递减计数器。具体用法跟32位单次触发/周期定时模式类似,不同的是对TimerA和TimerB的操作是分别独立进行的。,8.3 函数讲解,使能配置与控制计数值的装载与获取运行控制中断控制,8.3.1 使能,Timer库函数在使用某个Timer模块之前,应当首先将其使能,方法为: SysCtlPeriEnable(SYSCTL_PERIPH_TIMERn); n取0

4、、1、2或3,8.3.2 配置与控制,函数TimerConfigure( )用来配置Timer的工作模式。,函数TimerConfigure( ),功能:配置Timer模块的工作模式 。 原型:void TimerConfigure(unsigned long ulBase, unsigned long ulConfig) ulBase:Timer模块的基址,取值TIMERn_BASE(n为0、1、2或3) ulConfig:Timer模块的配置,ulConfig 的取值(Timer模块的配置),Timer模块的配置在32位模式下应当取下列值之一: TIMER_CFG_32_BIT_OS /

5、32位单次触发定时器 TIMER_CFG_32_BIT_PER / 32位周期定时器 TIMER_CFG_32_RTC / 32位RTC定时器,/ 配置Timer0为32位单次触发定时器 TimerConfigure(TIMER0_BASE, TIMER_CFG_32_BIT_OS); / 配置Timer1为32位周期定时器 TimerConfigure(TIMER1_BASE, TIMER_CFG_32_BIT_PER); / 配置Timer2为32位RTC定时器 TimerConfigure(TIMER2_BASE, TIMER_CFG_32_RTC);,举例:,在16位模式下,一个32位

6、的Timer被拆分成两个独立运行的子定时器TimerA和TimerB。 配置TimerA的方法是参数ulConfig先取值TIMER_CFG_16_BIT_PAIR再与下列值之一进行“或运算”的组合形式: TIMER_CFG_A_ONE_SHOT / TimerA为单次触发定时器 TIMER_CFG_A_PERIODIC / TimerA为周期定时器 TIMER_CFG_A_CAP_COUNT / TimerA为边沿事件计数器 TIMER_CFG_A_CAP_TIME / TimerA为边沿事件定时器 TIMER_CFG_A_PWM / TimerA为PWM输出 配置TimerB的方法是参数u

7、lConfig先取值TIMER_CFG_16_BIT_PAIR再与下列值之一进行“或运算”的组合形式: TIMER_CFG_B_ONE_SHOT / TimerB为单次触发定时器 TIMER_CFG_B_PERIODIC / TimerB为周期定时器 TIMER_CFG_B_CAP_COUNT / TimerB为边沿事件计数器 TIMER_CFG_B_CAP_TIME / TimerB为边沿事件定时器 TIMER_CFG_B_PWM / TimerB为PWM输出,/ 在Timer0当中,配置TimerA为单次触发定时器(不配置TimerB) TimerConfigure(TIMER0_BASE

8、, TIMER_CFG_16_BIT_PAIR | TIMER_CFG_A_ONE_SHOT); / 在Timer0当中,配置TimerB为周期定时器(不配置TimerA) TimerConfigure(TIMER0_BASE, TIMER_CFG_16_BIT_PAIR | TIMER_CFG_B_PERIODIC); / 在Timer0当中,配置TimerA为单次触发定时器,同时配置TimerB为周期定时器 TimerConfigure(TIMER0_BASE, TIMER_CFG_16_BIT_PAIR | TIMER_CFG_A_ONE_SHOT | TIMER_CFG_B_PERIO

9、DIC);,举例:,8.3.3 计数值的装载与获取,TimerLoadSet( )TimerEnable( )TimerLoadGet( )TimerValueGet( ),TimerLoadSet( ),函数TimerLoadSet( )用来设置Timer的装载值。,函数TimerLoadSet( ),功能:设置Timer的装载值 。 原型 :void TimerLoadSet(unsigned long ulBase, unsigned long ulTimer, unsigned long ulValue) 参数 ulBase:Timer模块的基址,取值TIMERn_BASE(n为0、1

10、、2或3) ulTimer:指定的Timer,取值TIMER_A、TIMER_B或TIMER_BOTH ulValue:32位装载值(32位模式)或16位装载值(16位模式),TimerLoadGet( ),另外,除了单次触发定时器模式以外,在计数器溢出时会自动重新加载装载值。函数TimerLoadGet( )用来获取装载寄存器的值。,函数TimerLoadGet( ),功能 :获取Timer的装载值 。 原型 :unsigned long TimerLoadGet(unsigned long ulBase, unsigned long ulTimer) 参数 ulBase:Timer模块的基

11、址,取值TIMERn_BASE(n为0、1、2或3) ulTimer:指定的Timer,取值TIMER_A、TIMER_B或TIMER_BOTH 返回 :32位装载值(32位模式)或16位装载值(16位模式),TimerValueGet( ),函数TimerValueGet( )用来获取当前Timer计数器的值。,函数TimerValueGet( ),功能 :获取当前的Timer计数值。 原型 :unsigned long TimerValueGet(unsigned long ulBase, unsigned long ulTimer) 参数 ulBase:Timer模块的基址,取值TIME

12、Rn_BASE(n为0、1、2或3) ulTimer:指定的Timer,取值TIMER_A、TIMER_B或TIMER_BOTH 返回 :当前Timer计数值(在16位输入边沿定时捕获模式下,返回的是捕获值,8.3.4 运行控制,函数TimerEnable( )用来使能Timer计数器开始计数,而函数TimerDisable( )用来禁止计数。,TimerEnable( ),在调用TimerEnable( )时会自动把装载值加载到计数器里,以后每输入一个脉冲计数器值就加1或减1(取决于配置的工作模式),而装载寄存器不变。,函数TimerEnable( ),功能 :使能Timer计数(即启动Ti

13、mer) 原型 :void TimerEnable(unsigned long ulBase, unsigned long ulTimer) 参数 ulBase:Timer模块的基址,取值TIMERn_BASE(n为0、1、2或3) ulTimer:指定的Timer,取值TIMER_A、TIMER_B或TIMER_BOTH 返回 :无,函数TimerDisable( ),功能:禁止Timer计数(即关闭Timer) 原型:void TimerDisable(unsigned long ulBase, unsigned long ulTimer) 参数 ulBase:Timer模块的基址,取值T

14、IMERn_BASE(n为0、1、2或3) ulTimer:指定的Timer,取值TIMER_A、TIMER_B或TIMER_BOTH 返回 :无,5.中断控制,Timer模块有多个中断源,有超时中断、匹配中断和捕获中断等。函数TimerIntEnable( )和TimerIntDisable( )用来使能或禁止一个或多个Timer中断源。 函数TimerIntClear( )用来清除一个或多个Timer中断状态,函数TimerIntStatus( )用来获取Timer的全部中断状态。,函数TimerIntEnable( ),功能 :使能Timer的中断 。 原型 :void TimerInt

15、Enable(unsigned long ulBase, unsigned long ulIntFlags) ulBase:Timer模块的基址,取值TIMERn_BASE(n为0、1、2或3) ulIntFlags:被使能的中断源,应当取下列值之一或者它们之间的任意“或运算”组合形式: TIMER_TIMA_TIMEOUT / TimerA超时中断 TIMER_CAPA_MATCH / TimerA捕获模式匹配中断 TIMER_CAPA_EVENT / TimerA捕获模式边沿事件中断 TIMER_TIMB_TIMEOUT / TimerB超时中断 TIMER_CAPB_MATCH / Ti

16、merB捕获模式匹配中断 TIMER_CAPB_EVENT / TimerB捕获模式边沿事件中断 TIMER_RTC_MATCH / RTC匹配中断,函数TimerIntDisable( ),功能 :禁止Timer的中断 原型 :void TimerIntDisable(unsigned long ulBase, unsigned long ulIntFlags) 参数 ulBase:Timer模块的基址,取值TIMERn_BASE(n为0、1、2或3) ulIntFlags:被禁止的中断源 。,函数TimerIntClear( ),功能 :清除Timer的中断。 原型 :void Timer

17、IntClear(unsigned long ulBase, unsigned long ulIntFlags) 参数 ulBase:Timer模块的基址,取值TIMERn_BASE(n为0、1、2或3) ulIntFlags:被清除的中断源。,函数TimerIntStatus( ),功能:获取当前Timer的中断状态 。 原型 :unsigned long TimerIntStatus(unsigned long ulBase, tBoolean bMasked) 参数 ulBase:Timer模块的基址,取值TIMERn_BASE(n为0、1、2或3) bMasked:如果需要获取的是原始

18、的中断状态,则取值false ,如果需要获取的是屏蔽的中断状态,则取值true 返回:中断状态,8.5 举例,#include “inc/hw_ints.h“ #include “inc/hw_memmap.h“ #include “inc/hw_types.h“ #include “driverlib/interrupt.h“ #include “driverlib/sysctl.h“ #include “driverlib/timer.h“ #include “driverlib/gpio.h“ #include “grlib/grlib.h“ #include “drivers/set_

19、pinout.h“ void delay(int d)/延时函数 for( ; d; -d); void Timer0IntHandler(void) TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT);GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3, GPIO_PIN_3);delay(2000000);/延时GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3,GPIO_PIN_3);delay(2000000);/延时 ,int main(void) SysCtlClockSet(SY

20、SCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |SYSCTL_XTAL_16MHZ);PinoutSet();GPIOPadConfigSet(GPIO_PORTF_BASE, GPIO_PIN_3,GPIO_STRENGTH_4MA,GPIO_PIN_TYPE_STD);GPIODirModeSet(GPIO_PORTF_BASE, GPIO_PIN_3, GPIO_DIR_MODE_OUT); GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3,GPIO_PIN_3);SysCtlPeripheralEnab

21、le(SYSCTL_PERIPH_TIMER0);IntMasterEnable();TimerConfigure(TIMER0_BASE, TIMER_CFG_32_BIT_OS);TimerLoadSet(TIMER0_BASE, TIMER_A, 2*SysCtlClockGet();IntEnable(INT_TIMER0A);TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT);TimerEnable(TIMER0_BASE, TIMER_A);while(1) ,单次触发,#include “inc/hw_ints.h“ #include

22、“inc/hw_memmap.h“ #include “inc/hw_types.h“ #include “driverlib/interrupt.h“ #include “driverlib/sysctl.h“ #include “driverlib/timer.h“ #include “driverlib/gpio.h“ #include “grlib/grlib.h“ #include “drivers/set_pinout.h“ void delay(int d)/延时函数 for( ; d; -d); void Timer0IntHandler(void) /TimerIntClea

23、r(TIMER0_BASE, TIMER_TIMA_TIMEOUT);GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3, GPIO_PIN_3);delay(2000000);/延时GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3,GPIO_PIN_3);delay(2000000);/延时 ,int main(void) SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |SYSCTL_XTAL_16MHZ);PinoutSet();GPIOPad

24、ConfigSet(GPIO_PORTF_BASE, GPIO_PIN_3,GPIO_STRENGTH_4MA,GPIO_PIN_TYPE_STD);GPIODirModeSet(GPIO_PORTF_BASE, GPIO_PIN_3, GPIO_DIR_MODE_OUT); GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3,GPIO_PIN_3);SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);IntMasterEnable();TimerConfigure(TIMER0_BASE, TIMER_CFG_32_BIT_

25、PER);TimerLoadSet(TIMER0_BASE, TIMER_A, 2*SysCtlClockGet();IntEnable(INT_TIMER0A);TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT);TimerEnable(TIMER0_BASE, TIMER_A);while(1) ,周期定时,单次触发实现周期闪烁,void Timer0IntHandler(void) TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT);GPIOPinWrite(GPIO_PORTF_BASE, GPIO_

26、PIN_3, GPIO_PIN_3);delay(2000000);/延时GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3,GPIO_PIN_3);delay(2000000);/延时TimerLoadSet(TIMER0_BASE, TIMER_A, 2*SysCtlClockGet();TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT);TimerEnable(TIMER0_BASE, TIMER_A);IntEnable(INT_TIMER0A); ,#include “inc/hw_ints.h“ #inclu

27、de “inc/hw_memmap.h“ #include “inc/hw_types.h“ #include “driverlib/debug.h“ #include “driverlib/interrupt.h“ #include “driverlib/sysctl.h“ #include “driverlib/timer.h“ #include “grlib/grlib.h“ #include “drivers/kitronix320x240x16_ssd2119_8bit.h“ #include “drivers/set_pinout.h“,unsigned long g_ulFlag

28、s; tContext g_sContext;,void Timer0IntHandler(void) TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT); HWREGBITW( ,void Timer1IntHandler(void) TimerIntClear(TIMER1_BASE, TIMER_TIMA_TIMEOUT); HWREGBITW( ,int main(void) tRectangle sRect; SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |

29、 SYSCTL_XTAL_16MHZ); PinoutSet(); Kitronix320x240x16_SSD2119Init(); GrContextInit(,SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0); SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER1); IntMasterEnable(); TimerConfigure(TIMER0_BASE, TIMER_CFG_32_BIT_PER); TimerConfigure(TIMER1_BASE, TIMER_CFG_32_BIT_PER); Time

30、rLoadSet(TIMER0_BASE, TIMER_A, SysCtlClockGet(); TimerLoadSet(TIMER1_BASE, TIMER_A, SysCtlClockGet() / 2); IntEnable(INT_TIMER0A); IntEnable(INT_TIMER1A); TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT); TimerIntEnable(TIMER1_BASE, TIMER_TIMA_TIMEOUT); TimerEnable(TIMER0_BASE, TIMER_A); TimerEnable(TIMER1_BASE, TIMER_A); while(1) ,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报