打印
[ZLG-MCU]

定时器例子程序

[复制链接]
2320|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
x_han|  楼主 | 2008-4-10 15:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
jdwang| | 2008-4-11 07:06 | 只看该作者

定时器实验程序

#include "hw_memmap.h"
#include "hw_types.h"
#include "ssi.h"
#include "gpio.h"
#include "sysctl.h"
#include "systick.h"
#include "timer.h"
#include"interrupt.h"
#define BitRate     9600            // 设定波特率
#define DataWidth   8                // 设定数据宽度
#define PINS1  GPIO_PIN_4
#define PINS2  GPIO_PIN_5
// 此表为7段数码管显示0~F的字模
unsigned char DISP_TAB[16] = {
    0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
    0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E};
int i;
//------------------------------------------------------------------------------------
// 函数名称  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。
     // 循环输出 0~F 的字模
    
    SSIDataPut(SSI_BASE, DISP_TAB);
    i=i+1;
    if (i==16)i=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~F翻数字
// 在本范例中,定时器0被设置为32位的可编程单次触发模式,定时器1则设置为32位的可编
// 程周期触发模式。
//这个程序是在EASYARM101实验板上做的
//------------------------------------------------------------------------------------
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();                                      // 处理器使能。
    // 使能 SSI
    SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI);
  // 使能 GPIO A,B 口
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA|SYSCTL_PERIPH_GPIOB);
  //SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
  // 配置 SSI
    SSIConfig(SSI_BASE, SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, BitRate, DataWidth);
  // 使能 SSI
    SSIEnable(SSI_BASE);
  // 设定 GPIO A 2~5 引脚为使用外设功能(管脚由硬件控制)
    GPIODirModeSet(GPIO_PORTA_BASE, (GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 |
                 GPIO_PIN_5), GPIO_DIR_MODE_HW);

    GPIODirModeSet(GPIO_PORTB_BASE, PINS1 | PINS2,GPIO_DIR_MODE_OUT);
                                                         // 设置 GPIO B4和B5为输出口。
    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, 2*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);   // 使能定时器0为溢出中断。
    TimerIntEnable(TIMER1_BASE, TIMER_TIMA_TIMEOUT);   // 使能定时器1为溢出中断。

    TimerEnable(TIMER0_BASE, TIMER_A);                //使能定时器0
    TimerEnable(TIMER1_BASE, TIMER_A);                //使能定时器1
    i=0;

    while(1);                                         //循环等待中断
}

使用特权

评论回复
板凳
x_han|  楼主 | 2008-4-11 11:41 | 只看该作者

定时器例子程序

谢谢楼上的

使用特权

评论回复
地板
zlgmcu| | 2008-4-11 13:56 | 只看该作者

我也发一个

定时器有多种用法:
    32位单次/周期定时
    32位RTC定时
    16位单次/周期定时
    16位边沿/定时捕获
    16位PWM


下面是32位周期定时的例子

#include  "hw_types.h"
#include  "hw_memmap.h"
#include  "hw_ints.h"
#include  "hw_sysctl.h"
#include  "hw_gpio.h"
#include  "hw_timer.h"
#include  "interrupt.h"
#include  "sysctl.h"
#include  "gpio.h"
#include  "timer.h"

#define  SysCtlPeriEn                SysCtlPeripheralEnable
#define  GPIOPinTypeIn                GPIOPinTypeGPIOInput
#define  GPIOPinTypeOut                GPIOPinTypeGPIOOutput

#define  LED                        GPIO_PORTB_BASE , GPIO_PIN_0
#define  T0_A                        TIMER0_BASE , TIMER_A
#define  T0_CFG_32_PER                TIMER0_BASE , TIMER_CFG_32_BIT_PER
#define  T0_A_INT_TIMEOUT            TIMER0_BASE , TIMER_TIMA_TIMEOUT
#define  KEY_JTAG                    GPIO_PORTA_BASE , GPIO_PIN_2

void  waitJTAG ( void )
{
    SysCtlPeriEn ( SYSCTL_PERIPH_GPIOA ) ;                /* 使能GPIOA端口                */
    GPIOPinTypeIn ( KEY_JTAG ) ;                        /* 设置按键所在的PA2管脚为输入    */
    if ( GPIOPinRead ( KEY_JTAG )  ==  0x00 ) {            /* 如果有键按下,则进入            */
        for ( ; ; ) ;                                    /* 死循环,以等待JTAG连接        */
    }
}

void  Timer0Init ( void )
{
    SysCtlPeriEn ( SYSCTL_PERIPH_TIMER0 ) ;                /* 使能定时器模块                */
    TimerConfigure ( T0_CFG_32_PER ) ;                    /* 配置定时器为32位周期定时器    */
    TimerLoadSet ( T0_A , 3000000UL ) ;                    /* 设置定时器初值                */
    TimerIntEnable ( T0_A_INT_TIMEOUT ) ;                /* 使能定时器超时中断            */
    IntEnable ( INT_TIMER0A ) ;                            /* 使能定时器中断                */
    IntMasterEnable ( ) ;                                /* 使能处理器中断                */
    TimerEnable ( T0_A ) ;                                /* 使能定时器计数                */
}

int  main ( void )
{
    waitJTAG ( ) ;                                        /* 防止JTAG失效                    */

    SysCtlPeriEn ( SYSCTL_PERIPH_GPIOB ) ;                /* 使能GPIOB端口                */
    GPIOPinTypeOut ( LED ) ;                            /* 设置LED所在管脚为输出        */
    Timer0Init ( ) ;                                    /* 定时器初始化                    */

    for ( ; ; ) {
    }
}

/*  定时器的中断服务函数  */
void  Timer0A_ISR ( void )
{
    static  unsigned char  ucVal  =  0x00 ;

    TimerIntClear ( T0_A_INT_TIMEOUT ) ;                /* 清除定时器超时中断,重要!    */
    GPIOPinWrite ( LED , ucVal ) ;                        /* 反转LED                        */
    ucVal  ^=  0x01 ;
}


(zlgmcu_wdx)

使用特权

评论回复
5
Andy1990zx| | 2008-4-12 15:14 | 只看该作者

IAR

我发现用IAR在线调试的时候暂停后定时器计数值仍然在继续计数  能不能让他们也停下来?我的意思也就是能不能让定时器只计算代码运行的时间,而不是一直在计算实际运行的时间?
    好像用WAVE6000在51上可以这样的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

5

帖子

0

粉丝