04:2440---内存控制器

目录

一:介绍

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, =0x4C000018ldr r1, =(0<<9)str r1, [r0]ldr r0, =0x4C000014ldr r1, =0x5str r1, [r0]/* 设置CPU工作于异步模式 */mrc p15,0,r0,c1,c0,0orr r0,r0,#0xc0000000   //R1_nF:OR:R1_iAmcr p15,0,r0,c1,c0,0/*设置MPLLCON*/ldr r0, =0x4C000004ldr r1, =(92<<12)|(1<<4)|(1<<0)str r1, [r0]/* 一旦设置PLL, 就会锁定lock time直到PLL输出稳定* 然后CPU工作于新的频率FCLK*//*设置内存: sp栈* 我们判断是nor启动还是nand启动/mov r1, #0ldr 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 mainhalt: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作为我们的时钟源--在汇编中是50MHZUBRDIVn=(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)
{	//片选引脚为nGCS6volatile 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.mzph.cn/news/173280.shtml

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

相关文章

海外Leads Generation产业:中国出海群体的行业大机会

Leads Generation&#xff08;简称LeadsGen&#xff09;指的是集中精力吸引和开发潜在客户的营销策略。通过引导式的营销策略&#xff0c;企业分发内容吸引潜在客户&#xff0c;引导客户留下电话/邮件/姓名等信息。基于这些信息&#xff0c;企业可建立潜在客户数据库&#xff0…

一文读懂:IOPS、延迟和吞吐量等存储性能指标

各位ICT的小伙伴们大家好呀&#xff0c; 在我们谈存储性能的时候&#xff0c;总会听到IOPS、延迟&#xff08;Latency&#xff09;、带宽&#xff08;Bandwidth&#xff09;、吞吐量&#xff08;Throughput&#xff09;以及响应时间&#xff08;Response Time&#xff09;等技…

『Linux升级路』基础开发工具——make/Makefile

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;Linux &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、认识make/Makefile &#x1f4d2;1.1make/Makefile的优点 &#x1f4d2;…

EM32DX-C1【分布式io】

1设备类型&#xff1a; 电压&#xff1a;DC24V 输入16点 输出16点雷赛 EM32DX-C1 模块是一款基于 ASIC 技术的高性能、高可靠性的 CANopen 总线数字 量输入输出扩展模块&#xff0c;具有 16 路通用输入接口和 16 路通用输出接口。输入输出接口均采用光 电隔离和…

【yolov5人行道-斑马线目标检测】

yolov5人行道-斑马线目标检测 数据集yolov5人行道-斑马线目标检测检测模型 数据集 YOLOv5是一种目标检测算法&#xff0c;可以用于检测图像中的人行道-斑马线。在目标检测领域&#xff0c;YOLOv5通过结合多种技术手段&#xff0c;包括使用Mosaic数据增强操作、自适应锚框计算与…

SDN之Ubuntn20.04OpenDaylight控制器的安装

目录 1.OpenDaylight简介2.安装JAVA环境3.安装OpenDaylight4.问题总结 1.OpenDaylight简介 OpenDaylight&#xff08;ODL&#xff09;是一个开源的软件定义网络&#xff08;SDN&#xff09;控制器平台&#xff0c;提供了非常美观且功能完善的可视化管理界面&#xff0c;方便用…

redis Redis::geoAdd 无效,phpstudy 如何升级redis版本

redis 查看当前版本命令 INFO SERVERwindows 版redis 进入下载 geoadd 功能在3.2之后才有的&#xff0c;但是phpstudy提供的最新的版本也是在3.0&#xff0c;所以需要升级下 所以想出一个 挂狗头&#xff0c;卖羊肉的方法&#xff0c;下载windows 的程序&#xff0c;直接替…

桥梁道路结冰传感器守护出行安全的重要工具

随着冬季的到来&#xff0c;气温逐渐降低&#xff0c;路面和桥梁容易结冰&#xff0c;给人们的出行带来安全隐患。为了解决这一问题&#xff0c; WX-JB2H 桥梁道路结冰传感器应运而生。本文将详细介绍桥梁道路结冰传感器的作用、原理及在冬季出行中的重要性。 一、桥梁道路结冰…

flink源码分析之功能组件(三)-rpc组件

简介 本系列是flink源码分析的第二个系列,上一个《flink源码分析之集群与资源》分析集群与资源,本系列分析功能组件,kubeclient,rpc,心跳,高可用,slotpool,rest,metrics,future。 本文解释rpc组件,rpc组件用于个核心组件,包括作业管理器,资源管理器和任务管理器之…

什么是高防IP?如何进行防护?怎样隐藏源站?

高防IP是针对互联网服务器遭受大流量的DDoS攻击后导致服务不可用的情况下&#xff0c;推出的付费增值服务&#xff0c;是目前最常用的一种防御DDoS攻击的手段。用户在数据不转移的情况下&#xff0c;就可以通过配置高防IP&#xff0c;将攻击流量引流到高防IP&#xff0c;防护系…

iOS移动应用程序的备案与SHA-1值查看

​ 目录 &#x1f4dd;iOS移动应用程序的备案与SHA-1值查看 引言 第一部分&#xff1a;App备案 第二部分&#xff1a;查看SHA-1值 引言 在开发和发布移动应用程序时&#xff0c;进行App备案是非常重要的一步&#xff0c;它是确保您的应用在合规性方面符合相关法规的过程。…

2023-11-27 LeetCode每日一题(子数组的最小值之和)

2023-11-27每日一题 一、题目编号 907. 子数组的最小值之和二、题目链接 点击跳转到题目位置 三、题目描述 给定一个整数数组 arr&#xff0c;找到 min(b) 的总和&#xff0c;其中 b 的范围为 arr 的每个&#xff08;连续&#xff09;子数组。 由于答案可能很大&#xff…

记一次处理大数据而导致的内存溢出问题

问题 订单服务通过MQ进行订单同步时&#xff0c;刚启动可以正常消费&#xff0c;但是跑一会就会卡住&#xff0c;每次都是第8个kafka分区不行再进行消费&#xff0c;其他分区消费的很慢。 现象 首先&#xff0c;CPU超高&#xff0c;达到百分之300多&#xff1b;其次&#xf…

2023年双十二超声波清洗机如何选?有哪些值得购买的超声波清洗机?

通过眼科医院对近视眼统计报告说明&#xff0c;截止2023年3月27日&#xff0c;全国近视眼人数为3亿人&#xff0c;其中青少年近视约为2亿人&#xff0c;现在大部分人都离不开眼镜&#xff0c;也有很多人忽视了清洗眼镜的重要性&#xff0c;眼镜长时间的不清洗的话会很容易导致脸…

MyBatis Generator使用总结

MyBatis Generator使用总结 介绍具体使用数据准备插件引入配置条件构建讲解demo地址 介绍 MyBatis Generator &#xff08;MBG&#xff09; 是 MyBatis 的代码生成器。它能够根据数据库表&#xff0c;自动生成 java 实体类、dao 层接口&#xff08;mapper 接口&#xff09;及m…

【赠书第8期】工程效能十日谈

文章目录 前言 1 工程效能十日谈 1.1 制定清晰的目标和计划 1.2 引入先进的技术和工具 1.3 建立有效的沟通机制 1.4 灵活应对变化 1.5 确保资源充足 1.6 进行有效的风险管理 1.7 进行持续的监控和评估 1.8 优化团队合作 1.9 注重质量管理 1.10 进行项目总结和反思 …

SSM图书捐赠网站系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 SSM 图书捐赠网站系统是一套完善的信息系统&#xff0c;结合springMVC框架完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库 &#xff0c;系统主要采用B/…

openpnp - 自动换刀设置 - 使用克隆功能有风险

文章目录 openpnp - 自动换刀设置 - 使用克隆功能有风险概述笔记需要注意的地方将一个做好的吸嘴作为这排其他吸嘴的模板bug - 这个克隆功能慎用备注END openpnp - 自动换刀设置 - 使用克隆功能有风险 概述 自动换刀设置时, 很危险, 动不动就撞刀. 如履薄冰啊:( 看到openpnp在…

【社会网络分析第6期】Ucient实操

一、导入数据处理二、核心——边缘分析三、聚类分析四、网络密度 一、导入数据处理 将数据导入Ucinet首先需要对数据进行处理。 承接上一期的数据格式&#xff1a;【社会网络分析第5期】gephi使用指南 原先得到的数据格式如下&#xff1a; 接下来打开ucinet&#xff1a; 之后…

王者荣耀小游戏

第一步是创建项目 项目名自拟 第二部创建个包名 来规范class 然后是创建类 GameFrame 运行类 package com.sxt; package com.sxt;import java.awt.Graphics; import java.awt.Image; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.…