main.c

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

C
167
字号
/*************************************************************************
 *
 *    Used with ICCARM and AARM.
 *
 *    (c) Copyright IAR Systems 2005
 *
 *    File name   : main.c
 *    Description : Define main module
 *
 *    History :
 *    1. Data        : 17 Oct. 2005
 *       Author      : SBB
 *       Description : Create
 *
 *  DIP Switch settins for iFlash configuration:
 *    DEBUG (0) - x
 *    BOOT0 (1) - ON
 *    BOOT1 (2) - ON
 *  DIP Switch settins for xFlash configuration:
 *    DEBUG (0) - OFF
 *    BOOT0 (1) - OFF
 *    BOOT1 (2) - ON
 *
 *    $Revision: 14941 $
**************************************************************************/
#include <intrinsics.h>
#include "ML69Q6203.h"
#include "arm_comm.h"

/* internal I/O input/output macro */
#define get_value(n)    (*((volatile unsigned char  *)(n)))         /* byte input */
#define put_value(n,c)  (*((volatile unsigned char  *)(n)) = (c))   /* byte output */
#define get_hvalue(n)   (*((volatile unsigned short *)(n)))         /* half word input */
#define put_hvalue(n,c) (*((volatile unsigned short *)(n)) = (c))   /* half word output */
#define get_wvalue(n)   (*((volatile unsigned int   *)(n)))         /* word input */
#define put_wvalue(n,c) (*((volatile unsigned int   *)(n)) = (c))   /* word output */
#define set_bit(n,c)    (*((volatile unsigned char  *)(n))|= (c))   /* byte bit set */
#define clr_bit(n,c)    (*((volatile unsigned char  *)(n))&=~(c))   /* byte bit clear */
#define set_hbit(n,c)   (*((volatile unsigned short *)(n))|= (c))   /* half word bit set */
#define clr_hbit(n,c)   (*((volatile unsigned short *)(n))&=~(c))   /* half word bit clear */
#define set_wbit(n,c)   (*((volatile unsigned int   *)(n))|= (c))   /* word bit set */
#define clr_wbit(n,c)   (*((volatile unsigned int   *)(n))&=~(c))   /* word bit clear */

#define IRQSIZE           64
#define LED_START_PATTERN 0

typedef void IRQ_HANDLER (void);
typedef IRQ_HANDLER *pIRQ_HANDLER;

/* Table of IRQ handler */
pIRQ_HANDLER IRQ_HANDLER_TABLE[IRQSIZE];

/* LED lighting pattern table */
const unsigned char led_table[] =
{
  0x0C,  /*  0  0000_1100 */
  0x18,  /*  1  0001_1000 */
  0x50,  /*  2  0101_0000 */
  0x42,  /*  3  0100_0010 */
  0x03,  /*  4  0000_0011 */
  0x21,  /*  5  0010_0001 */
  0x60,  /*  6  0110_0000 */
  0x44,  /*  7  0100_1000 */
};

#define TMRCYC  (10)            /* interval of timer interrupt (ms) */
#define CLKTMRI (7500000L)      /* clktmri (Hz) */
/* reload value of timer */
#define VALUE_OF_TMRLR  (unsigned int)((0x1000L * (16 * 1000) - ((TMRCYC * CLKTMRI))) / (16 * 700))

volatile unsigned long counter;

/*************************************************************************
 * Function Name: IRQ_Handler
 * Parameters: none
 *
 * Return: none
 *
 * Description: IRQ handler
 *
 *************************************************************************/
__arm __irq void IRQ_Handler(void)
{
int vector = get_wvalue(CIL);
  if(vector < IRQSIZE)
  {
    IRQ_HANDLER_TABLE[vector]();
  }
  vector = get_wvalue(IRQ);
}

/*************************************************************************
 * Function Name: timer_handler
 * Parameters: none
 *
 * Return: none
 *
 * Description: timer hainterrupt handler
 *
 *************************************************************************/
void timer_handler(void)
{
    ++counter;
    put_wvalue(TMOVF, 0x00000001);      /* clear TMOVF register (write '1' in TMOVF[0]) */
    return;
}


/*************************************************************************
 * Function Name: main
 * Parameters: none
 *
 * Return: none
 *
 * Description: Main subroutine
 *
 *************************************************************************/
int main(void)
{
int i,led_count;
  /* initialize LED */
  put_hvalue(GPPME,0x00FF);             /* set output mode */
  put_hvalue(GPPOE, LED_START_PATTERN); /* light LED start pattern */

  /* initialize IRQ registers */
  put_wvalue(ILC0, 0x0);                /* all interrupt level is set as 0 */
  put_wvalue(ILC1, 0x0);                /* all interrupt level is set as 0 */
  put_wvalue(IRQS, 0x0);                /* cancel soft interrupt */
  put_wvalue(CIL, 0x0FE);               /* clear CIL register */

  /* initialize IRQ handler table */
  for(i=0; i<IRQSIZE; i++)
  {
    IRQ_HANDLER_TABLE[i] = NULL;        /* no interrupt handler is defined */
  }

  /* register IRQ handlers into handler table */
  IRQ_HANDLER_TABLE[INT_SYSTEM_TIMER] = timer_handler;

  /* setup interrupt level */
  set_wbit(ILC0, 0x00000001);           /* system timer(nIRQ[0]) -> level1 */

  /* setup of timer */
  put_wvalue(TMEN,  0x00000000);        /* disable timer (write '0' in TMEN[0])*/
  put_wvalue(TMOVF, 0x00000001);        /* clear overflow register (write '1' in TMOVF[0])*/

  put_wvalue(TMRLR, VALUE_OF_TMRLR);    /* set TMRLR */

  /* initialize variable */
  led_count = 0;
  counter = 0;
  __enable_interrupt();                 /* enable interrupts */
  put_wvalue(TMEN, 0x01);               /* timer start */

  while(1)
  {
    if(counter >= 50)
    {
      /* timer interrupt occur? */
      counter = 0;
      put_hvalue(GPPOE, led_table[led_count % sizeof(led_table)]); /* light LED */
      /* update led_count */
      led_count++;
    }
  }
}

⌨️ 快捷键说明

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