9009|12

545

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

LM3S8962定时器操作 [复制链接]

一、Timer总体特性

LM3S8962定时器定时器模块提供 2 16 位的定时器/计数器,它们可以配置成用作独立的定时器或事件 计数器,也可以用作一个 32 位的定时器或一个 32 位的实时时钟(RTC)。对于这个定时器 API 来说,提供的 2 个定时器称为 TimerA TimerB 当配置用作一个 32 位或 16 位的定时器时,定时器可设置成作为一个单次触发的定时器 或一个连续的定时器来运行。如果配置用作一个单次触发的定时器,定时器的值到达零时将 停止计数。如果配置用作一个连续的定时器,定时器的值到达零时将从重装值开始继续计数。 当定时器配置用作一个 32 位的定时器时,它也可以用作一个 RTC定时器,可以拆分为两个16位的定时/计数器TimerATimerB,它们可以被配置为独立运行的定时器、事件计数器或PWM

二、Timer功能概述

Timer模块的功能在总体上可以分成32位模式和16位模式两大类。在32位模式下,TimerATimerB被连在一起形成一个完整的32位计数器,对Timer的各项操作,如装载初值、运行控制、中断控制等,都用对TimerA的操作作为总体上的32位控制,而对TimerB的操作无任何效果。在16位模式下,对TimerA的操作仅对TimerA有效,对TimerB的操作仅对TimerB有效,即对两者的操控是完全独立进行的。

[ 本帖最后由 beyondvv 于 2010-11-13 18:05 编辑 ]

最新回复

谢谢楼主~~学习了~~  详情 回复 发表于 2013-8-28 15:30
 
点赞 关注

回复
举报

545

帖子

0

TA的资源

一粒金砂(高级)

沙发
 

1 32位单次触发/周期定时器

在这两种模式中,Timer都被配置成一个32位的递减计数器,用法类似,只是单次触发模式只能定时一次,如果需要再次定时则必须重新配置,而周期模式则可以周而复始地定时,除非被关闭。在计数到0x00000000时,可以在软件的控制下触发中断或输出一个内部的单时钟周期脉冲信号,该信号可以用来触发ADC采样。

2 32RTC定时器

在该模式中,Timer被配置成一个32位的递增计数器。

RTC功能的时钟源来自偶数CCP管脚的输入。在LM3S101/102里,RTC时钟信号从专门的“32KHz”管脚输入。输入的时钟频率应当为精准的32.768KHz,在芯片内部有一个RTC专用的预分频器,固定为32768分频。因此最终输入到RTC计数器的时钟频率正好是1Hz,即每过1秒钟RTC计数器增1

RTC计数器从0x00000000开始计满需要232秒,这是个极长的时间,有136年!因此RTC真正的用法是:初始化后不需要更改配置(调整时间或日期时例外),只需要修改匹配寄存器的值,而且要保证匹配值总是超前于当前计数值。每次匹配时可产生中断(如果中断已被使能),据此可以计算出当前的年月日、时分秒以及星期。在中断服务函数里应当重新设置匹配值,并且匹配值仍要超前于当前的计数值。

3 16位单次触发/周期定时器

一个32位的Timer可以被拆分为两个单独运行的16位定时/计数器,每一个都可以被配置成带8位预分频(可选功能)的16位递减计数器。如果使用8位预分频功能,则相当于24位定时器。具体用法跟32位单次触发/周期定时模式类似,不同的是对TimerATimerB的操作是分别独立进行的。

4 16位输入边沿计数捕获

在该模式中,TimerATimerB被配置为能够捕获外部输入脉冲边沿事件的递减计数器。共有3种边沿事件类型:正边沿、负边沿、双边沿。

该模式的工作过程是:设置装载值,并预设一个匹配值(应当小于装载值);计数使能后,在特定的CCP管脚每输入1个脉冲(正边沿、负边沿或双边沿有效),计数值就减1;当计数值与匹配值相等时停止运行并触发中断(如果中断已被使能)。如果需要再次捕获外部脉冲,则要重新进行配置。

5 16位输入边沿定时捕获

在该模式中,TimerATimerB被配置为自由运行的16位递减计数器,允许在输入信号的上升沿或下降沿捕获事件。

该模式的工作过程是:设置装载值(默认为0xFFFF)、捕获边沿类型;计数器被使能后开始自由运行,从装载值开始递减计数,计数到0时重装初值,继续计数;如果从CCP管脚上出现有效的输入脉冲边沿事件,则当前计数值被自动复制到一个特定的寄存器里,该值会一直保存不变,直至遇到下一个有效输入边沿时被刷新。为了能够及时读取捕获到的计数值,应当使能边沿事件捕获中断,并在中断服务函数里读取。

 
 

