art_sample.c

来自「最新版IAR FOR ARM(EWARM)5.11中的代码例子」· C语言 代码 · 共 286 行

C
286
字号
/**********************************************************************************/
/*                                                                                */
/*    Copyright (C) 2005 Oki Electric Industry Co., LTD.                          */
/*                                                                                */
/*    System Name    :  ML674051/ML4061 series                                    */
/*    Module Name    :  auto reload timer sample program                          */
/*    File   Name    :  art_sample.c                                              */
/*    Revision       :  01.00                                                     */
/*    Date           :  2005/02/21 initial version                                */
/*                                                                                */
/*    Variable 'COUNTER[0-5]' is incremented by timer0-5 interrupt.               */
/**********************************************************************************/
#include "ML674061.h"
#include "common.h"
#include "irq.h"

#ifdef __IAR__
#include "intrinsics.h"
#endif

/* constants */
#define MHz     (1000000L)
#define TMRCYC0 (10)    /* interval of TIMER0 interrupt (ms) */
#define TMRCYC1 (20)    /* interval of TIMER1 interrupt (ms) */
#define TMRCYC2 (30)    /* interval of TIMER2 interrupt (ms) */
#define TMRCYC3 (40)    /* interval of TIMER3 interrupt (ms) */
#define TMRCYC4 (50)    /* interval of TIMER4 interrupt (ms) */
#define TMRCYC5 (60)    /* interval of TIMER5 interrupt (ms) */
#define SYSCLK  (33)    /* SYSCLK (MHz)*/

#define FTM0CON_CLK32   0x5    /* APB_CLK/32 */
#define FTM1CON_CLK32   0x5    /* APB_CLK/32 */
#define FTM2CON_CLK32   0x5    /* APB_CLK/32 */
#define FTM3CON_CLK32   0x5    /* APB_CLK/32 */
#define FTM4CON_CLK32   0x5    /* APB_CLK/32 */
#define FTM5CON_CLK32   0x5    /* APB_CLK/32 */
#define FTM0CON_ART     0x0    /* ART MODE */
#define FTM1CON_ART     0x0    /* ART MODE */
#define FTM2CON_ART     0x0    /* ART MODE */
#define FTM3CON_ART     0x0    /* ART MODE */
#define FTM4CON_ART     0x0    /* ART MODE */
#define FTM5CON_ART     0x0    /* ART MODE */

