《深入浅出嵌入式底层软件开发》—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 中运行即可,经过试验发现达到预期目的

 

posted @ 2013-08-08 11:08  linux_rookie  阅读(893)  评论(0编辑  收藏  举报