打印

关于单片机外部RAM的问题

[复制链接]
5888|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
790953623|  楼主 | 2012-10-1 13:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.问题一:单片机除256字节外,自己片上扩展了4K个字节,这四K个字节算外部RAM么还是内部RAM??还是说只有通过P0,P2以及WR,RD,ALE口等外接的专门的RAM才算外部RAM。。
2.问题二:片上扩展的RAM,就比如说那4K个字节是用idata访问,还是pdata访问??自己外扩的RAM是用xdata么??
3.问题三:如果片上扩展的RAM和自己外扩的RAM都用xdata的话,那么如何区分是对哪个RAM区进行的操作??就好比片上扩展的4K和自己外扩的4k地址地址重复,单片机如何区分??
补充:本人新手对汇编不太熟悉,所以请大神能从C的角度即idata,xdata来解答,不要说mov,movx等

相关帖子

沙发
znmcu| | 2012-10-1 14:02 | 只看该作者
物理内部,逻辑外部

使用特权

评论回复
板凳
znmcu| | 2012-10-1 14:02 | 只看该作者
xdata

使用特权

评论回复
地板
znmcu| | 2012-10-1 14:06 | 只看该作者
单片机内部有专门寄存器关闭内部扩展ram。下载软件上也有选项,关闭内部扩展ram。如果不关闭,内部扩展ram还是内部,不使用外部ram。即真正的外扩ram的重叠区域不会访问到。

使用特权

评论回复
5
znmcu| | 2012-10-1 14:10 | 只看该作者
标准51体系结构中,内部前128字节ram是data,前256字节是idata,idata有一半与data重叠,所以通常使用idata即可。sfr地址与内部地址重叠,所以c51中使用sfr关键字专门对特殊功能寄存器进行定义。

使用特权

评论回复
6
znmcu| | 2012-10-1 14:12 | 只看该作者
为什么51内部只能有256的内部ram,根源在于51内核的8位地址总线。外部可扩展64k ram,其根源在于外部16位地址总线。

使用特权

评论回复
7
ningling_21| | 2012-10-1 14:19 | 只看该作者
本帖最后由 ningling_21 于 2012-10-1 14:22 编辑

问题一:单片机除256字节外,自己片上扩展了4K个字节,这四K个字节算外部RAM么还是内部RAM?

扩展的,当然是外部RAM.  用XDATA访问只要是扩展的RAM,都可以用XDATA访问

使用特权

评论回复
8
790953623|  楼主 | 2012-10-1 14:23 | 只看该作者
4# znmcu 1.是不是说我对寄存器进行设置关闭内部RAM,这时我使用xdata时,就是直接对自己外部扩展的RAM操作,而不关闭的话,用xdata就是对内部片上扩展的RAM操作??另外还有一个问题??如果片上扩展了4K,片外扩展了64k,我不关片内RAM的话,当变量超4k后,是否自动跳转到外部的RAM上呢???

使用特权

评论回复
9
znmcu| | 2012-10-1 15:29 | 只看该作者
你答对了。

使用特权

评论回复
10
znmcu| | 2012-10-1 15:30 | 只看该作者
任何cpu,只要寻址空间有重叠,所谓的overlap,则必然有重映射。

使用特权

评论回复
11
NE5532| | 2012-10-1 18:40 | 只看该作者
楼主,你的问题没有一个跟C语言相关,不要听那些搞C语言的,他们根本就没搞懂硬件基础。

广义上,外扩RAM都叫片外RAM,但是单片机能不能自动访问这些RAM取决于构架,你没有指明单片机型号,根据你提供的信息,猜是51,那么只有通过你说的那些物理管脚扩展的RAM(总线)上的才是硬件可以直接寻址的RAM,如果你用SPI接口的RAM,那就只能自己写程序去访问了,程序也无法直接认识这种片外RAM内的变量,只有你自己通过程序编写驱动来虚拟访问。

楼主要详细知道这些,需要学汇编,学单片机内核和寻址方式才能知道。

使用特权

评论回复
12
dqyubsh| | 2012-10-2 05:00 | 只看该作者
1.问题一:单片机除256字节外,自己片上扩展了4K个字节,这四K个字节算外部RAM么还是内部RAM??还是说只有通过P0,P2以及WR,RD,ALE口等外接的专门的RAM才算外部RAM。。
你只要知道片内RAM和片外RAM,都是XRAM,都是要用三总线操作的。
2.问题二:片上扩展的RAM,就比如说那4K个字节是用idata访问,还是pdata访问??自己外扩的RAM是用xdata么??
都用XDATA。为了移植性,最好不用idata,pdata这种指令,直接无视它。
3.问题三:如果片上扩展的RAM和自己外扩的RAM都用xdata的话,那么如何区分是对哪个RAM区进行的操作??就好比片上扩展的4K和自己外扩的4k地址地址重复,单片机如何区分??
地址重叠,自动选片内;超过4K,用片外。
补充:本人新手对汇编不太熟悉,所以请大神能从C的角度即idata,xdata来解答,不要说mov,movx等

现在还分这些RAM,确实很迂腐,很过气,直接扎垃圾桶得了。如果用C语言,这些你都不用管,C本身就是屏蔽这些复杂性。

有的51内核单片机,比如68013A,一共有16K片内RAM。这些RAM既可以用来存放固件code,也可以做数据缓冲data,根本没必要区分它究竟是什么结构。统统当作XRAM,这个XRAM也仅仅是C51的助记符而已,没有那些神秘的事情。

总数是16K,code用得多,data就少,反之亦然。实在不够,你就外扩。如果你一定要把它与片外RAM做区别,那你又迂腐了。因为C51没有助记符可以区分的,你自己要清楚地知道你的数据存在哪里,当然,你不知道也没所谓,反正code+data不超界就可以用。谁要説性能,那更是胡扯,你指望C51有个P性能,用51也跟性能无关,能用就得了。

使用特权

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

本版积分规则

14

主题

71

帖子

1

粉丝