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

📄 ex6b_main.c

📁 GCC arm startup example for beginners
💻 C
字号:
/* ex6b_main.c */
#include "led.h"

/* ----------------------------------------------------------------
 * LPC2138 registers
 * ----------------------------------------------------------------
 */
#define PINSEL0        (*((volatile unsigned long *) 0xE002C000))
#define EXTINT         (*((volatile unsigned long *) 0xE01FC140))
#define EXTMODE        (*((volatile unsigned long *) 0xE01FC148))
#define EXTPOLAR       (*((volatile unsigned long *) 0xE01FC14C))
#define VICIntSelect   (*((volatile unsigned long *) 0xFFFFF00C))
#define VICIntEnable   (*((volatile unsigned long *) 0xFFFFF010))
#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) __attribute__((interrupt("FIQ")));
void irq_handler(void) __attribute__((interrupt("IRQ")));
static volatile int led_counter = 0;

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

/* Setup the external interrupt and enable IRQ interrupts */
void irq_init(void)
{
  /* Enable P0.14 EINT1 pin function: PINSEL0[29:28] = 10b */
  PINSEL0 = (2 << 28);

  /* Make EINT1 falling edge-sensitive
   * (level sensitive increments the LED count too fast)
   */
  EXTMODE  = 2;
  EXTPOLAR = 0;

  /* Clear register after mode change */
  EXTINT = EXTINT;

  /* Setup the VIC to have EINT1 generate IRQ
   * (EINT1 is interrupt source 15)
   */
  VICIntSelect   = 0;                          /* Select IRQ      */
  VICVectAddr0   = (unsigned long)irq_handler; /* Vector 0        */
  VICVectCntl0   = 0x20 | 15;                  /* EINT1 Interrupt */
  VICIntEnable   = (1 << 15);                  /* Enable          */
}

void irq_handler(void)
{
	led_counter >>= 1;
	if (led_counter <= 0) {
		led_counter = 0x80;
	}
	led(led_counter);

	/* Clear EXT1 interrupt flag */
	EXTINT = 2;

	/* VIC acknowledge */
	VICVectAddr = 0;
}

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

/* ----------------------------------------------------------------
 * Application
 * ----------------------------------------------------------------
 */
int main (void)
{
	led_init();
	led_counter = 0x80;
	led(led_counter);
	irq_init();
	while(1);
	return 0;
}

⌨️ 快捷键说明

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