回复

545

帖子

0

TA的资源

一粒金砂(高级)

板凳
 

6 16PWM

Timer模块还可以用来产生简单的PWM信号。在Stellaris系列ARM众多型号当中,对于片内未集成专用PWM模块的,可以利用Timer模块的16PWM功能来产生PWM信号,只不过功能较为简单。对于片内已集成专用PWM模块的,但仍然不够用时,则可以从Timer模块借用。

PWM模式中,TimerATimerB被配置为16位的递减计数器,通过设置适当的装载值(决定PWM周期)和匹配值(决定PWM占空比)来自动地产生PWM方波信号从相应的CCP管脚输出。在软件上,还可以控制输出反相,参见函数TimerControlLevel( )

 

 
 
 

回复

545

帖子

0

TA的资源

一粒金砂(高级)

4
 

三、定时器常用库函数:

TimerConfigure 配置定时器。

函数类型: void TimerConfigure(unsigned long ulBase unsigned long ulConfig) 参数: ulBase 是定时器模块的基址。 ulConfig 是定时器的配置。 描述:

这个函数配置定时器的工作模式。定时器模块在配置前被禁止,并保持在禁止状态。 ulConfig 指定的配置为下面的其中一个:

TIMER_CFG_32_BIT_OS32 位单次触发定时器;

TIMER_CFG_32_BIT_PER32 位周期定时器;

TIMER_CFG_32_RTC32 位实时时钟定时器;

TIMER_CFG_16_BIT_PAIR2 16 位的定时器。

 当配置成一对 16 位的定时器时,每个定时器单独配置。通过将 ulConfig 设置成下列其 中一个值和 ulConfig 的逻辑或结果的方法来配置第一个定时器:

TIMER_CFG_A_ONE_SHOT16 位的单次触发定时器;

TIMER_CFG_A_PERIODIC16 位的周期定时器;

TIMER_CFG_A_CAP_COUNT16 位的边沿计数捕获;

TIMER_CFG_A_CAP_TIME16 位的边沿时间捕获;

TIMER_CFG_A_PWM16 PWM 输出。 类似地,通过将 ulConfig 设置成一个相应的 TIMER_CFG_B_*值和 ulConfig 的逻辑或 结果的方法来配置第二个定时器。

返回: 无。

 
 
 

回复

545

帖子

0

TA的资源

一粒金砂(高级)

5
 

TimerDisable 禁止定时器。

函数原型: void TimerDisable(unsigned long ulBase, unsigned long ulTimer) 参数: ulBase 是定时器模块的基址。 ulTimer 指定禁止的定时器;必须是 TIMER_ATIMER_B TIMER_BOTH 中的一个。 描述: 这个函数将禁止定时器模块的操作。 返回:

TimerEnable 使能定时器。 函数原型: void TimerEnable(unsigned long ulBase, unsigned long ulTimer) 参数: ulBase 是定时器模块的基址。 ulTimer 指定使能的定时器;必须是 TIMER_ATIMER_B TIMER_BOTH 中的一个。 描述:这个函数将使能定时器模块的操作。定时器必须在使能前进行配置。 返回: 无。

TimerIntClear 清除定时器中断源。

函数原型: void TimerIntClear(unsigned long ulBase, unsigned long ulIntFlags) 参数: ulBase 是定时器模块的基址。 ulIntFlags 是被清除的中断源的位屏蔽。 描述: 清除指定的定时器中断源,使其不再有效。这必须在中断处理程序中处理,以防在退出 时再次对其立即进行调用。

TimerIntEnable 使能单个定时器中断源。 函数原型: void TimerIntEnable(unsigned long ulBase, unsigned long ulIntFlags) 参数:ulBase 是定时器模块的基址。

ulIntFlags 是被使能的中断源的位屏蔽。 描述: 使能指示的定时器中断源。只有使能的中断源才能反映为处理器中断;禁能的中断源对处理器没有任何影响。 参数 ulIntFlags 必须是下列值任意组合的逻辑或:  TIMER_CAPB_EVENT:捕获 B 事件中断;  TIMER_CAPB_MATCH:捕获 B 匹配中断; TIMER_TIMB_TIMEOUT:定时器 B 超时中断;  TIMER_RTC_MATCHRTC 中断屏蔽; TIMER_CAPA_EVENT:捕获 A 事件中断;  TIMER_CAPA_MATCH:捕获 A 匹配中断; TIMER_TIMA_TIMEOUT:定时器 A 超时中断。 返回: 无。

 

 
 
 

