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 + -
显示快捷键?