打印
[技术问答]

单片机RAM、ROM如何充分使用?

[复制链接]
1108|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
burgessmaggie|  楼主 | 2023-5-27 22:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
RAM,ROM的区别,地址数据总线,控制总线。

                1.RAM是一种掉电会丢失数据的可读可写的存储器。//其实题目上写的是外扩ram,但很多时候我们很少来外扩ram,          都是外扩各种外围器件,比如ADC,DAC,等等等

                2.ROM是掉电不丢失,只读的存储器。

                3.51单片机P0口是低8地址和数据总线复用。P2口是高8位地址总线。

              4.数据总线是用来传输数据的,地址总线是用来选择地址的,51单片机地址总线是16根,也就是外扩最大内存为    2^16=64K;

                5.控制总线就是单片机发出的各种控制信号线,比如读写时序产生WR/RD,低8位地址锁存信号线ALE等...

        然后我们进入正题。如果是学过单片机原理的小伙伴们应该知道这两个操作指令 MOVX,MOVC,如果用我们用汇编写外扩RAM、ROM,就是用这两个操作指令,当出现这两个操作指令的时候,单片机的相关引脚就会产生对应的时序,这样我们把相关外扩器件与之相连的时候,就不用去管时序的问题了。

                MOVX  A,@DPTR    //读外扩ram,产生读时序,由WR/p3.6产生

                MOVX  @DPTR,A    //写外扩ram,产生写时序,由RD/p3.7产生

                MOVC  A,@DPTR    //读外扩rom,产生读时序,由PSEN产生

                我这里这介绍RAM的读写。当我们发出一条MOVX指令的时候,先发出16位地址,产生控制时序,然后在写(读)数据,这个时候,我们低8位地址总线就与数据总线冲突了(因为都是用的P0口),使用如果我们要时候低8位地址去限定的时候,就可以就一个锁存器,来锁存低8位地址(这个时候要用到锁存信号引脚ALE),再比如我们外围器件不多的时候,或者外扩ram不超过2^8=256B的时候,完全可以不管低8位。

                然后就是我们读写控制线都有效时序都是由高到低,当数据读写完后,在变为高电平,你们要注意自己控制的外围器件的时序,看要不要加非门处理一下读写时序,比如控制LCD1602的时候。

                我们大致了解了这个控制过程(想详细了解的建议去看书,单片机原理),我们在开发的过程中很少用汇编写项目,下面我们就来看看C语言的写法。

                首先我们来看一看下面的关键字:                 

                        code   以MOVC @A+DPTR 读取的程序内存

                        data   可以直接存取的内部数据存储器

                        idata   以 MOV@Rn 存取的内部数据存储器

                        bdata   可以位寻址(BitAddressable)的内部存储器

                        xdata   以MOVX @DPTR 存取的外部数据存储器

                        pdata   以MOVX @Rn 存取的外部数据存储器

                我们一般都只用到 xdata,我们在头文件<absacc.h>中可以看到这样一个定义

                 #define XBYTE ((unsigned char voalite xdata*)0)

                这样一个宏定义,这个宏定义我按我自己的理解去演示一遍,

                当我们用XBYTE[0X1000]=1;

                想当于  MOV @DPTR,1000H

                            MOV  A,#1

                            MOVX @DPTR,A

                把1写到外部ram地址位0x1000中,如果是 i=XBYTE[0X1000];这就是读了,意思是差不多的。

                 这个地址0x1000,就是通过地址总线发出去的,P0发送0x00也就是低8位,P2发送0x10也就是高8位,发送地址后,控制线发出对应的控制时序,ALE发送锁存,WR发出一个下降沿,这个时候在通过数据总线P0发送1出去。WR在复位到高电平。这就是大概流程。

          当我们不是外扩ram的时候 XBYTE[]中的地址应该怎么去填呢,我们来举的DAC0832的例子,借用的别人的图

        我们0832是在片选CS为低的时候,给WR低电平就可以工作了。

         上图我们可以明显体会到用外扩ram这种编程方法的便利,以及节省很多资源了(用i/o直接操作的话,不加额外的器件,连接两个DAC起码要16个引脚)。

          当我们想让dac0832(1)工作,但片2不工作,就要让P2.7=0,P2.6=0,P2.5=1。是不是这样的。

          所以我们片1的地址高3位就出来了,其余的地址都影响不到它,所以我们称为地址无关位,我们任意填什么都可以,为了方便,我就填0。那么片1的地址  是不是就是XBYTE[0X2000] (001 0 0000 0000 0000),是不是就是这样的,

           同理片2的就为 XBYTE[0X8000] (100 0 0000 0000 0000) 。

            当我们写 XBYTE[0x2000]=0xff;这句话,是不是就启动了dac0832,并写入了0xff。

