当前位置:首页 > 单片机 > 单片机
[导读]它包含7个文件:head.Sinit.cmain.cMakefilenand.cnand.lds我们之前的程序都是在nandflash的前4k放代码,上电后自动拷贝到SRAM中,之后将SRAM中的代码拷贝到SDRAM中。可是当我们的程序太大超过4k的时候就不行了,因为

它包含7个文件:

head.S

init.c

main.c

Makefile

nand.c

nand.lds

我们之前的程序都是在nandflash的前4k放代码,上电后自动拷贝到SRAM中,之后将SRAM中的代码拷贝到SDRAM中。可是当我们的程序太大超过4k的时候就不行了,因为无法将nandflash的代码完全拷贝到SRAM中去,这时就需要从nandflash中拷贝代码了。

本程序里面我们要实现的就是:将一部分代码放在nandflash的4096之后,上电后,前面一部分代码自动拷贝到SRAM中,在这段代码里面将nandflash的4096之后的程序拷贝到SDRAM中。

我们从入口函数开始分析:

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

@ File:head.s

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

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

.text

.global _start

_start:

@函数disable_watch_dog, memsetup, init_nand, nand_read_ll在init.c中定义

ldr sp, =4096 @设置堆栈

bl disable_watch_dog @关WATCH DOG

bl memsetup @初始化SDRAM,主要是设置控制SDRAM的13个寄存器

bl nand_init @初始化NAND Flas,见注释1


@将NAND Flash中地址4096开始的1024字节代码(main.c编译得到)复制到SDRAM中

@nand_read_ll函数需要3个参数:

ldr r0, =0x30000000 @1. 目标地址=0x30000000,这是SDRAM的起始地址

mov r1, #4096 @2. 源地址 = 4096,连接的时候,main.c中的代码都存在NAND Flash地址4096开始处

mov r2, #2048 @3. 复制长度= 2048(bytes),对于本实验的main.c,这是足够了

bl nand_read @调用C函数nand_read,见注释2


ldr sp, =0x34000000 @设置栈

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

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

halt_loop:

b halt_loop


注释1:

void nand_init(void)

{

#define TACLS 0

#define TWRPH0 3

#define TWRPH1 0

/* 判断是S3C2410还是S3C2440 */

if ((GSTATUS1 == 0x32410000) || (GSTATUS1 == 0x32410002))//这里表示是2410

{

nand_chip.nand_reset = s3c2410_nand_reset;

nand_chip.wait_idle = s3c2410_wait_idle;

nand_chip.nand_select_chip = s3c2410_nand_select_chip;

nand_chip.nand_deselect_chip = s3c2410_nand_deselect_chip;

nand_chip.write_cmd = s3c2410_write_cmd;

nand_chip.write_addr = s3c2410_write_addr;

nand_chip.read_data = s3c2410_read_data;

/* 使能NAND Flash控制器, 初始化ECC, 禁止片选, 设置时序 */

s3c2410nand->NFCONF = (1<<15)|(1<<12)|(1<<11)|(TACLS<<8)|(TWRPH0<<4)|(TWRPH1<<0);

}

else

{ /* 定义了各种操作函数 */

nand_chip.nand_reset = s3c2440_nand_reset;//见注释1-1

nand_chip.wait_idle = s3c2440_wait_idle; //见注释1-2

nand_chip.nand_select_chip = s3c2440_nand_select_chip;//见注释1-3

nand_chip.nand_deselect_chip = s3c2440_nand_deselect_chip;//见注释1-4

nand_chip.write_cmd = s3c2440_write_cmd;//见注释1-5

#ifdef LARGER_NAND_PAGE

nand_chip.write_addr = s3c2440_write_addr_lp;//大页写地址,见注释1-6

#else

nand_chip.write_addr = s3c2440_write_addr;//小页写地址,见注释1-7

#endif

nand_chip.read_data = s3c2440_read_data;//读数据,见注释1-8

/* 设置时序 */

s3c2440nand->NFCONF = (TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4);//这个东东在linux编程里面说过了,不再重复

/* 使能NAND Flash控制器, 初始化ECC, 禁止片选 */

s3c2440nand->NFCONT = (1<<4)|(1<<1)|(1<<0);

}

/* 复位NAND Flash */

nand_reset();//见注释1-9

}

注释1-1:

/* 复位 */

static void s3c2440_nand_reset(void)

{

s3c2440_nand_select_chip(); //选中芯片

s3c2440_write_cmd(0xff); // ffh是复位命令,将这个命令写入命令寄存器即可

s3c2440_wait_idle(); //等待就绪

s3c2440_nand_deselect_chip(); //不选中芯片

}


注释1-2:

/* 等待NAND Flash就绪 */

static void s3c2440_wait_idle(void)

{

int i;

volatile unsigned char *p = (volatile unsigned char *)&s3c2440nand->NFSTAT;

while(!(*p & BUSY))//根据NFSTAT第0位判断是否就绪,1表示就绪

for(i=0; i<10; i++);

}

注释1-3:

/* 发出片选信号 */

static void s3c2440_nand_select_chip(void)

{

int i;

s3c2440nand->NFCONT &= ~(1<<1);//NFCONT寄存器的第1位用于选中芯片,0表示选中

for(i=0; i<10; i++);

}


