关于LED点亮

关看门狗
[初始化时钟]
[初始化SRAM]


设置栈和返回地址
调用main
清理工作




@启动文件start.S
.text
.global _start
_start:
ldr r0,=0x56000010 @ 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函数,并且把返回地址放在lr寄存器中
halt_loop:
b halt_loop




//main.c文件
#define GPFCON (*(volatile unsigned long *)0x56000050)
#define GPFDAT (*(volatile unsigned long *)0x56000054)


int main()
{
GPFCON = 0x00000100; // 设置GPF4为输出口,位[9:8]=0b01
GPFDAT = 0x00000000; // GPF4输出0,LED1点亮
return 0;
}




//makefile文件
led_on_c.bin:start.S main.c
arm-linux-gcc -g -c -o start.o start.S #编译不连接,生成start.o
arm-linux-gcc -g -c -o main.o main.c #编译不连接,生成main.o
arm-linux-ld -Ttext 0x00000000 -g start.o main.o -o led_elf #连接并且其实地址为0x00000000,第一个为start.o,第二个为main.o,生成led_elf
arm-linux-objcopy -O binary -S led_elf led.bin #生成led.bin二进制执行文件
arm-linux-objdump -D -m arm  led_elf > led.dis #反汇编arm架构的指令代码
clean:
rm -f led.dis led.bin led_elf *.o #可以执行make clean清理




//常用delay函数
void  delay(volatile unsigned long dly)
{
for(; dly > 0; dly--);
}


delay(30000); // 一般使用30000延迟,不到1秒

猜你喜欢

转载自blog.csdn.net/wudics/article/details/26982175
今日推荐