历史上的今天
返回首页

历史上的今天

今天是:2024年09月16日(星期一)

2019年09月16日 | 存储-SDRAM

2019-09-16 来源:eefocus

设置SDRAM,将程序复制到SDRAM,然后跳到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

            bl      nand_init               @初始化NAND Flash

 

                                            @将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

 

            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 MEM_CTL_BASE 0x48000000

 

void disable_watch_dog();

void memsetup();

 

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

void disable_watch_dog()

{

WTCON = 0;

}

 

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

void memsetup()

{

int i = 0;

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

 

    /* SDRAM 13个寄存器的值 */

    unsigned long  const    mem_cfg_val[]={ 0x22011110,     //BWSCON

                                            0x00000700,     //BANKCON0

                                            0x00000700,     //BANKCON1

                                            0x00000700,     //BANKCON2

                                            0x00000700,     //BANKCON3  

                                            0x00000700,     //BANKCON4

                                            0x00000700,     //BANKCON5

                                            0x00018005,     //BANKCON6

                                            0x00018005,     //BANKCON7

                                            0x008C07A3,     //REFRESH

                                            0x000000B1,     //BANKSIZE

                                            0x00000030,     //MRSRB6

                                            0x00000030,     //MRSRB7

                                    };

 

for(; i < 13; i++)

p[i] = mem_cfg_val[i];

}

nand.c

#define LARGER_NAND_PAGE

 

#define GSTATUS1        (*(volatile unsigned int *)0x560000B0)

#define BUSY            1

 

#define NAND_SECTOR_SIZE    512

#define NAND_BLOCK_MASK     (NAND_SECTOR_SIZE - 1)

 

#define NAND_SECTOR_SIZE_LP    2048

#define NAND_BLOCK_MASK_LP     (NAND_SECTOR_SIZE_LP - 1)

 

typedef unsigned int S3C24X0_REG32;

 

 

/* NAND FLASH (see S3C2410 manual chapter 6) */

typedef struct {

    S3C24X0_REG32   NFCONF;

    S3C24X0_REG32   NFCMD;

    S3C24X0_REG32   NFADDR;

    S3C24X0_REG32   NFDATA;

    S3C24X0_REG32   NFSTAT;

    S3C24X0_REG32   NFECC;

} S3C2410_NAND;

 

/* NAND FLASH (see S3C2440 manual chapter 6, www.100ask.net) */

typedef struct {

    S3C24X0_REG32   NFCONF;

    S3C24X0_REG32   NFCONT;

    S3C24X0_REG32   NFCMD;

    S3C24X0_REG32   NFADDR;

    S3C24X0_REG32   NFDATA;

    S3C24X0_REG32   NFMECCD0;

    S3C24X0_REG32   NFMECCD1;

    S3C24X0_REG32   NFSECCD;

    S3C24X0_REG32   NFSTAT;

    S3C24X0_REG32   NFESTAT0;

    S3C24X0_REG32   NFESTAT1;

    S3C24X0_REG32   NFMECC0;

    S3C24X0_REG32   NFMECC1;

    S3C24X0_REG32   NFSECC;

    S3C24X0_REG32   NFSBLK;

    S3C24X0_REG32   NFEBLK;

} S3C2440_NAND;

 

 

typedef struct {

    void (*nand_reset)(void);

    void (*wait_idle)(void);

    void (*nand_select_chip)(void);

    void (*nand_deselect_chip)(void);

    void (*write_cmd)(int cmd);

    void (*write_addr)(unsigned int addr);

    unsigned char (*read_data)(void);

}t_nand_chip;

 

static S3C2410_NAND * s3c2410nand = (S3C2410_NAND *)0x4e000000;

static S3C2440_NAND * s3c2440nand = (S3C2440_NAND *)0x4e000000;

 

static t_nand_chip nand_chip;

 

/* 供外部调用的函数 */

void nand_init(void);

void nand_read(unsigned char *buf, unsigned long start_addr, int size);

 

/* NAND Flash操作的总入口, 它们将调用S3C2410或S3C2440的相应函数 */

static void nand_reset(void);

static void wait_idle(void);

static void nand_select_chip(void);

static void nand_deselect_chip(void);

static void write_cmd(int cmd);

static void write_addr(unsigned int addr);

static unsigned char read_data(void);

 

/* S3C2410的NAND Flash处理函数 */

static void s3c2410_nand_reset(void);

static void s3c2410_wait_idle(void);

static void s3c2410_nand_select_chip(void);

