本文共 3192 字,大约阅读时间需要 10 分钟。
S3C2440的MMU有一种“steppingstone”.技术,是协助MCU从无法执行程序的NAND FLASH执行启动程序的一种方法,其启动步骤如下:
汇编代码:
/* 相当于宏定义,定义存储控制器和SDRAM的基地址 */.equ MEM_CTL_BASE, 0x48000000.equ SDRAM_BASE, 0x30000000.text.global _start_start: /* 采用调用函数的形式 */ bl watch_dog_close @关闭看门狗 bl memsetup @设置存储控制器的13个寄存器 bl copy_steppingstone_to_sdram @将Steppingstone的4KB复制到SDRAM ldr pc, =on_sdram @当前程序跳转到SDRAM中去执行on_sdram: ldr sp, =0x34000000 @设置栈 bl main @跳转去执行main函数halt_loop: b halt_loopwatch_dog_close: /* 关闭看门狗,否则会一直重启,地址0x53000000,[0]位写0关闭 */ ldr r0, =0x53000000 ldr r1, =0 str r1, [r0] mov pc, lrmemsetup: /* 存储控制器的寄存器配置,配置存储控制器以使用SDRAM */ mov r1, #MEM_CTL_BASE adrl r2, mem_cfg_val @将13个寄存器的值伪读取取到r2中 add r3, r1, #52 @r3=r1+52 52:13*4(13个4Byte寄存器)1: ldr r4, [r2], #4 @将r2中的值读取到r4中,然后r2+4 str r4, [r1], #4 @将r4的内容写到r1中存储的地址后,r1中地址+4(初次r1地址为MEM_CTL_BASE) cmp r1, r3 @比较r1中现在的地址,看看是否完成13个寄存器的相应配置(13*4Byte) bne 1b @如果未完成,继续 mov pc, lr @完成后,返回_start继续执行.align 4mem_cfg_val: /* 存储控制器的13个寄存器的设置值 */ .long 0x22011110 @BWSCON .long 0x00000700 @BANKCON0 .long 0x00000700 @BANKCON1 .long 0x00000700 @BANKCON2 .long 0x00000700 @BANKCON3 .long 0x00000700 @BANKCON4 .long 0x00000700 @BANKCON5 .long 0x00018005 @BANKCON6 .long 0x00018005 @BANKCON7 .long 0x008c07a3 @REFRESH .long 0x000000b1 @BANKSIZE .long 0x00000030 @MRSRB6 .long 0x00000030 @MRSRB7copy_steppingstone_to_sdram: /* 将Steppingstone的4KB数据复制到SDRAM中 * Steppingstone的基地址为:0x00000000 * SDRAM的基地址为:0x30000000 */ mov r1, #0 @Steppingstone基地址 ldr r2, =SDRAM_BASE mov r3, #4*1024 1: ldr r4, [r1], #4 @从源地址读取4Byte数据 str r4, [r2], #4 @将源地址的4Byte数据写入目标地址 cmp r1,r3 @对比是否复制完毕 bne 1b mov pc, lr @完成后,返回_start继续执行
Makefile:
all: arm-linux-gcc -c -o main.o main.c arm-linux-gcc -c -o head.o head.S arm-linux-ld -Ttext 0x30000000 head.o main.o -o sdram.elf arm-linux-objcopy -O binary -S sdram.elf sdram.bin arm-linux-objdump -D sdram.elf > sdram.disclean: rm *.o *.elf *.dis
Makefile中:arm-linux-ld -Ttext 0x30000000 head.o main.o -o sdram.elf
连接到了SDRAM的基地址0x30000000
转载地址:http://gpwzi.baihongyu.com/