历史上的今天
返回首页

历史上的今天

今天是:2025年10月28日(星期二)

正在发生

2022年10月28日 | 【JZ2440笔记】裸机实验使用SDRAM

2022-10-28 来源:csdn

一、前言

S3C2440选择Nand启动模式之后,会将Nand Flash的块0前4KB的数据拷贝到片内的4KB SRAM中去,然后PC指针指到SRAM的0地址去顺序向下取指令执行,但是4KB的代码运行空间太小了,所以SRAM的这4KB空间只用来做启动前的一些必要初始化,更大型的代码需要从Nand Flash的其他块中读出来,然后写入到外部的SDRAM中去,PC指针再从片内的SRAM跳到外部SDRAM中去运行程序。JZ2440开发板上的SDRAM是16Mx16bit的,有两片,总共是64MB容量。


二、实验目标

在SRAM中完成关闭看门狗、初始化SDRAM、将main.c代码拷贝到SDRAM中;然后跳到SDRAM中去执行main函数的代码使LED闪烁。


三、硬件连线

SDRAM有数据总线和地址总线,由于有两片SDRAM,1片SDRAM位宽时16位的,两片并行组合起来使用,相当于位宽有32位,所以数据总线第一片连LDATA0到15,第二片连LDATA16到31;地址总线需要错开两位连接,即LADDR0和LADDR1是用不上的,因为两片SDRAM组合之后寻址是4字节对齐的,所以最低两位地址线没有意义。

S3C2440有专门的存储器控制器来操作SDRAM,和STM32单片机的FSMC模块原理是类似的,就是划分了许多段虚拟的内存空间,这些内存空间映射到要控制的存储器内存,我们往这些虚拟的内存地址上面进行数据读写,S3C2440的存储控制器自动完成对外部设备对应的读写操作。


S3C2440的存储器控制器划分为8个Bank,每个Bank映射空间为128MB,8个Bank都可以控制ROM和SRAM类型的存储器,但是只有Bank 6和7可以控制SDRAM。该实验中用Bank 6完成对两个SDRAM的控制。存储控制器涉及到的寄存器如下:

四、程序设计

本实验包含5个源文件,分别如下:


head.S:启动文件,关闭看门狗,初始化SDRAM,拷贝SRAM中的main函数代码到SDRAM中运行。


init.c:包含关闭看门狗,初始化SDRAM和SRAM拷贝数据到SDRAM的C函数代码。


main.c:循环闪烁LED。


sdram.lds:链接脚本,划分代码在bin文件中的存放位置。


Makefile:编译代码。


各个文件内容具体如下:


head.S


@*************************************************************************

@ File:head.S

@ 功能:设置SDRAM,将程序复制到SDRAM,然后跳到SDRAM继续执行

@*************************************************************************       

.text

.global _start

_start:

 

ldr     sp, =4096               @设置堆栈,因为要调用C语言函数 

bl     disable_watch_dog       @关WATCH DOG

bl     memsetup                @初始化SDRAM

    bl     copy_steppingstone_to_sdram     @ 复制代码到SDRAM中

    ldr     sp, =0x34000000         @设置栈

    ldr     lr, =halt_loop          @设置返回地址

    ldr     pc, =main               @b指令和bl指令只能前后跳转32M的范围,所以这里使用向pc赋值的方法进行跳转

halt_loop:

    b       halt_loop

 


init.c


 

/* WOTCH DOG register */

#define WTCON               (*(volatile unsigned long *)0x53000000)

 

/* SDRAM regisers */

#define REG_BWSCON              (*(volatile unsigned long *)0x48000000)

#define REG_BANKCON6            (*(volatile unsigned long *)0x4800001C)

#define REG_REFRESH             (*(volatile unsigned long *)0x48000024)

#define REG_BANKSIZE            (*(volatile unsigned long *)0x48000028)

#define REG_MRSRB6              (*(volatile unsigned long *)0x4800002C)

 

/* SDRAM Start Addr*/

#define SDRAM_START_ADDR    0x30000000

 

/* main function offset*/

#define MAIN_FUNC_OFFSET    2048

 

void disable_watch_dog();

void memsetup();

void copy_steppingstone_to_sdram();

 

/*上电后,WATCH DOG默认是开着的,要把它关掉 */

void disable_watch_dog()

{

WTCON = 0;

}

 

/* 设置控制SDRAM的寄存器 */

void memsetup()

