这次文件稍比前一个程序要多要点,文件有:beep.c beep.h main.c Makefile mkv210_image.c start.S write2sd
beep.c //主要是关于蜂鸣器的一些方法
#define GPD0CON (*(volatile unsigned long *)0xE02000A0)//接蜂鸣器的引脚的寄存器GPD0
#define GPD0DAT (*(volatile unsigned long *)0xE02000A4)//
void beep_init(void)
{
GPD0CON |=1<<0;
}
void beep_on(void)
{
GPD0DAT |=1<<0;
}
void beep_off(void)
{
GPD0DAT &=~(1<<0);
}
beep.h //关联beep。c的头文件
#ifndef BEEP_H
#define BEEP_H
//beep.c里面的方法
void beep_init(void);
void beep_on(void);
void beep_off(void);
#endif
main.c
#include "beep.h"
void delay(unsigned long count)
{
volatile unsigned long i=count;
while(i--);
}
void main()
{
beep_init();
while(1)
{
beep_on();
delay(0x50000);
beep_off();
delay(0x50000);
}
}
Makefile
beep.bin: start.o main.o beep.o
arm-linux-ld -Ttext 0x20000000 -o beep.elf $^
arm-linux-objcopy -O binary beep.elf beep.bin
arm-linux-objdump -D beep.elf > beep_elf.dis
gcc mkv210_image.c -o mkmini210
./mkmini210 beep.bin 210.bin
%.o : %.S
arm-linux-gcc -o $@ $< -c
%.o : %.c
arm-linux-gcc -o $@ $< -c
clean:
rm *.o *.elf *.bin *.dis *.exe -f
start.S //启动并跳到main
.global _start
_start:
ldr r0, =0xE2700000
mov r1, #0
str r1, [r0]
ldr sp, =0xD0037D80//设个栈,这样可用解决当传递参数超过4位时的问题
bl main
halt:
b halt
write2sd
#!/bin/sh
sudo dd iflag=dsync oflag=dsync if=210.bin of=/dev/sdb seek=1
mkv210_image.c是三星给的校验源码,没有做过改动,详细分析,请看第一个驱动LED的分析
其实程序很简单,主要要讲遇到的烧写问题:
我在sd还没挂载上时,就匆忙的运行了命令./write2sd,结果导致后面再重新运行./write2sd也没有用。重启虚拟机就解决了。
但原因并不清楚,希望了解的大神些可以透露一点