04:2440---内存控制器

news2024/11/26 4:44:57

目录

一:介绍

1:引入

2:概念 

3:通信

A:片选信号

B:片选信号的地址空间范围 ​​​​

4:地址线

A:不同位数的接法

B:访问原理

C:访问地址

5:时序

1:NOR FLASH

 A:2440NOR FLASH时序 

B:原理/时序图

C:寄存器

6:SDARM

A:访问方式

B:原理图

C:BWSCON

D:BANKCON6

E:REFRESH

F:ANKSIZE

G:MRSR

二:代码

1:NOR FLASH

2:SDARM 


 

一:介绍

1:引入

        操作GPIO: 我们可以编写程序,让CPU去访问里面的寄存器

         eg:GPFCON配置寄存器 . 可以设置这个寄存器,把某个引脚设置为输出或者输入; GPFDATA数据寄存器, 可以设置某个引脚发出高低电平. 

        UART一样我们可以写程序让CPU访问某些特定的寄存器.

         对于CPU来说,我不关心你这些具体的接口,我只是去操作某个寄存器。我CPU把某些值写给某些寄存器,由这些对应的控制器发出特定的波形。所以这个时候我们的内存控制器就来了

2:概念 

        CPU发出的地址信号并不会传到外面来(eg:GPIO口)。CPU只是用地址来选择里面的不同寄存器。然后CPU把数据发给里面的寄存器,至于这些数据,这些地址会起什么作用,完全由里面的控制器决定。CPU发出来这些信号呢,并不会直接的输出到外部电路去。凡事都有例外(内存接口).

        内存接口:对于这种接口的设备CPU发出来的地址,可以直接传给这些设备。

        在原理图种也可以看到 数据信号CPU发出的地址和数据直接传给这个芯片

       

         内存控制器作用:

3:通信

A:片选信号

        内存控制器根据CPU发出的地址,设置不同的片选引脚,只有被选中的芯片才会工作,没有选中的芯片不会影的他

        

        只有使得某个片选引脚输出低电平的时候,对应的芯片才会开始工作,

SDRAM: 

        在SDRAM中只有LnWE, 所以LnWE负责写入数据和读取数据

NOR FLASH

        LnOE:拉低负责读取数据, LnWE负责写入数据

DM900:

        LnOE:拉低负责读取数据, LnWE负责写入数据

        CPU根据指令发出地址信号,内存控制器来根据这些地址来决定选中哪一些芯片。

B:片选信号的地址空间范围 ​​​​

每个片选引脚相隔134217758位, 当地址处于某一个范围的时候, 对于的片选信号才会有效----见4地址线C:访问地址

