Sdram型号为hy57v256

#ifndef __SRAM_H_

#define __SRAM_H_

#include "common.h"

#include "delay.h"

#include "stdlib.h"

#include "debugserial.h"

#define SDRAM_DEBUG

#define SDRAM_BASE_ADDR     0xA0000000

#define SDRAM_SIZE          0x10000000

#define MHZ                 *10000001

#define SYS_FREQ            60//MHZ

#if   SYS_FREQ == (120)

#define SDRAM_PERIOD          8.33  // 96MHz

#elif     SYS_FREQ == (96)

#define SDRAM_PERIOD          10.4  // 96MHz

#elif   SYS_FREQ == (72)

#define SDRAM_PERIOD          13.8  // 72MHz

#elif   SYS_FREQ == (60)

#define SDRAM_PERIOD          16.67  // 60MHz

#elif   SYS_FREQ == (57)

#define SDRAM_PERIOD          17.4  // 57.6MHz

#elif SYS_FREQ == (48)

#define SDRAM_PERIOD          20.8  // 48MHz

#elif SYS_FREQ == (36)

#define SDRAM_PERIOD          27.8  // 36MHz

#elif SYS_FREQ == (24)

#define SDRAM_PERIOD          41.7  // 24MHz

#elif SYS_FREQ == (12)

#define SDRAM_PERIOD          83.3  // 12MHz

#else

#error Frequency not defined

#endif

#define P2C(Period)           (((Period<SDRAM_PERIOD)?0:(uint32_t)((float)Period/SDRAM_PERIOD))+1)

#define SDRAM_REFRESH         7813

#define SDRAM_TRP             20

#define SDRAM_TRAS            45

#define SDRAM_TAPR            1

#define SDRAM_TDAL            3

#define SDRAM_TWR             3

#define SDRAM_TRC             65

#define SDRAM_TRFC            66

#define SDRAM_TXSR            67

#define SDRAM_TRRD            15

#define SDRAM_TMRD            3

void sdram_io_init(void);

void sdram_init(void);

u8 sdram_text(void);

#endif

#include "sdram.h"

void sdram_io_init(void)

