本文介绍如何点亮裸板上的一个LED。
一. 硬件原理
LED1 电路图如下
nLED_1接的GPF4引脚
可知, nLED_1接的GPF4引脚, nLED_1输出低电平,灯亮; nLED_1输出高电平,灯灭。
下面来设置GPF4为输出引脚, 且输出低电平。
将GPFCON 的GPF4 bit[9:8] 设置为01 = Output
将GPFDAT 的bit[4] 设为0 ,输出低电平
二. 程序设计
1. led_on_c.c
#define GPFCON (*(volatile unsigned long *)0x56000050) /*GPIO控制寄存器*/
#define GPFDAT (*(volatile unsigned long *)0x56000054) /*GPIO数据寄存器*/
int main()
{
GPFCON = 0x00000100; /* 设置GPF4为输出口, 位[9:8]=0b01 */
GPFDAT = 0x00000000; /* GPF4输出0,LED1点亮 */
return 0;
}
2.crt0.S
@******************************************************************************
@ File:crt0.S
@ 功能:通过它转入C程序
@******************************************************************************
.text
.global _start
_start:
ldr r0, =0x53000000 @ WATCHDOG寄存器地址
mov r1, #0x0
str r1, [r0] @ 写入0,禁止WATCHDOG,否则CPU会不断重启
ldr sp, =1024*4 @ 设置堆栈,注意:不能大于4k, 因为现在可用的内存只有4K
@ nand flash中的代码在复位后会移到内部ram中,此ram只有4K
bl main @ 调用C程序中的main函数
halt_loop:
b halt_loop
3. Makefile
led_on_c.bin : crt0.S led_on_c.c
arm-linux-gcc -g -c -o crt0.o crt0.S
arm-linux-gcc -g -c -o led_on_c.o led_on_c.c
arm-linux-ld -Ttext 0x0000000 -g crt0.o led_on_c.o -o led_on_c_elf
arm-linux-objcopy -O binary -S led_on_c_elf led_on_c.bin
arm-linux-objdump -D -m arm led_on_c_elf > led_on_c.dis
clean:
rm -f led_on_c.dis led_on_c.bin led_on_c_elf *.o
三. 代码编译
将第二部分的3个文件,从window拷到linux下
执行make , 生成执行文件led_on_c.bin
四. 硬件实验
将 led_on_c.bin烧进板子 , 程序运行后,红色那个小灯就点亮啦