上层应用开发,学习的第一个程序是打印Hello World!那么底层驱动开发,学习的第一个程序就是跑流水灯了。其实ARM11也可以把它当成单片机一样,玩裸板程序,写驱动跑流水灯,只是ARM11的裸板开发资料没有STM32的丰富而已。
我用的板子是飞凌的OK6410,要写裸板程序,首先我们先要看硬件手册,或者是原理图。官方的原理图给出的是
底板LED:
核心板原理图:
可知S3C6410接四个LED灯的引脚是GPM0~GPM3
通过查阅S3C6410手册可知GPMCON,GPMDAT寄存器的地址。这样只要给GPMCON在相应的为配置成输出功能,并给GPMDAT相应的位赋0则会点亮相应的LED灯。
下面就直接贴代码了
#define rGPMCON (*(volatile unsigned *)(0x7F008820)) //GPMCON寄存器地址 #define rGPMDAT (*(volatile unsigned *)(0x7F008824)) //GPMDAT寄存器地址 void msDelay(int time) //延时 { volatile unsigned int i,j; for(i = 0; i < 2000000; i++) for(j=0; j<time; j++); } void GPIO_Init(void) //GPIO口初始化 { rGPMCON = 0x11111; rGPMDAT = 0X1F; } void LedTest(void) //循环点亮LED灯 { volatile unsigned int i; while (1) { for(i=0; i<4; i++) { rGPMDAT = ~(1<<i); msDelay(10); } } } void main(void) { GPIO_Init(); LedTest(); }
ARM芯片的IO口是分组的,每组IO口对应着两个寄存器,一个是功能配置寄存器GPxCON,一个是数据寄存器GPxDAT,每个寄存器都是32位。先设置配置寄存器,定义IO口的功能,这里要设置GPM的0~3IO为输出功能,查阅手册,给寄存器赋相应的值。
还有一个就是Makefile的编写
led.bin: start.o led.o //目标:依赖 arm-linux-ld -Ttext 0 -o led.elf start.o led.o //链接二进制文件,-Ttext 0指定链接地址从0地址开始 arm-linux-objcopy -O binary led.elf led.bin //将生成二进制文件led.bin arm-linux-objdump -D led.elf > led.dis //生成反汇编文件 %.o : %.S //$@为目标 $<为依赖 arm-linux-gcc -o $@ $< -c %.o : %.c arm-linux-gcc -o $@ $< -c clean: rm *.o led.elf led.bin led.dis
编写好后,放到Linux系统上,执行make就生成目标文件了。