{

/************** init SDRAM **********/

/* init EMC_CAS */

LPC_IOCON->P2_16 = 0x21;

/* init EMC_RAS */

LPC_IOCON->P2_17 = 0x21;

/* init EMC_CLK0 */

LPC_IOCON->P2_18 = 0x21;

/* init EMC_DYCS0 */

LPC_IOCON->P2_20 = 0x21;

/* init EMC_CKE0 */

LPC_IOCON->P2_24 = 0x21;

/* init EMC_DQM0 */

LPC_IOCON->P2_28 = 0x21;

/* init EMC_DQM1 */

LPC_IOCON->P2_29 = 0x21;

/* init EMC_DQM2 */

LPC_IOCON->P2_30 = 0x21;

/* init EMC_DQM3 */

LPC_IOCON->P2_31 = 0x21;

/************** init SDRAM DATA PIN**********/

/* init EMC_D0 */

LPC_IOCON->P3_0 = 0x21;

/* init EMC_D1 */

LPC_IOCON->P3_1 = 0x21;

/* init EMC_D2 */

LPC_IOCON->P3_2 = 0x21;

/* init EMC_D3 */

LPC_IOCON->P3_3 = 0x21;

/* init EMC_D4 */

LPC_IOCON->P3_4 = 0x21;

/* init EMC_D5 */

LPC_IOCON->P3_5 = 0x21;

/* init EMC_D6 */

LPC_IOCON->P3_6 = 0x21;

/* init EMC_D7 */

LPC_IOCON->P3_7 = 0x21;

/* init EMC_D8 */

LPC_IOCON->P3_8 = 0x21;

/* init EMC_D9 */

LPC_IOCON->P3_9 = 0x21;

/* init EMC_D10 */

LPC_IOCON->P3_10 = 0x21;

/* init EMC_D11 */

LPC_IOCON->P3_11 = 0x21;

/* init EMC_D12 */

LPC_IOCON->P3_12 = 0x21;

/* init EMC_D13 */

LPC_IOCON->P3_13 = 0x21;

/* init EMC_D14 */

LPC_IOCON->P3_14 = 0x21;

/* init EMC_D15 */

LPC_IOCON->P3_15 = 0x21;

/* init EMC_D16 */

LPC_IOCON->P3_16 = 0x21;

/* init EMC_D17 */

LPC_IOCON->P3_17 = 0x21;

/* init EMC_D18 */

LPC_IOCON->P3_18 = 0x21;

/* init EMC_D19 */

LPC_IOCON->P3_19 = 0x21;

/* init EMC_D20 */

LPC_IOCON->P3_20 = 0x21;

/* init EMC_D21 */

LPC_IOCON->P3_21 = 0x21;

/* init EMC_D22 */

LPC_IOCON->P3_22 = 0x21;

/* init EMC_D23 */

LPC_IOCON->P3_23 = 0x21;

/* init EMC_D24 */

LPC_IOCON->P3_24 = 0x21;

/* init EMC_D25 */

LPC_IOCON->P3_25 = 0x21;

/* init EMC_D26 */

LPC_IOCON->P3_26 = 0x21;

/* init EMC_D27 */

LPC_IOCON->P3_27 = 0x21;

/* init EMC_D28 */

LPC_IOCON->P3_28 = 0x21;

/* init EMC_D29 */

LPC_IOCON->P3_29 = 0x21;

/* init EMC_D30 */

LPC_IOCON->P3_30 = 0x21;

/* init EMC_D31 */

LPC_IOCON->P3_31 = 0x21;

/************** init SDRAM ADDR PIN**********/

/* init EMC_A0 */

LPC_IOCON->P4_0 = 0x21;

/* init EMC_A1 */

LPC_IOCON->P4_1 = 0x21;

/* init EMC_A2 */

LPC_IOCON->P4_2 = 0x21;

/* init EMC_A3 */

LPC_IOCON->P4_3 = 0x21;

/* init EMC_A4 */

LPC_IOCON->P4_4 = 0x21;

/* init EMC_A5 */

LPC_IOCON->P4_5 = 0x21;

/* init EMC_A6 */

LPC_IOCON->P4_6 = 0x21;

/* init EMC_A7 */

LPC_IOCON->P4_7 = 0x21;

/* init EMC_A8 */

LPC_IOCON->P4_8 = 0x21;

/* init EMC_A9 */

LPC_IOCON->P4_9 = 0x21;

/* init EMC_A10 */

LPC_IOCON->P4_10 = 0x21;

/* init EMC_A11 */

LPC_IOCON->P4_11 = 0x21;

/* init EMC_A12 */

LPC_IOCON->P4_12 = 0x21;

/* init EMC_A13 */

LPC_IOCON->P4_13 = 0x21;

/* init EMC_A14 */

LPC_IOCON->P4_14 = 0x21;

/************** init SDRAM WE PIN**********/

/* init EMC_WE */

LPC_IOCON->P4_25 = 0x21;

}

void sdram_init(void)