至少需要A0~A27条地址线:

        内存的存储单元个数=2^地址线的条数,因此计算内存的总地址线数的公式为: 地址线的条数=log2(内存的存储单元个数.

        CPU有32位地址线, 但是内存控制器他的能力只能控制27位地址线

        只有使得某个片选引脚输出低电平的时候,对应的芯片才会开始工作, 

4:地址线

A:不同位数的接法

8位

CPU的A0接到芯片的A0

16位

        当使用两个8位的芯片拼接(DATA0-7接一个芯片,DATA8-15接一个芯片,也就是组成了一个16位的芯片)的时候,CPU的A1接芯片的A0(CPU的A0用来判断高8位有效还是低8位有效) 

CPU的A1接的位芯片的A0

32位

CPU的A2接到芯片的A0 

B:访问原理

          CPU把地址发送给内存控制器,  内存控制器找到了相应地址的内存类设备(ROM),  内存类设备(ROM)返回数据给内存控制器, 内存控制器找到了储存单元种的数据发送给CPU.

         内存控制器所发出的地址线, 有一部分接到了芯片上. 有一部分没有接接到芯片上。

        接到了芯片上的这些引脚呢用来确定,读取这个芯片上哪一个单元,把这个单元返回给内存控制器。而内存控制器呢,会使用那些没有接的引脚来确定从这个单元中取出哪一个字节返回给CPU

eg:

C:访问地址

5:时序

1:NOR FLASH

我们这里面只研究读时序

 A:2440NOR FLASH时序 

        Taa: 发出add后时间DATA才有效,  可以看到max时间为70ns, 如果在70ns之内访问数据,数据可能不太稳定, 导致我们读取数据错误.  

        Tce: 和上面的差不多, 片选信号的max为70 

        所以我们为了简单可以把地址,片选,读写,数据信号以70ns一起发出

B:原理/时序图

        我们可以看到NOR FLASH有21根地址信号(但是CPU只连接芯片的20根), 16个数据信号, 以及片选限号NCS0,  和写信号LnWE读信号LnOE

        我们可以计算一下我们这个2440NOR FLASH内存的大小

2^21/1024/1024=2MB

        先发出地址信号,经过Tacs时间发出片选信号(nGCS),然后经过Tcos时间发出读信号,过一会数据才有效,把数据读走,然后把读信号释放掉,把片选信号释放掉,然后才开始新的地址周期 
        Tacs ,Tcos,Tacc,Tacp...这些需要根据不同的芯片来进行设置

        因为J2440可以接不同类型的内存类芯片,这些内存内芯片性能不同,所以所用的时间周期也不同。

C:寄存器

在上次种我们把HCLK该为了100MHZ

他默认为14clocks(14*10=140>70), 所以每次时序都可以正常的运行

6:SDARM

A:访问方式

        不像NOR FLSAH一样直接发送地址, SDRAM拆分地址在发送

B:原理图

        SDARM是由2个16为的芯片组合而成, 成为32位的芯片。 故内存大小 

2^32=4294967296bit=4194304KB=4096MB=4GB

        挂载在BANK6上,片选引脚为nGCS6

C:BWSCON

        因为我们的SDRAM只挂载在BANK6上, 所以我们只关系BANK6。

        DW6: 我们的bank是32位的所以选择---10

        WS6: WAIT是由芯片发送给CPU的信号, 以前的芯片准备数据慢, 在CPU给内存控制器发送地址后。内存控制器给给芯片发送各种信号,准备采集数据,但是芯片如果还没有准备好数据可以给CPU发送WAIT信号。最大的宽限时间。 等待信号的使能,由于现在的内存速度足够快,在读数据时不需要内存控制器等待,选择0。

        ST6:BANK6的带宽,选择32位

BWSCON=0x02000000

D:BANKCON6

 

        MT: 我们使用的位SDRAM,使用选择11

        Trcd:这个域的配置表示的是发送行有效命令到列有效命令之间的时间间隔。在发送列读写命令时必须要与行有效命令有一个间隔,这个间隔被定义为tRCD,即RAS to CAS Delay(RAS至CAS延迟),可以理解为行选通周期,这应该是根据芯片存储阵列电子元件响应时间(从一种状态到另一种状态变化的过程)所制定的延迟。

我们使用HCLK为10ns,所以选择00

        SCAN:列地址的位数 选择01 --9位

BANKCON6=0x00018001

E:REFRESH

        之所以称为DRAM,就是因为它要不断进行刷新(Refresh)才能保留住数据,因此它是DRAM最重要的操作

        REFRE:肯定要使能刷新操作。---1

        

        TREFMD:刷新操作分为两种:自动刷新(Auto Refresh,简称AR)与自刷新(Self Refresh,简称SR)。对于AR, SDRAM内部有一个行地址生成器(也称刷新计数器)用来自动的依次生成行地址。SR则主要用于休眠模式低功耗状态下的数据保存,这方面最著名的应用就是STR(Suspend to RAM,休眠挂起于内存)。这里不使用低功耗模式,故TREFMD=0B,使用自动刷新。-----0

        

        Trp:预充电时间。其实就是读取不同行之间的时间间隔。L-Bank关闭现有工作行,准备打开新行的操作就是预充电(Precharge)。在发出预充电命令之后,要经过一段时间才能允许发送RAS行有效命令打开新的工作行,这个间隔被称为tRP(Precharge command Period,预充电有效周期)。-----00即20ns

        

        Tsrc:--01        Trc我们取70ns, Trp我们设置的为20ns, 所以Tsrc=Trc-Trp=70-20=50ns

        Refresh Conuter:我们根据SDARM芯片的Refresh period(刷新周期)的值确定刷新计数器的值。

64ms/8192bit=7.8ms

Refresh count = 2^11 + 1  100x7.8 = 1269=0x4f5---以为我们使用的HCLK为100MHZ

REFRESH=0x008404f5

F:ANKSIZE

BURST_EN:使能突发传输

突发(Burst)是指在同一行中相邻的存储单元连续进行数据传输的方式,连续传输所涉及到存储单元(列)的数量就是突发长度(Burst Lengths,简称BL)。

        BURST_EN :使能他,一次访问多个字节
         SCKE_EN :使用时钟使能休眠模式
ANKSIZE=0x000000b1

G:MRSR

 CL:

 

        WBL:突发长度选择固定,第二个值为reserved,也没得选


        TM:只能选00B


        CL:CL是SDRAM很重要的参数

        在选定列地址后,就已经确定了具体的存储单元,剩下的事情就是数据通过数据I/O通道(DQ)输出到内存总线上了。但是在CAS发出之后,仍要经过一定的时间才能有数据输出,从CAS与读取命令发出到第一笔数据输出的这段时间,被定义为CL(CAS Latency,CAS潜伏期)。由于CL只在读取时出现,所以CL又被称为读取潜伏期(RL,Read Latency)。CL的单位与tRCD一样,为时钟周期数,具体耗时由时钟频率决定。

        设置CL为2个时钟周期。CL=010B。


        BT:只能选0


        BL:只能选0

MRSR=0x00000020

二:代码

1:NOR FLASH

/* CLKDIVN(0x4C000014) = 0X5, tFCLK:tHCLK:tPCLK = 1:4:8  */
    ldr r0, =0x4C000018
	ldr r1, =(0<<9)
	str r1, [r0]
        
    ldr r0, =0x4C000014
	ldr r1, =0x5
	str r1, [r0]

/* 设置CPU工作于异步模式 */
	mrc p15,0,r0,c1,c0,0
	orr r0,r0,#0xc0000000   //R1_nF:OR:R1_iA
	mcr p15,0,r0,c1,c0,0

/*设置MPLLCON*/
	ldr r0, =0x4C000004
	ldr r1, =(92<<12)|(1<<4)|(1<<0)
	str r1, [r0]

	/* 一旦设置PLL, 就会锁定lock time直到PLL输出稳定
	 * 然后CPU工作于新的频率FCLK
	 */
	

 /*设置内存: sp栈* 我们判断是nor启动还是nand启动/

	mov r1, #0
	ldr r0, [r1] /* 读出原来的值备份 */
	str r1, [r1] /* 0->[0] */ 
	ldr r2, [r1] /* r2=[0] */
	cmp r1, r2   /* r1==r2? 如果相等表示是NAND启动 */
	ldr sp, =0x40000000+4096 /* 先假设是nor启动 */
	moveq sp, #4096  /* nand启动 */
	streq r0, [r1]   /* 恢复原来的值 */
	

	
	 bl main


halt:
	b halt


#define ULCON0 (*((volatile unsigned int*)0x50000000))
#define UCON0 (*((volatile unsigned int*)0x50000004))
#define UBRDIV0 (*((volatile unsigned int*)0x50000028))
#define GPHCON (*((volatile unsigned int*)0x56000070))
#define GPHUP (*((volatile unsigned int*)0x56000078))
#define UFCON0 (*((volatile unsigned int*)0x50000008))
#define UTRSTAT0 (*((volatile unsigned int*)0x50000010))
#define UTXH0 (*((volatile unsigned char*)0x50000020))
#define URXH0 (*((volatile unsigned char*)0x50000024))
#define BANKCON0 (*((volatile unsigned int*)0x48000004))
#define GPFCON (*((volatile unsigned int*)0x56000050))
#define GPFDAT (*((volatile unsigned int*)0x56000054))

int LED_on()
{	/*设置寄存器 点亮LED2*/

	/*设置输出模式*/
	GPFCON = 0x400;
	/*输出低电平*/
	GPFDAT = 0;
	return 0;
}

void init_nc_tacc(int val)
{

	BANKCON0 = val << 8;

}
void UART_init()
{
	/*引脚设置*/
	GPHCON &= ~((3 << 4) | (3 << 6));
	GPHCON |= ((2 << 4) | (2 << 6));

	GPHUP &= ~((1 << 2) | (1 << 3));  /* 使能内部上拉 */

	/*设置波特率---设置波特率位115200*/
	/*
	 UBRDIVn = (int)(selected clock / (baudrate x 16) ) –1
	 我们使用我们的FCLK作为我们的时钟源--在汇编中是50MHZ
	UBRDIVn=(5000 0000 /(115200*16))-1=26
	*/
	UCON0 = 0x00000005;
	UBRDIV0 = 26;

	/*数据格式*/
	ULCON0 = 0x00000003;  //不能写为这个ULCON0 |= (3 << 1)因为还要关注其他位;/*数据位=8,停止位=1,无奇偶校验 8n1*/
}
int putchar(int c)
{
	/*发送数据*/
	while ((UTRSTAT0 & (1 << 2)) == 0); //while (!(UTRSTAT0 & (1 << 2)));
	

	UTXH0 = (unsigned char)c;
}

int getchar(void)
{
	/*接收数据*/
	while ((UTRSTAT0 & (1 << 0)) == 0); //while (!(UTRSTAT0 & (1 << 0)));
	

	return URXH0;
}

int puts(const char* s)
{
	while (*s)
	{
		putchar(*s);
		s++;
	}

}


#include "uart.h"
#include "sc2440_so.h"
#include "NOR.h"
#include "led.h"
int main(void)
{
	unsigned char  c;

	UART_init();
	puts("Please enter the numbesr:\n\r");

	while (1)
	{
		c = getchar();
		putchar(c);
		if (c >= '0' && c <= '7')
		{
			init_nc_tacc(c-'0');
			LED_on();

		}
		else
		{
				puts("Error: The number you entered is not between 0 and 7\n\r");
				puts("Please rewrite input\n\r");
		}

		
	}
	return 0;
}


init_nc_tacc(c-'0');和init_nc_tacc(c);的区别

在编程中,init_nc_tacc(c-'0'); 和 init_nc_tacc(c); 的区别取决于 init_nc_tacc 函数如何定义和 c 的数据类型。

  1. 如果 c 是一个字符型变量(如 char,并且代表一个数字字符(例如 '1''2''3' 等):

    • c-'0' 通常用于将字符型数字转换为实际的整数。在ASCII编码中,数字字符 '0' 到 '9' 是连续的,因此通过减去 '0'(其ASCII值为48)可以将字符型数字转换为整数。例如,如果 c 是 '3'c-'0' 将得到整数 3
    • init_nc_tacc(c-'0'); 会将转换后的整数传递给函数。
    • init_nc_tacc(c); 则会将字符型变量传递给函数。
  2. 如果 c 不是代表数字的字符,那么 c-'0' 可能没有明确的意义,并且可能不会得到预期的结果。

  3. 如果 init_nc_tacc 函数对字符和整数有不同的处理逻辑,那么两个调用会有不同的效果。

  4. 如果 c 是其他数据类型,比如已经是一个整数,那么 c-'0' 就没有意义,并且可能导致编译错误或不可预测的行为。

2:SDARM 

代码大致和NOR FLASH不变, 我们这里只展示改变的

#include "sc2440_so.h"
void SDARMA_init(void)
{
	BWSCON = 0x02000000;
	BANKCON6 = 0x00018001;
	BANKCON7 = 0x00018001;
	REFRESH = 0x008404f5;
	ANKSIZE = 0x000000b1;
	MRSRB6 = 0X00000020;
	MRSRB7 = 0X00000020;
}
int init_test(void)
{	
	//片选引脚为nGCS6
	volatile unsigned char* p = (volatile unsigned char*)0X30000000;
	int i;
	//write 操作
	for (i = 0; i < 1000; i++)
	{
		p[i] = 0x55;
	}
	//读操作
	for (i = 0; i < 1000; i++)
	{
		if (p[i] != 0x55) {
			return -1;
		}
	}
	return 0;

}

#include "uart.h"
#include "sc2440_so.h"
#include "NOR.h"
#include "led.h"
int main(void)
{
	unsigned char c;

	UART_init();
	
	puts("Please enter the numbesr:\n\r");
	
	while (1)
	{
		c = getchar();
		putchar(c);
		if (c == '1') {
			SDARMA_init();
			
			if(init_test() == 0)
			{
				LED_on();
	
			}
		}
		else
		{
			puts("Error: Please retype:\n\r");
		}
	}
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1255223.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DDD落地:从阿里单据系统,看DDD在大厂如何落地?

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格&#xff0c;遇到很多很重要的面试题&#xff1a; 谈谈你的DDD落地经验&#xff1f; 谈谈你对DDD的理解&#x…

Android系统新特性——功耗的改进

移动设备的续航时间无疑是所有用户都非常在意的。我们都希望自己的手机一次充电可以使用更长的时间。但遗憾的是&#xff0c;近几年移动设备的电池元件一直没有重大的技术突破。并且&#xff0c;随着硬件性能的提升却带来了更多的电量消耗。 如果对比近几年的Android和ios手机&…

关于反射、枚举以及Lambda表达式你了解多少呢?快来看看吧~

目录 1、反射 1.1、定义 1.2、用途 1.3、反射基本信息 1.4、反射相关的类【重点】 1.5、Class类&#xff08;反射机制的起源&#xff09; 1.6、Class类中相关的方法 1.7、获得Class对象的三种方式 1.8、反射的使用 1.9、反射的优点、缺点 2、枚举 2.1、背景及定义 …

docker基础学习笔记

文章目录 Docker简介Linux下安装DockerDocker常用命令Docker网络Docker存储docker-composedockerfile制作镜像私有仓库镜像导入导出参考 Docker简介 定义&#xff1a;Docker是一个开源的应用容器引擎优势&#xff1a; 一键部署&#xff0c;开箱即用&#xff1a;容器使用基于im…

二次创作Z01语言

目录 一&#xff0c;字符集 二&#xff0c;编译分词 三&#xff0c;token含义 四&#xff0c;Z01翻译成C 五&#xff0c;执行翻译后的代码 六&#xff0c;打印Hello World! 一&#xff0c;字符集 假设有门语言叫Z01语言&#xff0c;代码中只有0和1这两种字符。 二&#…

大数据基础 HDFS客户端操作

一、Maven概述 Maven是一个专门用于管理和构建Java项目的工具。我们之所以要使用Maven&#xff0c;是因为Maven可以为我们提供一套标准化的项目结构、一套标准化的构建流程和一套方便的依赖管理机制&#xff0c;这些功能可以使得我们的项目结构更加清晰&#xff0c;导入jar包的…

WebUI自动化学习(Selenium+Python+Pytest框架)001

开启另一篇学习之路_WebUI自动化 先来一波基础概念 1.自动化适合什么类型的项目: 重复性高,迭代频率高的回归测试。数据量大、手工难以实现的压力测试&#xff0c;手工执行效率低的兼容测试 2.自动化的优点: 高效率、可重复、减少人为错误、克服手工测试的局限性 3.自动化…

电子学会C/C++编程等级考试2021年03月(三级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:找和为K的两个元素 在一个长度为n(n < 1000)的整数序列中,判断是否存在某两个元素之和为k。 时间限制:1000 内存限制:65536输入 第一行输入序列的长度n和k,用空格分开。 第二行输入序列中的n个整数,用空格分开。输出 如…

2018年7月24日 Go生态洞察:Go Cloud实现便携式云编程

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

微信小程序便民小工具源码

微信小程序便民小工具源码,包含身材计算&#xff0c;房贷计算器&#xff0c;工资计算器&#xff0c;血型计算器&#xff0c;进制计算器&#xff0c;量角器&#xff0c;计数器等便民工具。 微信扫一扫即可预览 微信扫一扫即可预览 下载链接:https://www.ym4j.com/program/7525

ssh管理

openssh包 [rootitzfl ~]# ls /mnt/cdrom/Packages/ |grep openssh openssh-7.4p1-11.el7.x86_64.rpm 包含openssh服务器及客户端的核心文件 openssh-askpass-7.4p1-11.el7.x86_64.rpm 支持对话框窗口的提示&#xff0c;是一个基于x系统的密码诊断 openssh-clients-7.4p…

8.前端--CSS-文本属性【2023.11.26】

CSS Text&#xff08;文本&#xff09;属性可定义文本的外观&#xff0c;比如文本的颜色、对齐文本、修饰文本、文本缩进、行间距等 1.文本颜色 color 属性用于定义文本的颜色。 语法&#xff1a; div { color: red; }属性&#xff1a; 2.文本对齐 text-align 属性用于设置元…

Linux安装jdk8【十分丝滑】

1.上传安装包到Linux&#x1f495;&#x1f495;&#x1f495; 2.使用命令解压缩&#x1f495;&#x1f495;&#x1f495; tar -zxvf 压缩文件名 3.重命名&#x1f495;&#x1f495;&#x1f495; mv 原文件名 新的文件名 4.配置环境变量&#x1f929;&#x1f929;&…

CV计算机视觉每日开源代码Paper with code速览-2023.11.21

点击CV计算机视觉&#xff0c;关注更多CV干货 论文已打包&#xff0c;点击进入—>下载界面 点击加入—>CV计算机视觉交流群 1.【基础网络架构&#xff1a;Transformer】Multi-entity Video Transformers for Fine-Grained Video Representation Learning 论文地址&…

2018年10月4日 Go生态洞察:参与2018年Go公司问卷调查

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

【非监督学习 | 聚类】聚类算法类别大全 距离度量单位大全

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

Java基于SpringBoot+vue的租房网站设计与实现(V2.0)

文章目录 一、前言介绍二、主要技术三、系统设计&#xff08;部分&#xff09;3.1、主要功能模块设计3.2、系统登录设计 四、数据库设计&#xff08;部分&#xff09;五、运行截图5.1、 **管理员** **登录****5.2、管理员功能模块**5.2.1、用户管理5.2.2、房屋类型管理5.2.3、房…

Unity-链接MySql8.0

链接MySql8.0 1.准备dll 一、找到l18N相关的dll 这里给出一个参考地址 D:\Unity\2020.3.48f1c1\Editor\Data\MonoBleedingEdge\lib\mono\unityjit在里面找到如下图的四个dll 二、下载数据库链接dll https://downloads.mysql.com/archives/c-net/在这里搜索历史版本(Archiv…

7.前端--CSS-字体属性【2023.11.26】

CSS字体属性 CSS Fonts (字体)属性用于定义字体样式、粗细、大小、和字形。 1.文字样式 CSS 使用 font-style 属性设置文本的风格。 语法&#xff1a; p { font-style: normal; }属性&#xff1a; 2字体粗细 CSS 使用 font-weight 属性设置文本字体的粗细。 语法&#xff1a…