- 論壇徽章:
- 0
|
測試了一整天,還是沒有找到問題。本來是要做 watchdog 定時 產(chǎn)生 中斷,點燈的實驗~~~現(xiàn)在程序出了點問題,把代碼 閹割了,找問題~~
但是現(xiàn)在,還是未能得到預(yù)期結(jié)果
***********************************************************
Makefile
objs := head.o main.o
led.bin: $(objs)
arm-linux-ld -Ttext 0x00000000 -o led_elf $^
arm-linux-objcopy -O binary -S led_elf $@
arm-linux-objdump -D -m arm led_elf > led.dis
%.o:%.c
arm-linux-gcc -Wall -O2 -c -o $@ $<
%.o:%.S
arm-linux-gcc -Wall -O2 -c -o $@ $<
clean:
rm -f led.bin led_elf led.dis *.o
***************************************************************
head.S
.extern main
.text
.global _start
_start:
b Reset
HandleUndef:
b HandleUndef
HandleSWI:
b HandleSWI
HandlePrefetchAbort:
b HandlePrefetchAbort
HandleDataAbort:
b HandleDataAbort
HandleNotUsed:
b HandleNotUsed
HandleIRQ:
b HandleIRQ
HandleFIQ:
b HandleFIQ
Reset:
ldr sp, =4096 @ 設(shè)置堆棧,
bl clock_init @初始化系統(tǒng)時鐘
msr cpsr_c, #0xd2 @ 進入中斷模式
ldr sp,=3072
msr cpsr_c, #0xd3 @ 進入系統(tǒng)模式
ldr sp, =4096
msr cpsr_c, #0x5f @設(shè)置I-bit=0,開IRQ中斷
ldr lr, =halt_loop @ 設(shè)置返回地址
ldr pc, =main @ 調(diào)用main函數(shù)
halt_loop:
b halt_loop
******************************************************************
main.c(主程序)
#define S3C2440_MPLL_200MHZ ((0x5c<<12)|(0x01<<4)|(0x02))
//初始化系統(tǒng)時鐘 FCLK=200MHz,HCLK=100MHz,PCLK=50MHz
void clock_init(void)
{
CLKDIVN = 0x03;
__asm__(
"mrc p15, 0, r1, c1, c0, 0\n"
"orr r1, r1, #0xc0000000\n"
"mcr p15, 0, r1, c1, c0, 0\n"
);
MPLLCON = S3C2440_MPLL_200MHZ;
}
void led_on() //亮燈
{
GPFDAT&=~(0X7<<4);
}
void led_off() //滅燈
{
GPFDAT|=(0X7<<4);
}
void led_init() //初始化 LED 管腳
{
//清理 0
GPFCON&=~((3<< |(3<<10)|(3<<12));
//置 1
GPFCON|=((1<< |(1<<10)|(1<<12));
led_off();
}
/* 屏蔽*************************
void init_irq() //初始化中斷(watchdog)
{
//設(shè)置為 每 1 秒 產(chǎn)生一次中斷
WTCON = 0x3d<<8;
WTDAT = 50000;
WTCNT = 50000;
WTCON|= (1<<5)|(1<<2);
//開 watchdog 中斷
INTSUBMSK&=~(0x1<<13);
INTMSK&=~(0x1<<9);
}
*/
void wait(volatile unsigned long dly)
{
for(; dly > 0; dly--);
}
static int flag=0;
void WAT_Handl()
{
//清除中斷
SUBSRCPND = 0x1<<13;
SRCPND = 0x1<<9;
INTPND = 0x1<<9;
if(flag==0)
{
led_on();
flag=1;
wait(3000000)
}
else
{
led_off();
flag=0;
wait(3000000)
}
}
int main(void)
{
led_init();
//init_irq();
while(1)
{
void WAT_Handl()
}
return 0;
}
|
|