📄 ex9b_main.c
字号:
/* ex9b_main.c
*
* Software generated EINT[0:3] example
*/
#include "led.h"
/* ----------------------------------------------------------------
* LPC2138 registers
* ----------------------------------------------------------------
*/
#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 VICVectAddr1 (*((volatile unsigned long *) 0xFFFFF104))
#define VICVectAddr2 (*((volatile unsigned long *) 0xFFFFF108))
#define VICVectAddr3 (*((volatile unsigned long *) 0xFFFFF10C))
#define VICVectCntl0 (*((volatile unsigned long *) 0xFFFFF200))
#define VICVectCntl1 (*((volatile unsigned long *) 0xFFFFF204))
#define VICVectCntl2 (*((volatile unsigned long *) 0xFFFFF208))
#define VICVectCntl3 (*((volatile unsigned long *) 0xFFFFF20C))
/* ----------------------------------------------------------------
* Function declarations and globals
* ----------------------------------------------------------------
*/
void irq_init();
void eint0_handler(void) __attribute__((interrupt("IRQ")));
void eint1_handler(void) __attribute__((interrupt("IRQ")));
void eint2_handler(void) __attribute__((interrupt("IRQ")));
void eint3_handler(void) __attribute__((interrupt("IRQ")));
void fiq_handler(void) __attribute__((interrupt("FIQ")));
/* ----------------------------------------------------------------
* Function definitions
* ----------------------------------------------------------------
*/
/* Setup the IRQ interrupts */
void irq_init(void)
{
/* Setup the VIC to have EINT[0:3] generate IRQs */
VICIntSelect = 0; /* Select IRQ */
VICVectAddr0 = (unsigned long)eint0_handler;/* Vector 0 */
VICVectAddr1 = (unsigned long)eint1_handler;/* Vector 1 */
VICVectAddr2 = (unsigned long)eint2_handler;/* Vector 2 */
VICVectAddr3 = (unsigned long)eint3_handler;/* Vector 3 */
VICVectCntl0 = 0x20 | 14; /* EINT0 Interrupt */
VICVectCntl1 = 0x20 | 15; /* EINT1 Interrupt */
VICVectCntl2 = 0x20 | 16; /* EINT2 Interrupt */
VICVectCntl3 = 0x20 | 17; /* EINT3 Interrupt */
VICIntEnable = (0xF << 14); /* Enable */
}
void eint0_handler(void)
{
led_clr(1);
VICSoftIntClear = (1 << 14);
VICVectAddr = 0;
}
void eint1_handler(void)
{
/* Trigger EINT0 */
led_set(1);
VICSoftInt = (1 << 14);
/* Process EINT1 */
led_clr(2);
VICSoftIntClear = (1 << 15);
VICVectAddr = 0;
}
void eint2_handler(void)
{
/* Trigger EINT1 */
led_set(2);
VICSoftInt = (2 << 14);
/* Process EINT2 */
led_clr(4);
VICSoftIntClear = (1 << 16);
VICVectAddr = 0;
}
void eint3_handler(void)
{
/* Trigger EINT2 */
led_set(4);
VICSoftInt = (4 << 14);
/* Process EINT3 */
led_clr(8);
VICSoftIntClear = (1 << 17);
VICVectAddr = 0;
}
/* 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) {
/* Trigger EINT3 */
led_set(8);
VICSoftInt = (8 << 14);
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -