⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ex9c_main.c

📁 GCC arm startup example2 for LPC series
💻 C
字号:
/* ex9c_main.c
 *
 * EINT0 is a vectored IRQ, while EINT[1:3] are non-vectored IRQ
 * (software generated interrupt source)
 */
#include "led.h"

/* ----------------------------------------------------------------
 * LPC2138 registers
 * ----------------------------------------------------------------
 */
#define VICIRQStatus    (*((volatile unsigned long *) 0xFFFFF000))
#define VICIntSelect    (*((volatile unsigned long *) 0xFFFFF00C))
#define VICIntEnable    (*((volatile unsigned long *) 0xFFFFF010))
#define VICSoftInt      (*((volatile unsigned long *) 0xFFFFF018))
#define VICSoftIntClear (*((volatile unsigned long *) 0xFFFFF01C))
#define VICVectAddr     (*((volatile unsigned long *) 0xFFFFF030))
#define VICDefVectAddr  (*((volatile unsigned long *) 0xFFFFF034))
#define VICVectAddr0    (*((volatile unsigned long *) 0xFFFFF100))
#define VICVectCntl0    (*((volatile unsigned long *) 0xFFFFF200))

/* ----------------------------------------------------------------
 * Function declarations and globals
 * ----------------------------------------------------------------
 */
void irq_init();
void fiq_handler(void);
typedef void(*irq_handler_t)(void);

void irq_handler(void);
void default_handler(void);

void eint0_handler(void);
void eint1_handler(void);
void eint2_handler(void);
void eint3_handler(void);

/* IRQ register bit locations */
#define EINT0 (1 << 14)
#define EINT1 (2 << 14)
#define EINT2 (4 << 14)
#define EINT3 (8 << 14)

/* ----------------------------------------------------------------
 * Function definitions
 * ----------------------------------------------------------------
 */

/* Setup the external interrupt and enable IRQ interrupts */
void irq_init(void)
{
  /* Setup the VIC to have EINT0 generate IRQs */
  VICIntSelect   = 0;                            /* Select IRQ      */
  VICDefVectAddr = (unsigned long)default_handler;/* Default Vector */
  VICVectAddr0   = (unsigned long)eint0_handler; /* Vector 0        */
  VICVectCntl0   = 0x20 | 14;                    /* EINT0 Interrupt */
  VICIntEnable   = (0xF << 14);                  /* Enable EINT[0:3]*/
}

/* VICVectAddr dispatch loop */
void irq_handler(void)
{
	/* Process IRQ interrupts */
	irq_handler_t handler;
	while (VICIRQStatus) {
		/* Get the address of the highest priority handler */
		handler = (irq_handler_t)VICVectAddr;

		/* Execute the handler */
		(*handler)();

		/* Acknowledge the VIC */
		VICVectAddr = 0;
	}
}

void default_handler(void)
{
	if (VICIRQStatus & EINT1)
		eint1_handler();
	if (VICIRQStatus & EINT2)
		eint2_handler();
	if (VICIRQStatus & EINT3)
		eint3_handler();
}

void eint0_handler(void)
{
	led_clr(1);
	VICSoftIntClear = EINT0;
}

void eint1_handler(void)
{
	led_clr(2);
	VICSoftIntClear = EINT1;
}

void eint2_handler(void)
{
	led_clr(4);
	VICSoftIntClear = EINT2;
}

void eint3_handler(void)
{
	led_clr(8);
	VICSoftIntClear = EINT3;
}

/* Empty handler (since the startup code references it) */
void fiq_handler(void)
{
	return;
}

/* ----------------------------------------------------------------
 * Application
 * ----------------------------------------------------------------
 */
int main (void)
{
	led_init();
	/* Start low */
	led(0);
	irq_init();

	while(1) {
		/* Rising edge */
		led_set(0xF);

		/* Trigger interrupts */
		VICSoftInt = (0xF << 14);
	}
	return 0;
}

⌨️ 快捷键说明

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