s3c2440定时器,定时中断

本文档介绍了S3C2440处理器如何实现定时中断,内容涉及具体的中断设置和相关文件,包括head.S、main.c、makefile和out.lds的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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<<INTOFFSET;
	INTPND=1<<INTOFFSET;
}

int main()
{
	int i;
	led_set_out();
	init_timer0();
	while(1)
	{
		led_reset(3);
		for(i=0;i<30000;i++);
		led_set(3);
		for(i=0;i<30000;i++);
	}
	return 0;
}

out.lds

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值