回复

545

帖子

0

TA的资源

一粒金砂(高级)

6
 

TimerIntStatus 获取当前的中断状态。 函数原型: unsigned long TimerIntStatus(unsigned long ulBase, tBoolean bMasked)

参数: ulBase 是定时器模块的基址。 bMasked:如果需要的是原始的中断状态,则 bMasked False;如果需要的是屏蔽的 中断状态,则 bMasked True描述: 这个函数返回定时器模块的中断状态。原始的中断状态或允许反映到处理器中的中断的状态被返回。 返回: 返回当前的中断状态,通过 TimerIntEnable()描述的一个位字段的值列举出来。

TimerLoadSet 设置定时器装载值。

函数原型: void TimerLoadSet(unsigned long ulBase, unsigned long ulTimer, unsigned long ulValue) 参数: ulBase 是定时器模块的基址。 ulTimer 指定调整的定时器;它的值必须是 TIMER_ATIMER_B TIMER_BOTH 中 的一个。当定时器配置成执行 32 位的操作时,只使用 TIMER_AulValue 是装载值。 描述: 这个函数设置定时器装载值;如果定时器正在运行,则该值将立刻被装载入定时器中。 返回: 无。

 

下面以一个简单的定时器中断程序来说明定时器的操作。

程序是这样的:定时器0被设置为32位的可编程周期触发模式,定时器设置为每秒产生一次中断; 每个中断处理器在每一次中断时都翻转一次相应的GPIO,同时,用LED1指示灯会指示每次中断以及中断的速率。

#define     PINS1  GPIO_PIN_0          /*  定义LED1                */

/******************************************************************************** Function name:           Timer0A_ISR

** Descriptions:            定时器0中断处理程序。工作在32位周期触发模式下。

**                          KEIL软件时,在Startup.S中添加该中断函数名

void Timer0A_ISR (void)

{

   TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT); /清除定时器0中断    */

    GPIOPinWrite(GPIO_PORTF_BASE, PINS1, GPIOPinRead(GPIO_PORTF_BASE, PINS1) ^ PINS1);

                                             /*  翻转GPIO F0 端口      */

    TimerEnable(TIMER0_BASE, TIMER_A);        /* 使能定时器0            */

}

 

 

[ 本帖最后由 beyondvv 于 2010-11-13 17:49 编辑 ]
 
 
 

回复

545

帖子

0

TA的资源

一粒金砂(高级)

7
 

int  main (void)

{

    SysCtlClockSet( SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |

                               SYSCTL_XTAL_8MHZ );      /*  设定晶振为时钟源            */

    SysCtlPeripheralEnable( SYSCTL_PERIPH_TIMER0 );   /*使能定时器0外设   */

    SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOF    );  /*  GPIOF口外设          */

    IntMasterEnable();                        /*  使能全局中断                */

    GPIOPinTypeTimer(TIMER0_BASE, TIMER_A);

         GPIODirModeSet(GPIO_PORTF_BASE, PINS1, GPIO_DIR_MODE_OUT);

                                                                 /*  设置 GPIO F0为输出口        */

    GPIOPadConfigSet(GPIO_PORTF_BASE,PINS1, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD);

                                /*  配置端口类型 */

         GPIOPinWrite(GPIO_PORTF_BASE, PINS1, 0);  /* 初始化IO  */

    TimerConfigure(TIMER0_BASE,      TIMER_CFG_32_BIT_PER);     /*  设置定时器0为周期触发模式   */

    TimerLoadSet(TIMER0_BASE, TIMER_A, SysCtlClockGet());  /*  设置定时器装载值: SysCtlClockGet()返回8000 000个时钟,即一秒*/

    TimerIntEnable(TIMER0_BASE,       TIMER_TIMA_TIMEOUT); /*设置定时器为溢出中断  */

    TimerEnable(TIMER0_BASE, TIMER_A);                                  /*  使能定时器0                 */

    IntEnable(INT_TIMER0A);                                             /*  使能定时器0外设             */

while (1)

{

    }

} time32.rar (54.73 KB, 下载次数: 100)

[ 本帖最后由 beyondvv 于 2010-11-13 20:04 编辑 ]
 
 
 

回复

1万

帖子

16

TA的资源

版主

8
 

好唉,学习了

 
个人签名http://shop34182318.taobao.com/
https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
 
 

回复

545

帖子

0

TA的资源

一粒金砂(高级)

9
 

共同学习

 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

10
 

