start.s
1 .globl _start 2 _start: 3 ldr r0, =0x70000000 4 orr r0, r0, #0x13 5 mcr p15, 0, r0, c15, c2, 4 6 7 ldr r0, =0x7E004000 8 mov r1, #0 9 str r1, [r0] 10 11 bl clock_init 12 13 ldr sp, =8*1024 14 bl main 15 16 halt: 17 b halt
clock.s
1 .globl clock_init 2 clock_init: 3 ldr r0, =0x7E00F000 4 ldr r1, =0x0000FFFF 5 str r1, [r0] 6 7 str r1, [r0,#4] 8 str r1, [r0,#8] 9 10 ldr r0, =0x7E00F900 11 ldr r1, [r0] 12 bic r1, r1, #0xC0 13 str r1, [r0] 14 15 loop1: 16 ldr r0, =0x7E00F900 17 ldr r1, [r0] 18 and r1, r1, #0xF00 19 cmp r1, #0 20 bne loop1 21 22 #define ARM_RATIO 0 23 #define HCLKX2_RATIO 1 24 #define HCLK_RATIO 1 25 #define PCLK_RATIO 3 26 #define MPLL_RATIO 0 27 ldr r0, =0x7E00F020 28 @ (ARM_RATIO)|(MPLL_RATIO << 4)|(HCLK_RATIO << 8)|(HCLKX2_RATIO << 9)|(PCLK_RATIO << 12) 29 ldr r1, =(0)|(0 << 4)|(1 << 8)|(1 << 9)|(3 << 12) 30 str r1, [r0] 31 32 @ #define APLL_CON_VAL ((1<<31)|(266<<6)|(3<<8)|(1)) 33 ldr r0, =0x7E00F00C 34 ldr r1, =(1<<31)|(266<<6)|(3<<8)|(1) 35 str r1, [r0] 36 37 @ #define MPLL_CON_VAL ((1<<31)|(266<<16)|(3<<8)|(1)) 38 ldr r0, =0x7E00F010 39 ldr r1, =(1<<31)|(266<<16)|(3<<8)|(1) 40 str r1, [r0] 41 42 ldr r0, =0x7E00F01C 43 ldr r1, =0x03 44 str r1, [r0] 45 46 mov pc, lr
led.c
1 void delay() 2 { 3 volatile int i = 0x10000; 4 while(i--); 5 } 6 7 int main() 8 { 9 int i = 0; 10 volatile unsigned long *gpmcon = (volatile unsigned long *)0x7E008820; 11 volatile unsigned long *gpmdat = (volatile unsigned long *)0x7F008824; 12 13 while(1) 14 { 15 *gpmdat = i; 16 i ++; 17 if(i == 16) 18 i = 0; 19 delay(); 20 } 21 22 return 0; 23 }
Makefile
led.bin:start.o clock.o led.o arm-linux-ld -Ttext 0 -o led.elf start.o clock.o led.o arm-linux-objcopy -O binary led.elf led.bin arm-linux-objdump -D led.elf > led.dis %.o:%.s arm-linux-gcc-4.2.2 -o $@ $< -c %.o:%.c arm-linux-gcc-4.2.2 -o $@ $< -c clean: rm *.o led.elf led.bin led.dis
                    
                
                
            
        
浙公网安备 33010602011771号