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