📄 ex9c_main.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 + -