#define VALUE_OF_TMRLR(N)   /* compare value of TIMER_N */\
                (65536 - (TMRCYC##N * SYSCLK * 1000) / 32)

/* check VALUE_OF_TMRLR */
#if ((VALUE_OF_TMRLR(0)) < 0 || 0x10000 <= (VALUE_OF_TMRLR(0)))
#error Invalid value : VALUE_OF_TMRLR(0)
#elsif ((VALUE_OF_TMRLR(1)) < 0 || 0x10000 <= (VALUE_OF_TMRLR(1)))
#error Invalid value : VALUE_OF_TMRLR(1)
#elsif ((VALUE_OF_TMRLR(2)) < 0 || 0x10000 <= (VALUE_OF_TMRLR(2)))
#error Invalid value : VALUE_OF_TMRLR(2)
#elsif ((VALUE_OF_TMRLR(3)) < 0 || 0x10000 <= (VALUE_OF_TMRLR(3)))
#error Invalid value : VALUE_OF_TMRLR(3)
#elsif ((VALUE_OF_TMRLR(4)) < 0 || 0x10000 <= (VALUE_OF_TMRLR(4)))
#error Invalid value : VALUE_OF_TMRLR(4)
#elsif ((VALUE_OF_TMRLR(5)) < 0 || 0x10000 <= (VALUE_OF_TMRLR(5)))
#error Invalid value : VALUE_OF_TMRLR(5)
#endif

/* functions */
int main(void);                     /* main routine */
static void reg_irq_handler(void);  /* registration of IRQ handler */
static void set_timer(void);        /* setup auto reload timer */
static void timer0_handler(void);   /* TIMER0 handler */
static void timer1_handler(void);   /* TIMER1 handler */
static void timer2_handler(void);   /* TIMER2 handler */
static void timer3_handler(void);   /* TIMER3 handler */
static void timer4_handler(void);   /* TIMER4 handler */
static void timer5_handler(void);   /* TIMER5 handler */

/* global variables */
static volatile int COUNTER[6];     /* 10-60ms cycle counter */

/****************************************************************************/
/*  Entry point                                                             */
/*  Function : main                                                         */
/*      Parameters                                                          */
/*          Input   :   Nothing                                             */
/*          Output  :   0                                                   */
/****************************************************************************/
int main(void)
{
    int i;

    init_irq(); /* initialize IRQ */

    reg_irq_handler();  /* registration of IRQ handler */

    set_timer();    /* setup TIMER */

    /* initialize 10-60ms cycle counter */
    for(i=0; i<6; i++)
        COUNTER[i] = 0;

    /* enable IRQ */
#ifdef __IAR__
      __enable_interrupt();
#else
    irq_en();
#endif

	/* light LED */
    init_led();   /* output mode */
    led_on(LED_START_PATTERN);

    /* start timer */
    put_hvalue(FTMEN, 0x3F);	/* start TIMER0-5 */

    /* infinite loop */
    for(;;)
        ;

//    return 0;
}

/****************************************************************************/
/*  Registration of IRQ Handler                                             */
/*  Function : reg_irq_handler                                              */
/*      Parameters                                                          */
/*          Input   :   Nothing                                             */
/*          Output  :   Nothing                                             */
/****************************************************************************/
void reg_irq_handler(void)
{
    /* register IRQ handlers into IRQ handler table */
    IRQ_HANDLER_TABLE[INT_TIMER0] = timer0_handler; /* TIMER0 */
    IRQ_HANDLER_TABLE[INT_TIMER1] = timer1_handler; /* TIMER1 */
    IRQ_HANDLER_TABLE[INT_TIMER2] = timer2_handler; /* TIMER2 */
    IRQ_HANDLER_TABLE[INT_TIMER3] = timer3_handler; /* TIMER3 */
    IRQ_HANDLER_TABLE[INT_TIMER4] = timer4_handler; /* TIMER4 */
    IRQ_HANDLER_TABLE[INT_TIMER5] = timer5_handler; /* TIMER5 */

    /* setup interrupt level */
    set_wbit(EXILCA, ILC_ILC16 & ILC_INT_LV3); /* timer0(nIR[16]),timer1(nIR[17]) -> 3 */
    set_wbit(EXILCA, ILC_ILC18 & ILC_INT_LV2); /* timer2(nIR[18]),timer3(nIR[19]) -> 2 */
    set_wbit(EXILCA, ILC_ILC20 & ILC_INT_LV1); /* timer4(nIR[20]),timer5(nIR[21]) -> 1 */

    return;
}

/****************************************************************************/
/*  Setup of timer                                                          */
/*  Function : set_timer                                                    */
/*      Parameters                                                          */
/*          Input   :   Nothing                                             */
/*          Output  :   Nothing                                             */
/****************************************************************************/
void set_timer(void)
{
    /* stop timer */
    set_hbit(FTMDIS, FTMDIS_FTMDIS0);   /* TIMER0 */
    set_hbit(FTMDIS, FTMDIS_FTMDIS1);   /* TIMER1 */
    set_hbit(FTMDIS, FTMDIS_FTMDIS2);   /* TIMER2 */
    set_hbit(FTMDIS, FTMDIS_FTMDIS3);   /* TIMER3 */
    set_hbit(FTMDIS, FTMDIS_FTMDIS4);   /* TIMER4 */
    set_hbit(FTMDIS, FTMDIS_FTMDIS5);   /* TIMER5 */

    /* clear timer status register */
    set_hbit(FTM0ST, FTM0ST_CM_CAPEV);   /* TIMER0 */
    set_hbit(FTM1ST, FTM1ST_CM_CAPEV);   /* TIMER1 */
    set_hbit(FTM2ST, FTM2ST_CM_CAPEV);   /* TIMER2 */
    set_hbit(FTM3ST, FTM3ST_CM_CAPEV);   /* TIMER3 */
    set_hbit(FTM4ST, FTM4ST_CM_CAPEV);   /* TIMER4 */
    set_hbit(FTM5ST, FTM5ST_CM_CAPEV);   /* TIMER5 */

    /* setup timer control register */
    put_hvalue(FTM0CON,        /* TIMER0 */
               FTM0CON_CLK32   /* APB_CLK/32 */
              |FTM0CON_ART);   /* ART MODE */
    put_hvalue(FTM1CON, FTM1CON_CLK32|FTM1CON_ART); /* TIMER1 */
    put_hvalue(FTM2CON, FTM2CON_CLK32|FTM2CON_ART); /* TIMER2 */
    put_hvalue(FTM3CON, FTM3CON_CLK32|FTM3CON_ART); /* TIMER3 */
    put_hvalue(FTM4CON, FTM4CON_CLK32|FTM4CON_ART); /* TIMER4 */
    put_hvalue(FTM5CON, FTM5CON_CLK32|FTM5CON_ART); /* TIMER5 */

    /* setup timer counter register */
    set_hbit(FTM0IER, FTM0IER_OVFIE);  /* TIMER0 */
    set_hbit(FTM1IER, FTM1IER_OVFIE);  /* TIMER1 */
    set_hbit(FTM2IER, FTM2IER_OVFIE);  /* TIMER2 */
    set_hbit(FTM3IER, FTM3IER_OVFIE);  /* TIMER3 */
    set_hbit(FTM4IER, FTM4IER_OVFIE);  /* TIMER4 */
    set_hbit(FTM5IER, FTM5IER_OVFIE);  /* TIMER5 */

    /* setup timer compare register */
    put_hvalue(FTM0R, (UHWORD)VALUE_OF_TMRLR(0));  /* TIMER0 */
    put_hvalue(FTM1R, (UHWORD)VALUE_OF_TMRLR(1));  /* TIMER1 */
    put_hvalue(FTM2R, (UHWORD)VALUE_OF_TMRLR(2));  /* TIMER2 */
    put_hvalue(FTM3R, (UHWORD)VALUE_OF_TMRLR(3));  /* TIMER3 */
    put_hvalue(FTM4R, (UHWORD)VALUE_OF_TMRLR(4));  /* TIMER4 */
    put_hvalue(FTM5R, (UHWORD)VALUE_OF_TMRLR(5));  /* TIMER5 */

    return;
}

/****************************************************************************/
/*  Timer0 handler                                                          */
/*  Function : timer0_handler                                               */
/*      Parameters                                                          */
/*          Input   :   Nothing                                             */
/*          Output  :   Nothing                                             */
/****************************************************************************/
void timer0_handler(void)
{
    COUNTER[0]++;  /* increment 10ms cycle counter */
    set_hbit(FTM0ST, FTM0ST_CM_CAPEV); /* clear timer status register */

    return;
}

/****************************************************************************/
/*  Timer1 handler                                                          */
/*  Function : timer1_handler                                               */
/*      Parameters                                                          */
/*          Input   :   Nothing                                             */
/*          Output  :   Nothing                                             */
/****************************************************************************/
void timer1_handler(void)
{
    COUNTER[1]++;  /* increment 20ms cycle counter */
    set_hbit(FTM1ST, FTM1ST_CM_CAPEV); /* clear timer status register */

    return;
}

/****************************************************************************/
/*  Timer2 handler                                                          */
/*  Function : timer2_handler                                               */
/*      Parameters                                                          */
/*          Input   :   Nothing                                             */
/*          Output  :   Nothing                                             */
/****************************************************************************/
void timer2_handler(void)
{
    COUNTER[2]++;  /* increment 30ms cycle counter */
    set_hbit(FTM2ST, FTM2ST_CM_CAPEV); /* clear timer status register */

    return;
}

/****************************************************************************/
/*  Timer3 handler                                                          */
/*  Function : timer3_handler                                               */
/*      Parameters                                                          */
/*          Input   :   Nothing                                             */
/*          Output  :   Nothing                                             */
/****************************************************************************/
void timer3_handler(void)
{
    COUNTER[3]++;  /* increment 40ms cycle counter */
    set_hbit(FTM3ST, FTM3ST_CM_CAPEV); /* clear timer status register */

    return;
}

/****************************************************************************/
/*  Timer4 handler                                                          */
/*  Function : timer4_handler                                               */
/*      Parameters                                                          */
/*          Input   :   Nothing                                             */
/*          Output  :   Nothing                                             */
/****************************************************************************/
void timer4_handler(void)
{
    COUNTER[4]++;  /* increment 50ms cycle counter */
    set_hbit(FTM4ST, FTM4ST_CM_CAPEV); /* clear timer status register */

    return;
}

/****************************************************************************/
/*  Timer5 handler                                                          */
/*  Function : timer5_handler                                               */
/*      Parameters                                                          */
/*          Input   :   Nothing                                             */
/*          Output  :   Nothing                                             */
/****************************************************************************/
void timer5_handler(void)
{
    COUNTER[5]++;  /* increment 60ms cycle counter */
    set_hbit(FTM5ST, FTM5ST_CM_CAPEV); /* clear timer status register */

    return;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?