题目
按键控制Led等,K1控制Led1,K2控制Led2,K3控制Led3,K4控制Led4.
注意事项
注意移位操作的含义,以及保持其他引脚的状态不变。
Makefile
ctlled.bin: start.o Ctlleds.o
arm-linux-ld -Ttext 0 -o ctlled.elf start.o Ctlleds.o
arm-linux-objcopy -O binary ctlled.elf ctlled.bin
arm-linux-objdump -D ctlled.elf > ctlled.dis
start.o:start.S
arm-linux-gcc -o start.o start.S -c
Ctlleds.o: Ctlleds.c
arm-linux-gcc -o Ctlleds.o Ctlleds.c -c
clean:
rm *.o *.elf *.bin *.dis *.c *s
程序实现
ctlleds.c
#define GPKCON0 (*(volatile unsigned long *)0x7F008800)
#define GPKDATA (*(volatile unsigned long *)0x7F008808)
#define GPNCON (*(volatile unsigned long *)0x7F008830)
#define GPNDATA (*(volatile unsigned long *)0x7F008834)
int main()
{
GPKCON0 &= 0xffff>>16; //output 4,5,6,7
GPKCON0 |= 0x1<<16 | 0x1<<20 | 0x1<<24 | 0x1<<28;
GPNCON &= 0x0<<0 | 0x0<<2 | 0x0<<4 | 0x0<<6; //input
GPKDATA |=0xf<<4;
while(1){
unsigned int k = GPNDATA; //read the value
if(k & (1<<0)){
GPKDATA |= (1<<4); //important
}else{
GPKDATA &= ~(1<<4);
}
if(k & (1<<1)){
GPKDATA |= (1<<5); //important
}else{
GPKDATA &= ~(1<<5);
}
if(k & (1<<2)){
GPKDATA |= (1<<6); //important
}else{
GPKDATA &= ~(1<<6);
}
if(k & (1<<3)){
GPKDATA |= (1<<7); //important
}else{
GPKDATA &= ~(1<<7);
}
}
return 0;
}
start.S
.text .global _start _start: ldr r0, =0x70000000 orr r0, r0, #0x13 mcr p15,0,r0,c15,c2,4 @ 256M(0x70000000-0x7fffffff) ldr r0, =0x7E004000 @write the 0 to the wathchdog mov r1, #0 str r1, [r0] ldr sp, =1024*4 bl main main_loop: b main_loop