C语言版
start.s:
.global _start
_start:
bl main
loop:
b loop
.end
main.c:
#define GPIOCON_0 *((volatile unsigned int *)0xE02000A0)
#define GPIODAT_0 *((volatile unsigned char *)0xE02000A4)
void init_buzzer();
void on_buzzer();
void off_buzzer();
void delay();
void init_buzzer(){
GPIOCON_0 &=~0xf;
GPIOCON_0 |=0x1;
}
void on_buzzer(){
GPIODAT_0 |=0x1;
}
void off_buzzer(){
GPIODAT_0 &=~0x1;
}
void delay(){
int i=1000000;
while(i--);
}
int main(){
init_buzzer();
while(1){
on_buzzer();
delay();
off_buzzer();
delay();
}
return 0;
}
Makefile:
buz.bin:start.o main.o
arm-linux-ld -Ttext=0xd0020010 $^ -o temp
arm-linux-objcopy -O binary temp $@
%.o:%.s
arm-linux-gcc -c $< -o $@
%.o:%.c
arm-linux-gcc -c $< -o $@
clean:
rm -f temp *.bin *.o
===========================================================================================
汇编版:
start.s
.global _start
_start:
bl init_buzzer
loop:
bl on_buzzer
bl delay
bl off_buzzer
bl delay
b loop
init_buzzer:
ldr r0,=0xE02000A0
ldr r1, [r0]
bic r1, r1,#0xf
orr r1, r1,#0x1
str r1, [r0]
mov pc ,lr
on_buzzer:
ldr r0,=0xE02000A4
ldr r1, [r0]
orr r1, r1,#0x1
str r1, [r0]
mov pc ,lr
off_buzzer:
ldr r0,=0xE02000A4
ldr r1, [r0]
bic r1, r1,#0x1
str r1, [r0]
mov pc ,lr
delay:
ldr r0,=0x100000
lable:
subs r0,r0,#1
bne lable
mov pc ,lr
.end
===========================================================================================
Makefile:
buzer.bin:start.o
arm-linux-ld -Ttext=0xd0020010 $^ -o temp
arm-linux-objcopy -O binary temp $@
%.o:%.s
arm-linux-gcc -c $< -o $@
%.o:%.c
arm-linux-gcc -c $< -o $@
.PHONY: clean
clean:
rm *.o *.bin temp
|