- // 文件名 key_led.c
- // 功能:
- // 当不按任何键时,LED2,3,4三个灯流水点亮.
- // 当按下任何一个按键时,对应的LED灯点亮,其他的熄灭.
- //
- // GPB5, GPB6, GPB7, GPB8 --- LED1, LED2, LED3, LED4
- #define GPBCON (*(volatile unsigned long *)0x56000010)
- #define GPBDAT (*(volatile unsigned long *)0x56000014)
- #define GPB5_msk (3<<(5*2))
- #define GPB6_msk (3<<(6*2))
- #define GPB7_msk (3<<(7*2))
- #define GPB8_msk (3<<(8*2))
- #define GPB5_out (1<<(5*2))
- #define GPB6_out (1<<(6*2))
- #define GPB7_out (1<<(7*2))
- #define GPB8_out (1<<(8*2))
- // GPF1, GPF4, GPF2, GPF0 --- K1, K2, K3, K4
- #define GPFCON (*(volatile unsigned long *)0x56000050)
- #define GPFDAT (*(volatile unsigned long *)0x56000054)
- #define GPF1_msk (3<<(1*2))
- #define GPF4_msk (3<<(4*2))
- #define GPF2_msk (3<<(2*2))
- #define GPF0_msk (3<<(0*2))
- #define GPF1_in (0<<(1*2))
- #define GPF4_in (0<<(4*2))
- #define GPF2_in (0<<(2*2))
- #define GPF0_in (0<<(0*2))
- void wait(volatile unsigned long dly)
- {
- for(; dly > 0; dly--);
- }
- int main(void)
- {
- unsigned long i = 0;
- GPBCON &= ~(GPB5_msk | GPB6_msk | GPB7_msk | GPB8_msk);
- GPBCON |= GPB5_out | GPB6_out | GPB7_out | GPB8_out; // 将LED1,2,3,4对应的GPB5/6/7/8三个引脚设为输出
- GPFCON &= ~(GPF1_msk | GPF4_msk | GPF2_msk | GPF0_msk);
- GPFCON |= GPF1_in | GPF4_in | GPF2_in | GPF0_in; // 将K1,2,3,4对应的GPF1/4/2/0三个引脚设为输入
- while(1)
- {
- if((GPFDAT&(1<<1)) == 0) // K1
- {
- GPBDAT |= ((1<<5)|(1<<6)|(1<<7)|(1<<8)); // 全熄灭
- GPBDAT &= ~(1<<5);
- }
- else if((GPFDAT&(1<<4)) == 0) // K2
- {
- GPBDAT |= ((1<<5)|(1<<6)|(1<<7)|(1<<8)); // 全熄灭
- GPBDAT &= ~(1<<6);
- }
- else if((GPFDAT&(1<<2)) == 0) // K3
- {
- GPBDAT |= ((1<<5)|(1<<6)|(1<<7)|(1<<8)); // 全熄灭
- GPBDAT &= ~(1<<7);
- }
- else if((GPFDAT&(1<<0)) == 0) // K4
- {
- GPBDAT |= ((1<<5)|(1<<6)|(1<<7)|(1<<8)); // 全熄灭
- GPBDAT &= ~(1<<8);
- }
- else
- {
- wait(30000*30);
- GPBDAT |= ((1<<5)|(1<<6)|(1<<7)|(1<<8)); // 全熄灭
- GPBDAT &= ~(1<<(6+i)); // 将对应位置0, 点亮
- i++;
- if(i > 2)
- {
- i = 0;
- }
- }
- }
- return 0;
- }
- @******************************************************************************
- @ File:crt0.S
- @ 功能:通过它转入C程序
- @******************************************************************************
- .text
- .global _start
- _start:
- ldr r0, =0x53000000 @ WATCHDOG寄存器地址
- mov r1, #0x0
- str r1, [r0] @ 写入0,禁止WATCHDOG,否则CPU会不断重启
- ldr sp, =1024*4 @ 设置堆栈,注意:不能大于4k, 因为现在可用的内存只有4K
- @ nand flash中的代码在复位后会移到内部ram中,此ram只有4K
- bl main @ 调用C程序中的main函数
- halt_loop:
- b halt_loop
- # 文件名: Makefile
- CFLAGS := -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -ffreestanding -nostdlib
- key_led.bin : crt0.S key_led.c
- arm-linux-gcc $(CFLAGS) -c -o crt0.o crt0.S
- arm-linux-gcc $(CFLAGS) -c -o key_led.o key_led.c
- arm-linux-ld -Ttext 0x0000000 crt0.o key_led.o -o key_led_elf
- # arm-linux-ld -Tleds.lds crt0.o key_led.o -o key_led_elf
- arm-linux-objcopy -O binary -S key_led_elf key_led.bin
- arm-linux-objdump -D -m arm key_led_elf > key_led.dis
- clean:
- rm -f key_led.dis key_led.bin key_led_elf *.o