s3c2440定时器,定时中断

s3c2440定时中断的实现,详细请查阅手册

包含文件

head.S,main.c,makefile,out.lds

makefile

out.bin : head.S  main.c
	arm-linux-gcc -c -o head.o head.S
	arm-linux-gcc -c -o main.o main.c
	arm-linux-ld -Tout.lds head.o main.o -o out_elf
	arm-linux-objcopy -O binary -S out_elf out.bin
	arm-linux-objdump -D -m arm  out_elf > out.dis
	#rm -f out.dis out_elf *.o
clean:
	rm -f out.dis out.bin out_elf *.o

head.S

.text
.global _start
_start:
    b   Reset
HandleUndef:
    b   HandleUndef 
HandleSWI:				
    b   HandleSWI
HandlePrefetchAbort:
    b   HandlePrefetchAbort
HandleDataAbort:
    b   HandleDataAbort
HandleNotUsed:
    b   HandleNotUsed
    b   HandleIRQ
HandleFIQ:
    b   HandleFIQ
Reset:
	ldr r0, =0x53000000					
	mov r1, #0x0
	str r1, [r0]					@disable watchdog
	msr cpsr_c, #0xd2				@IRQ mode,ARM mode,IRQ disable
	ldr sp, =3072 
	msr cpsr_c, #0xd3				@Supervisor mode,ARM mode,IRQ disable
	ldr sp, =1024*4				@set up stack,4K
	msr cpsr_c, #0x53				@Supervisor mode,ARM mode,IRQ enable
	ldr lr, =halt_loop
	ldr pc, =main
halt_loop:
	b halt_loop

HandleIRQ:
	sub lr, lr, #4
	stmdb sp!, {r0-r12,lr}   
	ldr lr, =int_return             
	ldr pc, =TIMER_Handle            
int_return:
	ldmia sp!, { r0-r12,pc }^

main.c

/*
led1 f4,led2 f5,led3 f6,int0 f0
*/
#define	GPFCON	(*(volatile unsigned long *)0x56000050)
#define	GPFDAT	(*(volatile unsigned long *)0x56000054)
#define	GPF4_OUT	(1<<(4*2))
#define	GPF5_OUT	(1<<(5*2))
#define	GPF6_OUT	(1<<(6*2))
#define	GPF4_CON_MSK	(3<<(4*2))
#define	GPF5_CON_MSK	(3<<(5*2))
#define	GPF6_CON_MSK	(3<<(6*2))
#define	GPF4_DAT_MSK	(1<<(4))
#define	GPF5_DAT_MSK	(1<<(5))
#define	GPF6_DAT_MSK	(1<<(6))
#define 	TIMER0_MSK		(1<<(10))

#define	TCFG0	(*(volatile unsigned long *)0x51000000)
#define	TCON	(*(volatile unsigned long *)0x51000008)
#define	TCNTB0	(*(volatile unsigned long *)0x5100000C)
#define INTOFFSET	(*(volatile unsigned long *)0x4A000014)
#define SRCPND	(*(volatile unsigned long *)0X4A000000)
#define INTMSK	(*(volatile unsigned long *)0X4A000008)
#define PRIORITY	(*(volatile unsigned long *)0x4A00000C)
#define INTPND	(*(volatile unsigned long *)0X4A000010)

void init_timer0()
{
	SRCPND=0x0;
	INTMSK=~TIMER0_MSK;
	TCFG0=0xff;
	TCNTB0=0xfff;
	TCON=0xa;
	TCON=0x9;
}


void led_set_out()
{
	GPFCON&=~(GPF4_CON_MSK|GPF5_CON_MSK|GPF6_CON_MSK);
    GPFCON|=GPF4_OUT|GPF5_OUT|GPF6_OUT;
	GPFDAT&=~(GPF4_DAT_MSK);
	GPFDAT&=~(GPF5_DAT_MSK);
	GPFDAT&=~(GPF6_DAT_MSK);
	GPFDAT|=(1<<4);
	GPFDAT|=(1<<5);
	GPFDAT|=(1<<6);
}

void led_reset(int ledn)
{
	if(ledn==1)
	{
		GPFDAT|=(1<<4);
	}
	else if(ledn==2)
	{
		GPFDAT|=(1<<5);
	}
	else
	{
		GPFDAT|=(1<<6);
	}
}

void led_set(int ledn)
{
	if(ledn==1)
	{
		GPFDAT&=~(GPF4_DAT_MSK);
	}
	else if(ledn==2)
	{
		GPFDAT&=~(GPF5_DAT_MSK);
	}
	else
	{
		GPFDAT&=~(GPF6_DAT_MSK);
	}
}

void TIMER_Handle()
{
	int i;
	led_set(1);
	for(i=0;i<30000;i++);
	led_reset(1);
	SRCPND=1<

out.lds

SECTIONS {
	. = 0x00;
  	.text          :   { *(.text) }
	.rodata ALIGN(4) : {*(.rodata)} 
  	.data ALIGN(4) : { *(.data) }
  	.bss ALIGN(4)  : { *(.bss)  *(COMMON) }
}



你可能感兴趣的:(电子通信嵌入式)