内存控制器(内存接口设备)

地址处于不同的范围,会发出不同的片选引脚,换句话说,SOC外接的不同内存芯片,会有不同的地址范围。
CPU统一编址包括GPIO,各种协议类接口控制器(UART,I2C…),内存设备接口,nand flash控制器(nand flash芯片本身不受cpu统一编址)。每个片选信号可选择的地址范围空间为128M,至少需要27条地址线。

CPU发送32为地址 -> 内存控制器 -> 发出27为地址信号和片选信号

时序图分析

可编程访问周期
2440读时序图

Nor Flash芯片时序图


要根据内存芯片手册,修改时序图中的各种值。芯片默认值都是最保险的,无法发挥cpu的性能。
为简单起见,我们设置2440芯片片选(CE#)读信号(OE#)地址信号同时发出,保持70nm

内存控制器相关寄存器(Nor Flash)

总线位宽和等待控制寄存器

Bank控制寄存器

设置Tacc[10:8] = 100
init.c

#include "s3c2440_soc.h"void bank0_tacc_set(int val)
{BANKCON0 = val << 8;
}

init.h

#ifndef _INIT_H
#define _INIT_Hvoid bank0_tacc_set(int val);#endif

uart.c

#include "s3c2440_soc.h"/* 115200,8n1 */
void uart0_init()
{/* 设置引脚用于串口 *//* GPH2,3用于TxD0, RxD0 */GPHCON &= ~((3<<4) | (3<<6));GPHCON |= ((2<<4) | (2<<6));GPHUP &= ~((1<<2) | (1<<3));  /* 使能内部上拉 *//* 设置波特率 *//* UBRDIVn = (int)( UART clock / ( buad rate x 16) ) –1*  UART clock = 50M*  UBRDIVn = (int)( 50000000 / ( 115200 x 16) ) –1 = 26*/UCON0 = 0x00000005; /* PCLK,中断/查询模式 */UBRDIV0 = 26;/* 设置数据格式 */ULCON0 = 0x00000003; /* 8n1: 8个数据位, 无较验位, 1个停止位 *//*  */}int putchar(int c)
{/* UTRSTAT0 *//* UTXH0 */while (!(UTRSTAT0 & (1<<2)));UTXH0 = (unsigned char)c;}int getchar(void)
{while (!(UTRSTAT0 & (1<<0)));return URXH0;
}int puts(const char *s)
{while (*s){putchar(*s);s++;}
}

uart.h

#ifndef _UART_H
#define _UART_Hvoid uart0_init();
int putchar(int c);
int getchar(void);
int puts(const char *s);#endif

main.c

#include "s3c2440_soc.h"
#include "uart.h"
#include "init.h"int main(void)
{unsigned char c;uart0_init();puts("Enter the Tacc val: \n\r");while(1){c = getchar();putchar(c);if (c >= '0' && c <= '7'){bank0_tacc_set(c - '0');led_test();}else{puts("Error, val should between 0~7\n\r");puts("Enter the Tacc val: \n\r");}}return 0;
}

设置将程序烧写到nor flash上,设置为nor启动,用串口设置不同的值,观察灯的闪烁。

SDRAM基础知识

看本专栏《内存SDRAM》

2440内存控制器设置

我们SDRAM的地址是在Bnak6上

  • 我们用两个芯片位宽位16位的SDRAM芯片,组成32位物理位宽 DW6[25:24] = 10
  • 当cpu发出读写信号,芯片还是没有准备好数据,可以向cpu发送一个wait信号,我们不需要,WS6[26] = 0
  • 读写是否精确到byte。不需要,读出一个32位数据,内存控制器选择byte即可。ST6[26] = 0


设置SDRAM,只需要设置MT[16:15]、Trcd[3:2]、SCAN[1:0]。
SCAN[1:0]:列地址,查看芯片手册,得到9位。
Trcd[3:2]:行地址和列地址之间delay多长时间。看芯片手册时20ns

SDRAM在使用过程中需要不断去刷新它
刷新寄存器

使能刷新,自动刷新
Refresh Counter[10:0] :

查看芯片手册,可以算到1269



CL[6:4]:sdram收到列地址后,等一会才会返回数据

SDRAM测试程序
在SDRAM中写一个值,再读取,测试是否正确。

init.c init.h

#include "s3c2440_soc.h"void sdram_init(void)
{BWSCON = 0x22000000;BANKCON6 = 0x18001;BANKCON7 = 0x18001;REFRESH  = 0x8404f5;BANKSIZE = 0xb1;MRSRB6   = 0x20;MRSRB7   = 0x20;
}int sdram_test(void)
{volatile unsigned char *p = (volatile unsigned char *)0x30000000;int i;// write sdramfor (i = 0; i < 1000; i++)p[i] = 0x55;// read sdramfor (i = 0; i < 1000; i++)if (p[i] != 0x55)return -1;return 0;
}
#ifndef _INIT_H
#define _INIT_Hvoid sdram_init(void);
int sdram_test(void);#endif

main.c

#include "s3c2440_soc.h"
#include "uart.h"
#include "init.h"int main(void)
{uart0_init();sdram_init();if (sdram_test() == 0)led_test();return 0;
}

3. 内存控制器与SDRAM相关推荐

  1. 新1期_012课_内存控制器与SDRAM

    一.基础知识 各种外设有各自的控制器.例如GPIO控制器可控制GPIO输入输出,UART 控制器可以控制不同脉冲的产生 等.而CPU的作用是向各种控制器写入数据,CPU是通过地址线区别不同的外设控制器 ...

  2. 韦东山ARM第一期作业(三)内存控制器和SDRAM

    文章目录 01 - 作业所在路径 02 - 作业描述 03 - 作业解答 01 - 作业所在路径   ARM裸机1期加强版\源码文档图片\文档图片\第012课_内存控制器与SDRAM 02 - 作业描 ...

  3. 内存控制器与SDRAM

    S3C2440统一编址包含了GPIO,串口.I2C.SDRAM等设备类型,但是这个芯片Nandflash不是在统一编址范围内,Nandflash控制器是在统一编址中的.其中Nandflash的地址线也 ...

  4. s3c2440内存控制器与SDRAM基本测试

    前面我们实验的LED和串口程序,是cpu发送地址给特定的寄存器,在寄存器中写相应的位,达到控制要求. 第一类是GPIO门电路如LED,第二类是协议类如串口,这些都不是cpu直接给地址信息,而是通过寄存 ...

  5. 韦一之内存控制器,2440地址空间,NOR flash和SDRAM(012课)

    大部分内容来自韦东山老师视频及博客:https://blog.csdn.net/thisway_diy/article/details/79389530 一个可参考的很好很详细的博客文档:https: ...

  6. 内存控制器与SDRAM_内存接口概念

    辅线1_硬件知识_内存接口概念 如图是S3C2440是个片上系统,有GPIO控制器(接有GPIO管脚),有串口控制器 (接有TXD RXD引脚). 配置GPIO控制器相应的寄存器,即可让引脚输出高低电 ...

  7. 存储控制器(SDRAM操作)

    什么是存储控制器 2440是32位单片机,进行数据访问时通过32位地址访问. CPU发出32位地址信号给存储控制器,存储控制器根据地址信号设置片选信号及地址总线,将相应数据通过数据总线传回存储控制器, ...

  8. XLINX系列之Zynq-7000系列DDR内存控制器详解

    1DDR内存控制器介绍 DDR内存控制器支持DDR2,DDR3,DDR3L和LPDDR2设备,包括三个主要块:AXI存储器端口接口(DDRI),带有交易调度器(DDRC)的核心控制器和具有数字PHY( ...

  9. 七彩虹 pci内存控制器 感叹号 蓝屏 DPC_WATCHDOG_VIOLATION

    最近自己组装台电脑玩, 出现过几次蓝屏 代码 DPC_WATCHDOG_VIOLATION 打开设备管理器 发现好几个黄色感叹号的 点开显示没有兼容驱动(忘记截图了) 大概有 pci内存控制器, sm ...

  10. Memory Population Guidelines for Intel 3rd Gen Xeon Scalable Processors——内存控制器

    Memory Population Guidelines for Intel 3rd Gen Xeon Scalable Processors 英特尔的第三代至强可扩展处理器采用全新的内存控制器架构. ...

最新文章

  1. html语义化练习易牛课堂代码
  2. PWA 可用性检测工具
  3. 打开无线后无法自动发现连接点的问题
  4. C#值类型和引用类型的区别
  5. python封装第三方接口_PYTHON 实现 SIGN 签名: 用于提供给外部(第三方) 做系统对接...
  6. 【UE4】多视角相机捕获图像如何同屏拼接在一起
  7. 致信息安全专业同学的一封信
  8. 抖音收购musical.ly后,最难过的为什么是快手?
  9. 由frankmocap得到的.pkl文件转为.bvh或者.fbx
  10. ios可视化编程 UI高级 UI_13
  11. lex生成lex.yy.c代码流程解析
  12. Redhat_rhel_linux镜像下载,持续更新......
  13. 今日头条财经部门后台研发实习生面试
  14. 证券公司信息化20_完结篇_IT岗位的价值在哪里?你为何而工作
  15. 心电图知识学习(2)
  16. 腾讯WeTest即将亮相MTSC2021中国互联网测试开发大会
  17. ec20 复位命令_EC20指令
  18. ESLint对a标签href属性警告解决方法
  19. 度小满获南京银行三年100亿元授信额度,双方并合作共同发力消费金融
  20. Linux之turbostat超频检测工具(一百零二)

热门文章

  1. 阅读-《金字塔原理》
  2. cat6 万兆_超六类屏蔽网线CAT6AF/FTP10G万兆过测试工程网线益朗通信科技冀州
  3. SWMM源码编译LNK2001 无法解析的外部符号 _swmm_close@0
  4. 应用ruby打造个性化的有道单词本 (二)
  5. 使用python解析pdf文档中的单词导入到有道云词典中
  6. java ios开发_使用Java开发iOS应用
  7. Java自学第15天 面向对象(全)
  8. 3DMAX最强搭配神器,一键清理病毒,让你学习工作更流畅!
  9. CentOS7.5 怎么修改默认SSH端口号
  10. MDUI的黑暗模式实现和居中问题