{

volatile u32 i;

volatile unsigned long Dummy;

LPC_SC->PCONP       |= (1<<11);//使能emc模块

//初始化IO

sdram_io_init();

//设置命令延迟时间 芯片数据手册上有标准

LPC_SC->EMCDLYCTL |= (8<<0);

//设置输入数据采样延迟

LPC_SC->EMCDLYCTL |=(8<<8);

//设置时钟输出延迟

LPC_SC->EMCDLYCTL |= (0x08 <<16);

//使能emc 正常地址映射 正常模式非低功耗模式

LPC_EMC->Control =1;

//读取配置设置为命令延迟策略

LPC_EMC->DynamicReadConfig = 1;

//设置ras延时为3个clk cas延时为3 以下设置都需要根据SDRAM数据手册来设置

LPC_EMC->DynamicRasCas0 = 0;

LPC_EMC->DynamicRasCas0 |=(3<<8);

LPC_EMC->DynamicRasCas0 |= (3<<0);

//设置预充电的时钟延迟 20us

LPC_EMC->DynamicRP = P2C(20);

//设置选中到预充电的命令周期 45us

LPC_EMC->DynamicRAS = P2C(45);

//设置自刷新退出时间

LPC_EMC->DynamicSREX = P2C(67);

//最后数据输出到有效命令时间

LPC_EMC->DynamicAPR = 1;

//选择数据到有效命令时间

LPC_EMC->DynamicDAL = SDRAM_TDAL+P2C(20);

//写入恢复时间 3

LPC_EMC->DynamicWR = 3;

//选择有效到有效命令周期

LPC_EMC->DynamicRC = P2C(65);

//选择自刷新周期

LPC_EMC->DynamicRFC = P2C(66);

//自刷新到有效命令时间

LPC_EMC->DynamicXSR = P2C(67);

//选择有效组A到组B的延时

LPC_EMC->DynamicRRD = P2C(15);

//装载模式寄存器到有效时间

LPC_EMC->DynamicMRD = 3;

//选择cs0的配置

/*4:3  = 00     = SDRAM

12:7 = 001001   = 128 Mb (8Mx16), 4 banks, row length = 12, column length = 9

14   = 1      = 32bit

0100 0100 1000 0000

32bit 128 Mb (8Mx16), 4 banks, row length = 12, column length = 9*/

LPC_EMC->DynamicConfig0 = 0x0004480;

//时钟受高电平驱动,clkout持续运行  发出nop命令

LPC_EMC->DynamicControl = 0x0183;

//等待一段时间让sdram启动

for(i= 200*40; i;i--);

//发布pall指令,预充电

LPC_EMC->DynamicControl = 0x0103;

//首先设置动态刷新周期为32个clk

LPC_EMC->DynamicRefresh = 2;

//等待至少128个clk

for(i= 256; i; --i); // > 128 clk

//设置新的动态刷新周期

LPC_EMC->DynamicRefresh = P2C(SDRAM_REFRESH) >> 4;

//发布mode指令

LPC_EMC->DynamicControl    = 0x00000083;

//进行一次伪读取

Dummy = *((volatile u32 *)(SDRAM_BASE_ADDR | (0x32<<13)));

// 进入normal模式 自刷新时钟禁止 空闲时钟禁止 正常操作非掉电

LPC_EMC->DynamicControl = 0x0000;

//使能芯片缓冲

LPC_EMC->DynamicConfig0 |=(1<<19);

for(i = 100000; i;i--);

}

u8 sdram_text(void)

{

u32 i;

volatile u32 *wr_ptr;

volatile u8 *char_wr_ptr;

wr_ptr = (u32 *)SDRAM_BASE_ADDR;

char_wr_ptr = (u8 *)wr_ptr;

for (i=0; i<(SDRAM_SIZE/4)/1024; i++)

{

*char_wr_ptr++ = 0x11;

*char_wr_ptr++ = 0x22;

*char_wr_ptr++ = 0x33;

*char_wr_ptr++ = 0x44;

}

wr_ptr = (u32 *)SDRAM_BASE_ADDR;

for ( i= 0; i < (SDRAM_SIZE/8)/1024; i++ )

{

if ( *wr_ptr != 0x44332211 )    /* be aware of endianess */

{

return 1;

}

wr_ptr++;

}

return 0;

}