static void s3c2410_nand_deselect_chip(void);

static void s3c2410_write_cmd(int cmd);

static void s3c2410_write_addr(unsigned int addr);

static unsigned char s3c2410_read_data();

 

/* S3C2440的NAND Flash处理函数 */

static void s3c2440_nand_reset(void);

static void s3c2440_wait_idle(void);

static void s3c2440_nand_select_chip(void);

static void s3c2440_nand_deselect_chip(void);

static void s3c2440_write_cmd(int cmd);

static void s3c2440_write_addr(unsigned int addr);

static unsigned char s3c2440_read_data(void);

 

/* S3C2410的NAND Flash操作函数 */

 

/* 复位 */

static void s3c2410_nand_reset(void)

{

    s3c2410_nand_select_chip();

    s3c2410_write_cmd(0xff);  // 复位命令

    s3c2410_wait_idle();

    s3c2410_nand_deselect_chip();

}

 

/* 等待NAND Flash就绪 */

static void s3c2410_wait_idle(void)

{

    int i;

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

    while(!(*p & BUSY))

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

}

 

/* 发出片选信号 */

static void s3c2410_nand_select_chip(void)

{

    int i;

    s3c2410nand->NFCONF &= ~(1<<11);

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

}

 

/* 取消片选信号 */

static void s3c2410_nand_deselect_chip(void)

{

    s3c2410nand->NFCONF |= (1<<11);

}

 

/* 发出命令 */

static void s3c2410_write_cmd(int cmd)

{

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

    *p = cmd;

}

 

/* 发出地址 */

static void s3c2410_write_addr(unsigned int addr)

上一篇:UART-中断模式

下一篇:中断-timer0

推荐阅读

史海拾趣

Comtronic Gmbh-Verbindungstechnik公司的发展小趣事

由于Comtronic Gmbh-Verbindungstechnik公司并非一个公众知名度特别高的公司,我无法提供该公司具体的5个发展起来的相关故事。不过,我可以为您提供一种通用的框架或方法,用以构建这类故事,您可以根据这个框架结合公司的实际情况进行创作。


Comtronic Gmbh-Verbindungstechnik公司发展故事框架

  1. 初创时期的技术突破
    • 描述公司创立初期,如何凭借某项关键技术或产品,在电子连接技术市场上站稳脚跟。
    • 强调创始人的远见卓识,以及对技术的执着追求。
    • 提及公司如何通过不断研发和优化,逐渐获得行业内的认可。
  2. 市场拓展与国际合作
    • 讲述公司如何逐步扩大市场份额,从国内市场走向国际市场。
    • 提及与国际知名企业或机构的合作,共同研发新产品或技术。
    • 描述公司如何通过参展、设立海外分公司等方式,提升品牌影响力。
  3. 创新引领与产业升级
    • 强调公司在电子连接技术领域的持续创新,推出了一系列具有里程碑意义的产品。
    • 描述这些创新如何推动整个电子行业的产业升级和技术进步。
    • 提及公司如何积极应对行业变革,不断调整战略和业务模式。
  4. 品质管理与客户信赖
    • 讲述公司如何注重产品质量和客户服务,赢得了客户的信赖和好评。
    • 强调公司如何通过严格的质量管理体系和售后服务体系,确保产品的稳定性和可靠性。
    • 提及客户对公司的认可和支持,以及由此带来的业务增长和市场份额的提升。
  5. 社会责任与可持续发展
    • 描述公司在发展过程中如何注重履行社会责任,积极参与公益事业。
    • 提及公司在环保、节能减排等方面的努力和成果。
    • 强调公司如何通过可持续发展战略,实现经济效益和社会效益的双赢。

您可以根据这些框架,结合Comtronic Gmbh-Verbindungstechnik公司的实际情况和公开资料,编写具体的发展故事。请注意,由于我无法获取该公司的具体细节,因此建议您在编写故事时务必保持客观和中立,避免涉及未经证实的信息或主观评价。

ERNI Electronics公司的发展小趣事

随着公司规模的扩大和产品线的丰富,ERNI Electronics开始积极拓展全球市场。1980年,公司在美国建立了分公司,为后续成为全球供应商打下了坚实的基础。此后,ERNI在新加坡建立了亚洲区总部,并在中国、台湾、韩国、泰国、马来西亚和印度等地设立了销售办事处。这一系列举措使得ERNI的产品能够覆盖更广泛的市场,满足了全球客户的需求。

