GPIO实验
裸机程序两种烧写方法
- 直接烧写到SD卡 不需要superboot,地址0x00
代码:1.leds_s
其中mkv210_image.c是校验前16K
start.S里面是汇编代码,需要查看datasheet
write2sd是拷贝脚本 把编译好的.bin文件拷贝到SD卡里面
make
./write2sd
把SD卡插到开发板 SD卡启动 可以看到灯亮 - 用minitools烧写裸机程序(需要superboot,地址0x20000000)
先用SD_flasher烧写superboot到SD卡,拷贝images/FriendlyArm.ini文件到SD卡。SD卡插到开发板。
打开mini tools,开发板SD卡模式启动,上电。屏幕出现connect
烧写裸机程序到内存,地址0x20000000
映像选择编译好的210.bin(注意makefile里面的地址也是0x20000000)
下载运行 此时开发板四个灯都亮了
自己写裸机程序
datasheet
要看两个:厂家提供的开发板子的电路图和主芯片的手册,先通过厂家的电路图看led的引脚是怎么连到主芯片的?哪个引脚?再查主芯片的手册查看该引脚是怎么控制驱动led的?
怎么判定GPIO是输入还是输出?
GPIO寄存器属于SFRS(special function register特殊功能寄存器)
读寄存器:输入
写寄存器:输出
led是输出,寄存器GPJ2_0到GPJ2_3
GPJ2CON:地址0xE0200280
output=0001
GPJ2DAT: 地址0xE0200284
输出是0x00
从零写代码
- 汇编:
- start.S
.text
.global _start
_start:
LDR R0,=0xE0200280
MOV R1,#00001111
STR R1,[R0]
LDR R0,=0xE0200284
MOV R1,#00
STR R1,[R0]
loop:
B loop
- Makefile
led.bin:start.S
arm-linux-gcc -c -o led.o start.S
arm-linux-ld -Ttext 0x20000000 led.o -o led.elf
arm-linux-objcopy -O binary -S led.elf led.bin
clean:
rm -f *.o *.elf *.bin
- C语言和汇编混合:
- start.S
.text
.global _start
_start:
BL main
loop:
B loop
- main.c
#define GPJCON *(volatile unsigned long*)0xE0200280
#define GPJDAT *(volatile unsigned long*)0xE0200284
int main()
{
GPJCON |=(1<<0);
GPJDAT &=~(1<<0);
return 0;
}
- Makefile
led.bin:start.S main.c
arm-linux-gcc -c -o led.o start.S
arm-linux-gcc -c -o main.o main.c
arm-linux-ld -Ttext 0x20000000 led.o main.o -o led.elf
arm-linux-objcopy -O binary -S led.elf led.bin
clean:
rm -f *.o *.elf *.bin