lPC1788驱动SDRAM的更多相关文章

  1. FPGA之驱动sdram控制兼容性移植实验

    cb早在2012年就推出了VIP 视频开发板 V1.4  这套开发板是ep2的,摄像头是ov7670,虽然不如当前的vip20强大,但也算是其雏形. 在vip20后期,cb对sdram以及其他模块进行 ...

  2. STM32F429驱动SDRAM

    1 SDRAM控制原理 1.1 SDRAM信号线 1.2 SDRAM地址线 SDRAM包含有“A”以及“BA”两类地址线: A:行(Row)与列(Column)共用的地址线 BA:独立的用于指定SDR ...

  3. 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验十八:SDRAM模块① — 单字读写

    实验十八:SDRAM模块① — 单字读写 笔者与SDRAM有段不短的孽缘,它作为冤魂日夜不断纠缠笔者.笔者尝试过许多方法将其退散,不过屡试屡败的笔者,最终心情像橘子一样橙.<整合篇>之际, ...

  4. SDRAM和dcfifo的联合

    SDRAM和dcfifo的联合 设计原理 在"SDRAM突发读写页"实验中,留下了一个问题,就是从SDRAM读取数据的速度要与SDRAM的驱动时钟同步,这就造成了读出的数据的速率过 ...

  5. SDRAM基础知识

    SDRAM知识普及 在学习SDRAM之前,必须先了解"SDRAM"这个概念性的东西,并有感性的认识转变到一种理性的认识,所谓理性的认识就是实质性的东西…….不多说,相信你已经迫不急 ...

  6. FMC—扩展外部 SDRAM

    本章参考资料:< STM32F4xx 参考手册 2>.< STM32F4xx 规格书>.库帮助文档< stm32f4xx_dsp_stdperiph_lib_um.chm ...

  7. 第26章 FMC—扩展外部SDRAM

    本章参考资料:<STM32F76xxx参考手册2>.<STM32F7xx规格书>.库帮助文档<STM32F779xx_User_Manual.chm>. 关于SDR ...

  8. 第26章 FMC—扩展外部SDRAM—零死角玩转STM32-F429系列

    第26章     FMC—扩展外部SDRAM 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/ ...

  9. 【转】如何把变量或者数组定义到SDRAM及任意位置

    我们开发软件的时候,经常会遇到到一个问题,就是内存不够,这个时候就纠结了,怎么办,有两种方法,第一种是扩展内存,外加SRAM或者SDRAM:第二种应该就是优化代码,也就是通常所说的把数组大小减一减,代 ...

随机推荐

  1. AI 人工智能 探索 (九)

    链接:http://pan.baidu.com/s/1c0AM3g0 密码:uccw 今天补充 创建物体 移动物体 ,当点击创建后 ,会出来一个 上图的 ui,他跟随 物体,当你把物体拖动到 指定的地 ...

  2. Linux学习 -- Shell基础 -- 概述

    Shell是什么? 命令解释器 编程语言 Linux支持的Shell类型 cat /etc/shells 主要学习 bash 脚本执行方式 echo echo -e 单引号 -- 原始字符串  双引号 ...

  3. CentOS安装VirtualBox增强工具

    安装过程中出现错误: Bulding the VirtualBox Guest Additions Kernel modules failedYour system does not seem to  ...

  4. JAVA动态代理详解

    1.什么是代理 代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等. 2.什么是动态代理 在程 ...

  5. PAT (Advanced Level) 1098. Insertion or Heap Sort (25)

    简单题.判断一下是插排还是堆排. #include<cstdio> #include<cstring> #include<cmath> #include<ve ...

  6. HDU 4685 Prince and Princess

    强连通分量,看大神的题解才会写的.... http://www.cnblogs.com/kuangbin/p/3261157.html 数据量有点大,第一次Submit 2995ms过的,时限3000 ...

  7. linux无法解析主机地址(could not resolve host)解决办法

    修改/etc/hosts文件: ip地址 域名 例:192.30.253.120 codeload.github.com

  8. maven实战_测试覆盖率插件使用

    原文:http://www.cnblogs.com/yucongblog/p/5297051.html 1.环境准备 <project> ... <reporting> < ...

  9. zendstudio的安装与配置

    <微信公众平台应用开发实战>第1章搭建开发环境和相关技术介绍,本章会先介绍微信公众平台的一些基本概念和公众平台的开发模式:然后讲解如何搭建开发环境—AppServ和zendstudio:然 ...

  10. AIM Tech Round 3 (Div. 2) B 数学+贪心

    http://codeforces.com/contest/709 题目大意:给一个一维的坐标轴,上面有n个点,我们刚开始在位置a,问,从a点开始走,走n-1个点所需要的最小路程. 思路:我们知道,如 ...