硬件:micro2440,SDRAM: k4s561632N-LC75,编译器:CodeSourcery arm-2013.05-23-arm-none-eabi.exe
初次调试裸板程序,没有调试器,只能用led点亮的方法来判读程序是否跑飞,过程很痛苦,写个笔记记录下:
程序功能:将arm片内4k sram中的部分内容搬到sdram中运行,主要训练链接脚本的使用,熟悉系统的启动过程,sdram的初始化配置等目的。
crt0.s: 负责设置系统时钟,拷贝点灯应用程序到SDRAM中,然后跳到SDRAM继续执行。
led.c: 点灯应用程序
sdram.c:sdram 寄存器初始化
led.lds: 链接脚本
下面逐一说明:
三种时钟s3c2440A spec上的说明
s3c2440A有两个PLL,一个MPLL用于FCLK,HCLK,PCLK,另一个UPLL,用于usb模块.Mpll时钟由外接的12MHZ晶振通过调节pll倍频参数P,M,S到达400MHZ(最大可为533MHZ),经过FCLK:HCLK:PCLK=1:4:8分频,HCLK为100MHZ,此频率给SDRAM提供时钟,这是程序中需要用到的时钟知识。
crt0.s代码如下:
@******************************************************************************
@ File:head.s
@ 功能:设置SDRAM,将程序复制到SDRAM,然后跳到SDRAM继续执行
@******************************************************************************
@定义常量
.equ MEM_CTL_BASE, 0x48000000
.equ SDRAM_BASE, 0x30000000
.equ MPLLCON, 0x4c000004
.equ CLKDIVN, 0x4c000014
.equ GPBCON , 0x56000010
.equ GPBDAT , 0x56000014
.equ WTCON, 0x53000000
.global _start
_start:
ldr r0, =WTCON
mov r1, #0x0
str r1, [r0]
@ ldr r0, =GPBCON
@ ldr r1, =0x15400
@ str r1, [r0]
@ ldr r0, =GPBDAT
@ ldr r1, =0xffff
@ str r1, [r0]
@set FCLK:HCLK:PCLK=1:4:8
ldr r0,=CLKDIVN
mov r1,#0x05
str r1,[r0]
@unneed delay
@ ldr r0, =0x10000
@1:
@ sub r0, r0, #1
@ bne 1b
@ change fast bus mode to asyn mode because HDIVN is not 0
mrc p15,0,r0,c1,c0,0
orr r0,r0,#0xc0000000
mcr p15,0,r0,c1,c0,0
@unneed delay
@ ldr r0, =0x10000
@1:
@ sub r0, r0, #1
@ bne 1b
@ set Mpll clock to 400MHZ
ldr r0,=MPLLCON
ldr r1,=((92<<12)|(1<<4)| 1);
str r1,[r0]
@ set sp before jump to c code
ldr sp, =4096
bl memsetup
@ ldr r0, =GPBDAT
@ mov r1, #0x07f
@ str r1, [r0]
bl copy_steppingstone_to_sdram
@ ldr r0, =GPBDAT
@ mov r1, #0x0
@ str r1, [r0]
@ b .
@jump to SDRAM to continue
ldr sp,=0x34000000 @设置堆栈
ldr pc,=main
halt_loop:
b halt_loop
copy_steppingstone_to_sdram:
@copy the 2k code from steppingstone(address begins at 2048) to sdram(address begins at 0x30000000)
mov r1,#2048
ldr r2,=SDRAM_BASE
mov r3,#4096
1:
ldr r4,[r1],#4
str r4,[r2],#4
cmp r1,r3
bne 1b
mov pc,lr
================================================================================================
led.lds:
分段存放代码 first section :0x0-0x800 存放crt0.o sdram.o ,second section: 0x800-0x1000 存放led.o, 第一部分在SRAM中运行,第二部分在SDRAM中运行。布局如下:
SECTIONS
{
first 0x0:{crt0.o sdram.o}
second 0x30000000:AT(2048) {led.o}
}
怎么传代码。。。