Nand Flash 或者 Nor Flash启动
S3C2440有4KB SRAM,Nand Flash启动的话,硬件自动将Nand Flash的前4KB 拷贝到SRAM中,然后CPU由地址0开始执行。Nor Flash启动的话,可以像内存一样读,所以CPU如果从Nor Flash启动的话,CPU仍将从0地址启动,但是此时0地址指向Nor Flash地址;Nor Flash具有的特征:可以像内存一样读数据,但是不能像内存一样写数据,必须先擦除之后才能写数据到Nor Flash。
GCC编译流程:预编译,编译,汇编,连接
编译:.c -> .s; 汇编:.s -> .o ;连接:多个.o问价合并一个可执行文件
Makefile文件内容:
led_on.bin : led_on.S
arm-linux-gcc -g -c -o led_on.o led_on.S//-g 加入调试信息-c编译不连接
arm-linux-ld -Ttext 0x0000000 -g led_on.o -o led_on_elf//-Ttext 代码段开始位置 连接生成文件 led_on_elf
arm-linux-objcopy -O binary -S led_on_elf led_on.bin//生成二进制文件
clean:
rm -f led_on.bin led_on_elf *.o
@******************************************************************************
@ File:led_on.S
@ 功能:LED点灯程序,点亮LED1
@******************************************************************************
.text
.global _start
_start:
LDR R0,=0x56000050 @ R0设为GPFCON寄存器。此寄存器
@ 用于选择端口B各引脚的功能:
@ 是输出、是输入、还是其他
MOV R1,#0x00000100
STR R1,[R0] @ 设置GPF4为输出口, 位[8:7]=0b01
LDR R0,=0x56000054 @ R0设为GPBDAT寄存器。此寄存器
@ 用于读/写端口B各引脚的数据
MOV R1,#0x00000000 @ 此值改为0x00000010,
@ 可让LED1熄灭
STR R1,[R0] @ GPF4输出0,LED1点亮
MAIN_LOOP:
B MAIN_LOOP
启动文件包括软件初始化进而硬件初始化
硬件初始化:1. 关闭开门狗 2.初始化时钟, 3. 初始化SDRAM
软件初始化:1. 设置返回地址, 2. 调用main函数, 3. 清理工作(sp ->SRAM(不需要初始化可以直接使用)或者SDRAM(需添加初始化程序))
@******************************************************************************
@ 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@程序死循环与此
此程序位基础的点亮LED程序并在SRAM中运行,所以硬件启动项中没有设置时钟和SDRAM。
#define GPFCON (*(volatile unsigned long *)0x56000050)
#define GPFDAT (*(volatile unsigned long *)0x56000054)
int main()
{
GPFCON = 0x00000100; // 设置GPF4为输出口, 位[8:7]=0b01
GPFDAT = 0x00000000; // GPF4输出0,LED1点亮
return 0;
}
启动文件对应的C语言文件相对比较简单,设置引脚控制寄存器和数据寄存器,点亮LED。
CFLAGS := -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -ffreestanding
leds.bin : crt0.S leds.c
arm-linux-gcc $(CFLAGS) -c -o crt0.o crt0.S
arm-linux-gcc $(CFLAGS) -c -o leds.o leds.c
arm-linux-ld -Ttext 0x0000000 crt0.o leds.o -o leds_elf
# arm-linux-ld -Tleds.lds crt0.o leds.o -o leds_elf
arm-linux-objcopy -O binary -S leds_elf leds.bin
arm-linux-objdump -D -m arm leds_elf > leds.dis
clean:
rm -f leds.dis leds.bin leds_elf *.o
arm-linux-objdump -D -m arm leds_elf > leds.dis //对连接文件按照段,机型为ARM进行反汇编
上一篇:基于ARM-LINUX的温度传感器驱动(DS18B20)
下一篇:STM32 Bootloader原理和设计
推荐阅读最新更新时间:2024-03-16 16:12