3. 内存控制器与SDRAM
内存控制器(内存接口设备)
地址处于不同的范围,会发出不同的片选引脚,换句话说,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期_012课_内存控制器与SDRAM
一.基础知识 各种外设有各自的控制器.例如GPIO控制器可控制GPIO输入输出,UART 控制器可以控制不同脉冲的产生 等.而CPU的作用是向各种控制器写入数据,CPU是通过地址线区别不同的外设控制器 ...
- 韦东山ARM第一期作业(三)内存控制器和SDRAM
文章目录 01 - 作业所在路径 02 - 作业描述 03 - 作业解答 01 - 作业所在路径 ARM裸机1期加强版\源码文档图片\文档图片\第012课_内存控制器与SDRAM 02 - 作业描 ...
- 内存控制器与SDRAM
S3C2440统一编址包含了GPIO,串口.I2C.SDRAM等设备类型,但是这个芯片Nandflash不是在统一编址范围内,Nandflash控制器是在统一编址中的.其中Nandflash的地址线也 ...
- s3c2440内存控制器与SDRAM基本测试
前面我们实验的LED和串口程序,是cpu发送地址给特定的寄存器,在寄存器中写相应的位,达到控制要求. 第一类是GPIO门电路如LED,第二类是协议类如串口,这些都不是cpu直接给地址信息,而是通过寄存 ...
- 韦一之内存控制器,2440地址空间,NOR flash和SDRAM(012课)
大部分内容来自韦东山老师视频及博客:https://blog.csdn.net/thisway_diy/article/details/79389530 一个可参考的很好很详细的博客文档:https: ...
- 内存控制器与SDRAM_内存接口概念
辅线1_硬件知识_内存接口概念 如图是S3C2440是个片上系统,有GPIO控制器(接有GPIO管脚),有串口控制器 (接有TXD RXD引脚). 配置GPIO控制器相应的寄存器,即可让引脚输出高低电 ...
- 存储控制器(SDRAM操作)
什么是存储控制器 2440是32位单片机,进行数据访问时通过32位地址访问. CPU发出32位地址信号给存储控制器,存储控制器根据地址信号设置片选信号及地址总线,将相应数据通过数据总线传回存储控制器, ...
- XLINX系列之Zynq-7000系列DDR内存控制器详解
1DDR内存控制器介绍 DDR内存控制器支持DDR2,DDR3,DDR3L和LPDDR2设备,包括三个主要块:AXI存储器端口接口(DDRI),带有交易调度器(DDRC)的核心控制器和具有数字PHY( ...
- 七彩虹 pci内存控制器 感叹号 蓝屏 DPC_WATCHDOG_VIOLATION
最近自己组装台电脑玩, 出现过几次蓝屏 代码 DPC_WATCHDOG_VIOLATION 打开设备管理器 发现好几个黄色感叹号的 点开显示没有兼容驱动(忘记截图了) 大概有 pci内存控制器, sm ...
- Memory Population Guidelines for Intel 3rd Gen Xeon Scalable Processors——内存控制器
Memory Population Guidelines for Intel 3rd Gen Xeon Scalable Processors 英特尔的第三代至强可扩展处理器采用全新的内存控制器架构. ...
最新文章
- html语义化练习易牛课堂代码
- PWA 可用性检测工具
- 打开无线后无法自动发现连接点的问题
- C#值类型和引用类型的区别
- python封装第三方接口_PYTHON 实现 SIGN 签名: 用于提供给外部(第三方) 做系统对接...
- 【UE4】多视角相机捕获图像如何同屏拼接在一起
- 致信息安全专业同学的一封信
- 抖音收购musical.ly后,最难过的为什么是快手?
- 由frankmocap得到的.pkl文件转为.bvh或者.fbx
- ios可视化编程 UI高级 UI_13
- lex生成lex.yy.c代码流程解析
- Redhat_rhel_linux镜像下载,持续更新......
- 今日头条财经部门后台研发实习生面试
- 证券公司信息化20_完结篇_IT岗位的价值在哪里?你为何而工作
- 心电图知识学习(2)
- 腾讯WeTest即将亮相MTSC2021中国互联网测试开发大会
- ec20 复位命令_EC20指令
- ESLint对a标签href属性警告解决方法
- 度小满获南京银行三年100亿元授信额度,双方并合作共同发力消费金融
- Linux之turbostat超频检测工具(一百零二)
热门文章
- 阅读-《金字塔原理》
- cat6 万兆_超六类屏蔽网线CAT6AF/FTP10G万兆过测试工程网线益朗通信科技冀州
- SWMM源码编译LNK2001 无法解析的外部符号 _swmm_close@0
- 应用ruby打造个性化的有道单词本 (二)
- 使用python解析pdf文档中的单词导入到有道云词典中
- java ios开发_使用Java开发iOS应用
- Java自学第15天 面向对象(全)
- 3DMAX最强搭配神器,一键清理病毒,让你学习工作更流畅!
- CentOS7.5 怎么修改默认SSH端口号
- MDUI的黑暗模式实现和居中问题