使用特权

评论回复
沙发
duo点| | 2023-6-5 11:38 | 只看该作者
学习了,支持一下

使用特权

评论回复
板凳
modesty3jonah| | 2023-6-6 17:33 | 只看该作者
rom和ram是怎么分配的              

使用特权

评论回复
地板
everyrobin| | 2023-6-7 13:24 | 只看该作者
单片机内的ROM和RAM如何储存程序与数据

使用特权

评论回复
5
sdCAD| | 2023-6-7 13:31 | 只看该作者
将程序按照功能模块进行划分,尽可能减少重复代码和无用代码,并使用函数库、文件管理等方式来减小代码体积。

使用特权

评论回复
6
uptown| | 2023-6-7 13:36 | 只看该作者
在使用RAM时,需要注意静态存储和动态存储的区别。

使用特权

评论回复
7
tpgf| | 2023-6-8 08:31 | 只看该作者
RAM为随机存储,掉电不会保存数据,而ROM可以在掉电的情况下,依然保存原有的数据

使用特权

评论回复
8
八层楼| | 2023-6-8 09:24 | 只看该作者
在嵌入式的应用中,对 RAM的容量需求不是太大,而且受限于工艺,RAM价格很高

使用特权

评论回复
9
观海| | 2023-6-8 10:19 | 只看该作者
我们用ROM来存储程序等掉电不丢失的数据,而将需要快速读取且支持多次擦除的数据放在RAM中运行

使用特权

评论回复
10
guanjiaer| | 2023-6-8 11:32 | 只看该作者
他们的大小可以表明一款单片机的存储能力和运行能力

使用特权

评论回复
11
heimaojingzhang| | 2023-6-8 12:04 | 只看该作者
我们的 .c 文件及 .h 文件中的代码、全局变量、const定义的常量等数据都存储在ROM中

使用特权

评论回复
12
keaibukelian| | 2023-6-8 13:04 | 只看该作者
现在的ROM往往是由flash构成,所以它的大小一般是以字节为单位,由于ROM价格合理而且为了多存储些数据,它的容量相对较大。

使用特权

评论回复
13
caigang13| | 2023-6-8 18:06 | 只看该作者
单片机C语言用malloc函数分配内存是不是不好

使用特权

评论回复
14
mmbs| | 2023-6-8 22:30 | 只看该作者
单片机访问内RAM,外RAM,ROM的用什么指令

使用特权

评论回复
15
mnynt121| | 2023-6-8 22:49 | 只看该作者
在定义数组时,需要根据实际需求预估所需空间大小,避免出现溢出或浪费的情况。

使用特权

评论回复
16
loutin| | 2023-6-8 23:03 | 只看该作者
对于大量的静态数据或程序代码,可以采用压缩算法进行压缩,以减小ROM的占用空间。

使用特权

评论回复
17
iyoum| | 2023-6-8 23:11 | 只看该作者
需要尽可能地利用硬件提供的缓存、DMA等资源,以减轻CPU的负担,提高系统效率。

使用特权

评论回复
18
tifmill| | 2023-6-8 23:19 | 只看该作者
在程序运行期间,需要及时释放无用的内存空间,避免内存泄漏或溢出的情况。

使用特权

评论回复
19
janewood| | 2023-6-8 23:24 | 只看该作者
充分利用RAM和ROM资源可以提高程序的效率和可靠性

使用特权

评论回复
20
chenjun89| | 2023-6-10 08:19 | 只看该作者
单片机的RAM一般有限,需要做好规划。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

1254

帖子

1

粉丝