- 论坛徽章:
- 0
|
测试了一整天,还是没有找到问题。本来是要做 watchdog 定时 产生 中断,点灯的实验~~~现在程序出了点问题,把代码 阉割了,找问题~~
但是现在,还是未能得到预期结果
***********************************************************
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 @ 设置堆栈,
bl clock_init @初始化系统时钟
msr cpsr_c, #0xd2 @ 进入中断模式
ldr sp,=3072
msr cpsr_c, #0xd3 @ 进入系统模式
ldr sp, =4096
msr cpsr_c, #0x5f @设置I-bit=0,开IRQ中断
ldr lr, =halt_loop @ 设置返回地址
ldr pc, =main @ 调用main函数
halt_loop:
b halt_loop
******************************************************************
main.c(主程序)
#define S3C2440_MPLL_200MHZ ((0x5c<<12)|(0x01<<4)|(0x02))
//初始化系统时钟 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)
{
//设置为 每 1 秒 产生一次中断
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;
}
|
|