程序不能实现功能

我现在用EasyARM101板子初步学习lm3s101 编写了一个程序就是功能不能实现  请问问题出在什么地方? 程序如下:

#include "hw_memmap.h"
#include "hw_types.h"
#include "gpio.h"
#include "sysctl.h"
#include "timer.h"
#include"interrupt.h"

#define PINS1  GPIO_PIN_4
#define PINS2  GPIO_PIN_5

//------------------------------------------------------------------------------------
// 函数名称  Timer0A
// 函数功能  定时器0中断处理程序。工作在32位单次触发模式下。
// 输入参数  无。
// 输出参数  无。
//------------------------------------------------------------------------------------
void Timer0A(void)
{

    TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT);    // 清除定时器0中断。

    TimerLoadSet(TIMER0_BASE, TIMER_A, SysCtlClockGet());  // 重载定时器的值。

    GPIOPinWrite(GPIO_PORTB_BASE,PINS1,GPIOPinRead(GPIO_PORTB_BASE, PINS1) ^ PINS1);
                                                          // 翻转GPIO B4 端口。
    TimerEnable(TIMER0_BASE, TIMER_A);                   // 使能定时器0。

}

//------------------------------------------------------------------------------------
// 函数名称  Timer1A
// 函数功能  定时器1中断处理程序。工作在32位周期触发模式下。
// 输入参数  无。
// 输出参数  无。
//------------------------------------------------------------------------------------
void Timer1A(void)
{

    TimerIntClear(TIMER1_BASE, TIMER_TIMA_TIMEOUT);    // 清除定时器1中断。

    GPIOPinWrite(GPIO_PORTB_BASE, PINS2,GPIOPinRead(GPIO_PORTB_BASE, PINS2) ^ PINS2);
                                                         // 翻转GPIO B5 端口
}

//------------------------------------------------------------------------------------
//
// 该范例程序演示了如何使用定时器产生周期性中断。其中一个定时器被设置为每秒产生一次中
// 断,另一个定时器设置为每秒产生两次中断;每个中断处理器在每一次中断时都翻转一次相应
// 的GPIO(B4和B5端口);同时,LED指示灯会指示每次中断以及中断的速率。
// 在本范例中,定时器0被设置为32位的可编程单次触发模式,定时器1则设置为32位的可编
// 程周期触发模式。
//
//------------------------------------------------------------------------------------
int  main(void)
{
    SysCtlClockSet( SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
                  SYSCTL_XTAL_6MHZ );                  // 设定晶振为时钟源。
                  
    SysCtlPeripheralEnable( SYSCTL_PERIPH_TIMER0 );        // 使能定时器0外设。
    SysCtlPeripheralEnable( SYSCTL_PERIPH_TIMER1 );        // 使能定时器1外设。

    SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOB );         // 使能GPIO B口外设。

    IntMasterEnable();                                      // 处理器使能。

    GPIODirModeSet(GPIO_PORTB_BASE, PINS1 | PINS2,GPIO_DIR_MODE_OUT);
                                                         // 设置 GPIO B0和B1为输出口。
    GPIOPinWrite(GPIO_PORTB_BASE, PINS1 | PINS2,0);     // 初始化IO口。

    TimerConfigure(TIMER0_BASE, TIMER_CFG_32_BIT_OS);  // 设置定时器0为单次触发模式。
    TimerConfigure(TIMER1_BASE, TIMER_CFG_32_BIT_PER); // 设置定时器1为周期触发模式。

    TimerLoadSet(TIMER0_BASE, TIMER_A, SysCtlClockGet());  // 设置定时器装载值。定时1秒。
    TimerLoadSet(TIMER1_BASE, TIMER_A, SysCtlClockGet()/2); // 设置定时器装载值。定时0.5秒。

    TimerIntRegister(TIMER0_BASE,TIMER_A,Timer0A);
    TimerIntRegister(TIMER1_BASE,TIMER_A,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);
}

 
 
 

回复

89

帖子

0

TA的资源

一粒金砂(高级)

11
 

回复 7楼 beyondvv 的帖子

金属狂人  你的主函数里  
GPIOPinTypeTimer(TIMER0_BASE, TIMER_A);

是不是定义错误了啊?  应该是  GPIOPinTypeTimer(unsigned long ulPort, unsigned char ucPins)  吧?
 
 
 

回复

19

帖子

0

TA的资源

一粒金砂(中级)

12
 
学习了…
 
 
 

回复

22

帖子

2

TA的资源

一粒金砂(中级)

13
 
谢谢楼主~~学习了~~
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表