见注释1-4:

/* 取消片选信号 */

static void s3c2440_nand_deselect_chip(void)

{

s3c2440nand->NFCONT |= (1<<1);//参考注释1-3

}


注释1-5:

/* 发出命令 */

static void s3c2440_write_cmd(int cmd)

{

volatile unsigned char *p = (volatile unsigned char *)&s3c2440nand->NFCMD;

*p = cmd;//就是将命令写到命令寄存器里面,很简单

}


注释1-6:

/* 大页写地址,分5个周期写入 */

static void s3c2440_write_addr_lp(unsigned int addr)

{

int i;

volatile unsigned char *p = (volatile unsigned char *)&s3c2440nand->NFADDR;

int col, page;

//#define NAND_SECTOR_SIZE_LP 2048

//#define NAND_BLOCK_MASK_LP (NAND_SECTOR_SIZE_LP - 1)

col = addr & NAND_BLOCK_MASK_LP; //收下地址前11位,屏蔽高位

page = addr / NAND_SECTOR_SIZE_LP;//屏蔽地址前11位,收下高位

/* 分5个周期将地址写到地址寄存器里面 */

*p = col & 0xff; /* Column Address A0~A7 */

for(i=0; i<10; i++);

*p = (col >> 8) & 0x0f; /* Column Address A8~A11 */

for(i=0; i<10; i++);

*p = page & 0xff; /* Row Address A12~A19 */

for(i=0; i<10; i++);

*p = (page >> 8) & 0xff; /* Row Address A20~A27 */

for(i=0; i<10; i++);

*p = (page >> 16) & 0x03;/* Row Address A28~A29 */

for(i=0; i<10; i++);

}

注释1-7:

/*小页写地址,分4个周期写入*/

static void s3c2440_write_addr(unsigned int addr)

{

int i;

volatile unsigned char *p = (volatile unsigned char *)&s3c2440nand->NFADDR;

*p = addr & 0xff;

for(i=0; i<10; i++);

*p = (addr >> 9) & 0xff;

for(i=0; i<10; i++);

*p = (addr >> 17) & 0xff;

for(i=0; i<10; i++);

*p = (addr >> 25) & 0xff;

for(i=0; i<10; i++);

}


注释1-8:

/* 读取数据 */

static unsigned char s3c2440_read_data(void)

{

/* 很简单,就是将数据从数据寄存器里面读出来 */

volatile unsigned char *p = (volatile unsigned char *)&s3c2440nand->NFDATA;

return *p;

}


注释1-

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

关于使用烧录器烧录Nand Flash,一直都是很多用户头疼的难点,他们强调已经使用了正确的坏块管理方案,也制定了规范的操作流程,但是烧录的良品率还是无法提高,只能每天眼睁睁看着一盘盘&ldqu

关键字: nandflash 烧录器

5月26日消息,据国外媒体报道,集邦咨询半导体研究中心(DRAMeXchange)在周一发布的一份报告中称,今年第一季度,三星在全球NAND Flash市场上的份额为33.3%,与前一季度相比,环比略

关键字: nandflash 三星 芯片

华为作为美光最大的客户之一,美国将华为列入实体名单一事对美光产生了非常严重的影响,美光业绩已经逐渐露出下滑趋势,上周五美光股价大跌近7%,南亚科、华邦电、威刚等存储器企业也纷纷走低。 近期DRAM及N

关键字: DRAM nandflash 美光 芯片

6月24日消息 日前全球第二大闪存供应商东芝位于日本三重县的闪存工厂因地震遭遇断电事故,虽然停电过程非常短,13分钟之后就恢复供电了,但是工厂却一直停产,直到21日上午才恢复,至少停工了5天时间。 根

关键字: nandflash 东芝 台积电 芯片 闪存

Nandflash芯片以其高性价比,大存储容量在电子产品中广泛应用。但是,在此量大质优的应用领域,很多客户却痛苦于批量质量问题:专用工具无法满足量产,量产工具却可能出现极大的不良品率,那么究竟要如何解决呢?

关键字: nandflash 芯片 烧录技巧

一、 首先先来看看核心板的原理图我们发现数据线才有8条,而并没有地址信号,所以该8条线一定是可以传数据,也可以传地址。而地址线肯定又不够,那么,地址肯定又是多次发出的。从datasheet可以看到它要发出5个周期的

关键字: nandflash ok6410 硬件

1. Linux下的二进制可执行文件。 如果世界很简单,那么二进制可执行文件也应该很简单,只包括CPU要执行的指令就可以了。可惜,世界并不简单……。Linux下的二进制可执行文件(以下简称可执行文件),也并不是只包括了

关键字: ARM 裸机程序

注:此文为部分摘录,并且在原文基础上有改动link这几天一直在摸索s3c2410的启动过程,几天的困惑终于在昨天晚上基本解决.下面详细分析一下它的最前面的启动过程.1.在板子上电的一开始,首先自动判断是否是autoboo...

关键字: nandflash s3c2410 启动过程

裸机程序中可能用到的文件以及函数//system.c/*************************************************************************

关键字: s3c6410 裸机程序
关闭