《深入浅出嵌入式底层软件开发》—3. 裸机硬件控制程序之点灯
这次我们要做的是点亮4个led灯
首先看TQ2440原理图,由图1可知,只需在nLED_1、nLED_2、nLED_3、nLED_4输入低电平即可(对S3C2440来说是输出),然后查看这4根线与CPU怎么连接的,经过图2可以看出它们4个分别与GPB5、GPB6、GPB7和GPB8相连,也就是CPU通过这4个端口输出低电平到led灯,把这4个端口配置成输出,然后在对应数据寄存器相应位上写入0就可以实现点灯。
图1
图2
代码 (led.c)
1 #define GPBCON (*(volatile unsigned long *)0x56000010) 2 #define GPBDAT (*(volatile unsigned long *)0x56000014) 3 4 int main() 5 { 6 /*配置4个端口为输出*/ 7 GPBCON = (0x01<<10) | (0x01<<12) | (0x01<<14) | (0x01<<16); 8 9 /*设置4个端口输出低电平*/ 10 GPBDAT &= ~((0x01<<5) | (0x01<<6) | (0x01<<7) | (0x01<<8)); 11 return 0; 12 }
下面用韦东山老师介绍的方法来进行编译和链接
(crt0.S)
1 .text 2 .global _start 3 _start: 4 ldr r0, =0x56000010 @ WATCHDOG寄存器地址 5 mov r1, #0x0 6 str r1, [r0] @ 写入0,禁止WATCHDOG,否则CPU会不断重启 7 8 ldr sp, =1024*4 @ 设置堆栈,注意:不能大于4k, 因为现在可用的内存只有4K 9 @ nand flash中的代码在复位后会移到内部ram中,此ram只有4K 10 bl main @ 调用C程序中的main函数 11 halt_loop: 12 b halt_loop
(Makefile)
1 led.bin : crt0.S led.c 2 arm-linux-gcc -g -nostdlib -c -o crt0.o crt0.S #编译程序 3 arm-linux-gcc -g -nostdlib -c -o led.o led.c #编译程序 4 arm-linux-ld -Ttext 0x0000000 -g crt0.o led.o -o led_elf #链接起来 5 arm-linux-objcopy -O binary -S led_elf led.bin #把链接得到的ELF格式可执行文件转换成二进制格式文件 6 arm-linux-objdump -D -m arm led_elf > led.dis #将结果转换为汇编码以供查看 7 clean: 8 rm -f led.dis led.bin led_elf *.o
把这3个文件放在linux下进行交叉编译,得到的led.bin 文件烧写到Nand Flash 中运行即可,经过试验发现达到预期目的