HiRel Connectors Inc公司的发展小趣事
避免频繁开关摄像头和电源设备以减少对电路的冲击和损耗。
优先(苏州)半导体公司的发展小趣事

宝士曼第三代半导体研发生产项目位于苏州东山大道旁,占地50亩,计划建设生产、研发、办公等楼宇。项目整体将分二期建成,总建筑面积约70000平方米。已经封顶的4号楼建筑面积超11600平方米,主要用于第三代半导体器件专用封装设备的研发生产。在施工过程中,宝士曼对环保和施工细节提出了更高的要求,要求地面每5平方米的高度误差要小于3毫米,并在施工中做到“工完场清”,最大程度减少对今后生产的影响。这种对细节的严格要求体现了宝士曼对产品质量和环保责任的重视。

BH Electronics公司的发展小趣事

随着国内市场的饱和,BH Electronics开始寻求国际化发展的道路。公司高层经过深入调研和分析,决定进军欧洲市场。为了适应当地市场的需求和文化习惯,BH Electronics在欧洲设立了研发中心和营销团队,积极推广公司的产品和服务。通过不懈的努力,BH Electronics成功在欧洲市场打开了局面,实现了国际化发展的战略目标。

辰颐电子公司的发展小趣事

在辰颐电子公司的发展过程中,他们意识到单打独斗很难在市场中取得优势。因此,公司开始注重产业链的整合和协同发展。他们与上游供应商建立了紧密的合作关系,确保原材料的稳定供应和质量保证;与下游客户建立了长期的合作伙伴关系,提供定制化的解决方案和优质的服务。此外,公司还积极参与行业协会和组织的活动,加强与同行业企业的交流与合作,共同推动整个电子行业的发展。

问答坊 | AI 解惑

1602中文资料 附调试图片

LCD1602,大概介绍下 1602采用标准的16脚接口,其中:   第1脚:VSS为地电源 第2脚:VDD接5V正电源 第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通 ...…

查看全部问答>

超高频无源RFID标签的一些关键电路的设计

来活跃下气氛 ,HOHO 本文针对超高频无源RFID 标签芯片的设计,给出了一些关键电路的设计考虑。文章从UHF RFID标签的基本组成结构入手,先介绍了四种电源恢复电路结构,以及在标准CMOS 工艺下制作肖特基二极管来组成倍压电路的解决方案。然后针对 ...…

查看全部问答>

深大DSP系统设计课件3

第三部分 TI DSP软件开发工具CCS的使…

查看全部问答>

wince开机内存占用问题?

如上图,红色指示区域是wince进入桌面后程序内存的使用量。有9M多呢 这样子正常吗?启动应用都没运行呢! 哪位兄台解答一下啊? …

查看全部问答>

请问如何实现将抓取的图片通过GPRS模块(mc39i)进行无线传输

拨号上网的功能已经实现了 操作系统是linux,最后要移植到arm-linux上去 不知怎么编程能才能实现两端的文件发送和接受这种功能 哪位做过该方面的麻烦不吝赐教下,说一下思路或流程 最好详细点,谢谢…

查看全部问答>

Visual studio 2005上的wince5.0嵌入式开发,高手们进来看看啊

Visual studio 2005上的wince5.0嵌入式开发,就是在PDA上播放个语音文件,    [System.Runtime.InteropServices.DllImport(\"winmm.dll\")]         public static extern long PlaySound(String lpszNam ...…

查看全部问答>

WinCE 6.0 离线安装包 共包含多少个文件啊

     我下载的离线安装包,安装后始终是无法建立OS project,提示WINCEROOR无效,难道是我的离线安装包的问题?…

查看全部问答>

STM8S-DISCOVERY上的stlink可以用在其他板子上吗?

                                 rt…

查看全部问答>

【求助】问下大家,到这一步了,该如何继续?

手头有一块S3C2410的开发板   我想移植UCOS系统 现在已完成的工作:   板子的VIVI已烧写好 UCOS系统代码也已用ADS编译通过   那么接下来该怎么做呢? 该如何把UCOS移植到板子上? 我编写了一个LED的测试实验,该如何一上 ...…

查看全部问答>

易电源学习心得

低輸出電壓紋波 納米模塊在 2 MHz 的固定開關頻率下運\行, 可實現低輸出紋波和高效率的平衡。該模塊 還具有低 ESR 陶瓷電容器的穩定性。使用 一個 10 μF X5R 0805 輸出電容的標準解決方案可實現低於 10mVp-p 的輸出紋波,從而可替代需要較高效率 ...…

查看全部问答>