main.c

来自「学习ARM中断最好的例程」· C语言 代码 · 共 75 行

C
75
字号
#include "s3c4510b.h"
#include "console.h"

#define MAXHNDLRS 21

void IRQHandler(void);
void ISR_Timer0(void);
void (*InterruptHandlers[MAXHNDLRS])(void);

static void DummyIsr(void){}

void InitIntHandlerTable(void)
{
	int i;
	for (i=0;i<MAXHNDLRS;i++)
    	InterruptHandlers[i]=DummyIsr;
}

void SysSetInterrupt(int vector,void (*handler)())
{
	INTMSK&=(~(1<<vector));
	InterruptHandlers[vector]=handler;
}

void IRQ_Init(void)
{	
	INTPND=0x1fffff;
	INTMOD=0x0; 
	INTMSK&=(~(1<<INT_GLOBAL));
	InitIntHandlerTable();	
	SysSetInterrupt(INT_TIMER0, ISR_Timer0);
}

void ISR_Timer0(void)
{
	puts("In Timer0 ISR\n");
	IOPDATA=~IOPDATA;
}

void IRQHandler(void)
{
	int num=0;
	num=(INTOFFSET>>2);
	INTPND=(1<<num);
	puts("In IrqHandler\n");
	(*InterruptHandlers[num])();
}

void timer_init(void)
{
	TDATA0=0x2FAF080;	//50000000,fout=fMCLK/(2*TDATA0)
	TMOD|=0x07; //触发模式,使能定时器0
}

void port_init(void)
{
	IOPMOD=0x0003FFFF;	//P0和P1设置为输出
	IOPCON=0xC0000000;
	IOPDATA=0x0003FFFF;
}

int Main(void)
{
	port_init();
	timer_init();
	IRQ_Init();
	console_init();
	puts("Starting...\n");
	for(;;)
	{
		int i;
		for(i=0;i<10;i++);
	}
	return 0;
}

⌨️ 快捷键说明

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