{

    REG_BWSCON = 0x22011110;

    REG_BANKCON6 = 0x00018005;

    REG_REFRESH = 0x008C07A3;

    REG_BANKSIZE = 0x000000B1;

    REG_MRSRB6 = 0x00000030;

}

 

void copy_steppingstone_to_sdram()

{

    int i;

    unsigned long *p = (unsigned long *)SDRAM_START_ADDR;

    unsigned long *pSrc = (unsigned long *)MAIN_FUNC_OFFSET;

 

    for(i = 0; i < (2048 / sizeof(unsigned long)); i++)

    {

        p[i] = pSrc[i];

    }

}


main.c


#define GPFCON (*(volatile unsigned long *)0x56000050)

#define GPFDAT (*(volatile unsigned long *)0x56000054)

 

void  wait(volatile unsigned long dly)

{

for(; dly > 0; dly--);

}

 

int main(void)

{

GPFCON = 0x00001500;  //将GPF4、GPF5、GPF6设置为输出模式

while(1)

{

GPFDAT = 0x00000000;  //亮灯

wait(30000);

GPFDAT = 0x00000070;  //灭灯

wait(30000);

}

return 0;

}

 


sdram.lds


SECTIONS { 

  firtst  0x00000000 : { head.o init.o}

  second 0x30000000 : AT(2048) { main.o }

 

该链接脚本指定了将main.c编译的指令代码放到bin文件的2048地址处,main.c中的代码链接地址是0x30000000,表示main.c中的代码运行的时候应该是位于0x30000000地址处的,也就是SDRAM的起始地址。拷贝main函数是从SRAM的2048地址处拷贝2048个字节到SDRAM的开头处。


Makefile


objs := head.o init.o main.o

 

sdram.bin : $(objs)

arm-linux-ld -Tsdram.lds -o sdram_elf $^

arm-linux-objcopy -O binary -S sdram_elf $@

arm-linux-objdump -D -m arm  sdram_elf > sdram.dis

 

%.o:%.c

arm-linux-gcc -Wall -c -O2 -o $@ $<

 

%.o:%.S

arm-linux-gcc -Wall -c -O2 -o $@ $<

 

clean:

rm -f  sdram.dis sdram.bin sdram_elf *.o

 

执行make后得到的反汇编文件sdram.dis如下:


sdram.dis


sdram_elf:     file format elf32-littlearm

 

Disassembly of section firtst:

 

00000000 <_start>:

   0: e3a0da01 mov sp, #4096 ; 0x1000

   4: eb000007 bl 28

   8: eb00000a bl 38

   c: eb00001a bl 7c

  10: e3a0d30d mov sp, #872415232 ; 0x34000000

  14: e59fe004 ldr lr, [pc, #4] ; 20

  18: e59ff004 ldr pc, [pc, #4] ; 24

 

0000001c :

  1c: eafffffe b 1c

  20: 0000001c andeq r0, r0, ip, lsl r0

  24: 30000034 andcc r0, r0, r4, lsr r0

 

00000028 :

  28: e3a02000 mov r2, #0 ; 0x0

  2c: e3a03453 mov r3, #1392508928 ; 0x53000000

  30: e5832000 str r2, [r3]

  34: e1a0f00e mov pc, lr

 

00000038 :

  38: e3a03422 mov r3, #570425344 ; 0x22000000

  3c: e3a00723 mov r0, #9175040 ; 0x8c0000

  40: e2833a11 add r3, r3, #69632 ; 0x11000

  44: e3a02906 mov r2, #98304 ; 0x18000

  48: e3a01312 mov r1, #1207959552 ; 0x48000000

  4c: e2833e11 add r3, r3, #272 ; 0x110

  50: e2822005 add r2, r2, #5 ; 0x5

  54: e2800e7a add r0, r0, #1952 ; 0x7a0

  58: e5813000 str r3, [r1]

  5c: e2800003 add r0, r0, #3 ; 0x3

  60: e3a030b1 mov r3, #177 ; 0xb1

  64: e581201c str r2, [r1, #28]

  68: e3a02030 mov r2, #48 ; 0x30

  6c: e5810024 str r0, [r1, #36]

  70: e5813028 str r3, [r1, #40]

  74: e581202c str r2, [r1, #44]

  78: e1a0f00e mov pc, lr

 

0000007c :

  7c: e3a01f7f mov r1, #508 ; 0x1fc

  80: e2811003 add r1, r1, #3 ; 0x3

  84: e3a0c203 mov ip, #805306368 ; 0x30000000

  88: e3a00b02 mov r0, #2048 ; 0x800

  8c: e3a02000 mov r2, #0 ; 0x0

  90: e7903102 ldr r3, [r0, r2, lsl #2]

  94: e78c3102 str r3, [ip, r2, lsl #2]

  98: e2822001 add r2, r2, #1 ; 0x1

  9c: e1520001 cmp r2, r1

  a0: 9afffffa bls 90

  a4: e1a0f00e mov pc, lr

  a8: 43434700 cmpmi r3, #0 ; 0x0

  ac: 4728203a undefined

  b0: 2029554e eorcs r5, r9, lr, asr #10

  b4: 2e342e33 mrccs 14, 1, r2, cr4, cr3, {1}

  b8: 00000035 andeq r0, r0, r5, lsr r0

Disassembly of section second:

 

30000000 :

30000000: e24dd004 sub sp, sp, #4 ; 0x4

30000004: e58d0000 str r0, [sp]

30000008: e59d3000 ldr r3, [sp]

3000000c: e3530000 cmp r3, #0 ; 0x0

30000010: 0a000005 beq 3000002c

30000014: e59d3000 ldr r3, [sp]

30000018: e2433001 sub r3, r3, #1 ; 0x1

3000001c: e58d3000 str r3, [sp]

30000020: e59d2000 ldr r2, [sp]

30000024: e3520000 cmp r2, #0 ; 0x0

30000028: 1afffff9 bne 30000014

3000002c: e28dd004 add sp, sp, #4 ; 0x4

30000030: e1a0f00e mov pc, lr

 

30000034

:

30000034: e3a02456 mov r2, #1442840576 ; 0x56000000

30000038: e3a03c15 mov r3, #5376 ; 0x1500

3000003c: e92d4070 stmdb sp!, {r4, r5, r6, lr}

30000040: e1a04002 mov r4, r2

30000044: e3a06000 mov r6, #0 ; 0x0

30000048: e3a05070 mov r5, #112 ; 0x70

3000004c: e5823050 str r3, [r2, #80]

30000050: e3a00c75 mov r0, #29952 ; 0x7500

30000054: e2800030 add r0, r0, #48 ; 0x30

30000058: e5846054 str r6, [r4, #84]

3000005c: ebffffe7 bl 30000000

30000060: e3a00c75 mov r0, #29952 ; 0x7500

30000064: e2800030 add r0, r0, #48 ; 0x30

30000068: e5845054 str r5, [r4, #84]

3000006c: ebffffe3 bl 30000000

30000070: eafffff6 b 30000050

30000074: 43434700 cmpmi r3, #0 ; 0x0

30000078: 4728203a undefined

3000007c: 2029554e eorcs r5, r9, lr, asr #10

30000080: 2e342e33 mrccs 14, 1, r2, cr4, cr3, {1}

30000084: 00000035 andeq r0, r0, r5, lsr r0


从反汇编得到的sdram.dis文件中可以看出main函数的链接地址是0x30000034,位于SDRAM区域,wait函数链接地址是30000000也是位于SDRAM区域。在head.S的开头一段汇编代码可以得知,在一系列初始化之后,最终PC被放入了0x30000034这个值,也就是跳到了main函数的开始地址去执行main函数了。

  18:    e59ff004     ldr    pc, [pc, #4]    ; 24


0000001c :

  1c:    eafffffe     b    1c

  20:    0000001c     andeq    r0, r0, ip, lsl r0

  24:    30000034     andcc    r0, r0, r4, lsr r0


经过代码烧录到开发板之后,看到三个LED灯在闪烁,实验成功!

推荐阅读

史海拾趣

Everett Charles Technologies (ECT)公司的发展小趣事

1996年,ECT为了进一步壮大在产业中的主导地位,加入了Dover集团。Dover集团是一家在纽约股票交易所上市的全美500强大企业之一,其业务涵盖工业、工程系统、流体、电子技术等多个领域。加入Dover集团后,ECT得到了更多的资源和支持,实现了跨越式发展。Dover集团的全球布局和丰富资源,为ECT在全球范围内的业务拓展提供了有力保障。

Fukushima Futaba Electric Co Ltd公司的发展小趣事

近年来,全球电子行业面临着诸多挑战,包括技术更新换代迅速、市场竞争加剧等。Futaba Electric积极应对这些挑战,不断加大研发投入,推出了一系列具有创新性和竞争力的新产品。同时,公司还注重与上下游产业链的合作与协同,通过整合资源、优化流程等方式降低成本、提高效率。此外,Futaba Electric还积极响应环保政策,推动绿色制造和可持续发展。这些努力使得公司在面对挑战时依然能够保持稳健的发展态势。

爱特姆(ATOM)公司的发展小趣事

在快速发展的同时,爱特姆也积极履行企业社会责任。公司始终坚持绿色生产、环保经营的理念,通过采用环保材料和节能技术,降低生产过程中的能耗和排放。此外,爱特姆还积极参与社会公益事业,为社会的可持续发展贡献自己的力量。

这五个故事从不同角度展现了爱特姆(ATOM)在电子行业发展的历程和成就。通过持续创新、市场拓展、人才引进和社会责任等方面的努力,爱特姆逐渐成长为一家具有全球影响力的电子企业。

HDP_Power公司的发展小趣事

爱特姆深知人才是企业发展的核心动力。因此,公司一直注重人才的引进和培养。通过招聘行业内的优秀人才,建立了一支高素质、专业化的研发团队。同时,公司还定期举办各类培训活动,提升员工的技能水平和综合素质。

Abbatron公司的发展小趣事

在电子行业的激烈竞争中,Abbatron公司以其创新的技术赢得了市场的认可。某年,公司研发团队成功开发出了一款新型的高效能芯片,这款芯片不仅性能卓越,而且功耗极低,引起了业界的广泛关注。通过这一技术突破,Abbatron公司在市场上占据了有利地位,并逐渐成为了行业内的佼佼者。

富捷(FOJAN)公司的发展小趣事

富捷电子在积极拓展国内外市场的同时,也注重品牌建设和市场推广。公司建立了遍及全球的销售网络,产品广泛应用于微电子、计算机、光伏、新能源、车载等众多新兴和高科技领域。通过参加国内外知名展会、举办技术交流会等方式,富捷电子不断提升品牌知名度和影响力。此外,公司还积极与上下游企业建立战略合作关系,共同推动产业链协同发展。

问答坊 | AI 解惑

CC4538双精度可重触发单稳态触发器.pdf

CC4538双精度可重触发单稳态触发器很详细的给大家介绍了触发器的原理很工作过程…

查看全部问答>

分享好书:TMS320F2812 Digital Signal Processor Implementation Tutorial

本信息来自合作QQ群:电子工程师技术交流(12425841) 群主在坛子ID:Kata       Welcome to the Texas Instruments TMS320F2812 Tutorial. This material is intended to be used as a student guide for a series of lessons ...…

查看全部问答>

驱动程序中出现“scheduling while atomic”的提示

设备结构定义如下: typedef struct smschar_dev {         volatile int pending_messages;        //!< number of pending messages for this channel         struct cdev cde ...…

查看全部问答>

大家怎么看?

前几天和已在公司实习的同学聊了一下未来几天电子行业的发展,他说他们公司的技术总监说未来五年内电子行业的重点城市应该为武汉,昆山和成都!~其中武汉主要发展光电,成都发展微电子(因为TI),昆山发展物联网!~不知道大家对这个有什么样的看法 ...…

查看全部问答>

stm32f107串口中断的问题请教

串口想做成接收中断方式,    /* Configure UART1 for 2400 baud. */    AFIO->MAPR &= 0xFFFFFFFB;      //不映像   GPIOA->CRH &= 0xFFFFF00F;    GPIOA->CRH ...…

查看全部问答>

ccs软件问题

CCS中,在PROFILES下无子菜单,为何?…

查看全部问答>

微距离无线充电器的设计方案

1 引言无线电技术用于通信,已经在全世界流行了近一百年。从当初的无线电广播和无线电报,发展到现在的卫星和微波通信,以及普及到全球几乎每一个个人的移动通信、无线网络、GPS等。无线通信极大地改变了人们的生产和生活方式,没有无线通信,信息 ...…

查看全部问答>

AD、DA器件的精度

    说精度之前,首先要说分辨率。最近已经有贴子热门讨论了这个问题,结论是分辨率决不等同于精度。比如一块精度0.2%(或常说的准确度0.2级)的四位半万用表,测得A点电压1.0000V,B电压1.0005V,可以分辨出B比A高0.0005V,但A点 ...…

查看全部问答>