您的位置 首页 硬件

51单片机一起外扩RAM,ROM的详细完成及Keil的详细设置

51MCU内部有RAM,ROM,不同于8031。尽管如今的增强行51MCU的内部RAM,ROM可能已经很大的空间。但就技术而言,扩展RAM,ROM还是需要学会的。…

51MCU内部有RAM,ROM,不同于8031。虽然现在的增强行51MCU的内部RAM,ROM或许现已很大的空间。但就技能而言,扩展RAM,ROM仍是需求学会的。
关于不同的规划方案需求,扩展或许依据以下任何一种规划:
A,只扩展RAM
B,只扩展ROM
C,扩展ROM,RAM
总线扩展时,P2口是否可用做一般IO口
这种扩展是依据总线扩展的,所以,P0P2口就现已不能够再做它用了(有网友供给信息,总线扩展P2还能够做一般IO口用,有两种或许:1,P2口复用,好像P1运用373锁存器。2,在总线扩展时,只用到了低地址总线,P2口未用到。就作为一般IO口运用。我们技能还不到位,不做谈论。)
*扩展RAM程序
扩展RAM,在程序中界说的xdata类型 XBYTE类型等地址规模在外部RAM的变量,对其读写的进程。用C51言语编写程序,且运用总线扩展的RAM,则时序电路不必考虑,WR RD等信号由编译器/硬件主动完结。
编译器设置*
内部RAM:0x00~~0xFF
外部RAM:0x0000~~0xFFFF
RAM的地址虽重复,可是两个RAM是没有关系的,所以不会形成搅扰
运用了外部RAM,就在工程选项—off-chip xdata memory中设置 start:0x0000 size:0xFFFF(依据详细的RAM巨细设置size)。
*扩展RAM时的变量定位及接连读取问题*
ROM,RAM的扩展时,需求用到变量的肯定地址定位,函数定位等。
变量的肯定地址定位,是我们在程序中或许需求即时读取某个变量,但变量的类型或许是XDATA,存储在外部RAM中。这儿有两个办法:
1,用 _at_ 定位 关键字定位
unsigned char xdata xxx _at_ 0x1100 //界说变量XXX数据类型xdata,方位0x1100
[memory_space]tepe variable_name _at_ constant;
*肯定地址的变量不能够被初始化;函数或BIT类型的变量是不能够被界说为肯定地址;
2,用 XBYTE 定位 宏界说 肯定地址拜访
#define CBYTE((unsigned char volatile code*)0)
#define DBYTE((unsigned char volatile idata*)0)
#define PBYTE((unsigned char volatile pdata*)0)
#define XBYTE((unsigned char volatile xdata*)0)
////////////////////////////////////////////////////////////////////////////
#define CWORD((unsigned int volatile code*)0)
#define DWORD((unsigned int volatile idata*)0)
#define PWORD((unsigned int volatile pdata*)0)
#define XWORD((unsigned int volatile xdata*)0)
以上是宏界说的原型函数,界说在 #include 头文件中
#defme xxx XBYTE[0x8000] //变量类型为unsigned char 类型的数据xxx,方位xdata 0x8000
yyy=XBYTE[0x8000]; //变量类型为unsigned char 类型的数据yyy,方位xdata 0x8000
(在这儿,有网友说到,当编译器优化时,用肯定地址定位的变量,或许导致变量在接连读取时出
错,选用解决办法:
a,将编译器优化调整为0,即不优化,程序不必修正,做以下操作
>>挑选project窗口的Target,然后翻开”OptionsforTarget” 设置对话框,挑选“C5l”选项卡,
将“Code Optimiztaion”中的“Level”挑选为“0:Costant folding”。再次编译<<
b,修正变量界说,添加“volatile”关键字阐明其特征:便是阐明该变量具有‘蒸发’性,每次的读取都一
有意义的,这样编译器即便在优化时,编译后的代码也不会省掉掉重复读取的进程。如:
unsigned char volatile xdata xxx_at_0x8000;
由上文XBYTE等的宏界说函数原型能够看出,该宏界说现已阐明晰变量具有volatile特性,因而,
也能够直接用XBYTE界说所需求的变量
c,硬件解决办法
以上解决办法为参阅网络文章)
*扩展ROM时的函数定位函数一部分在内部ROM,一部分在外部ROM中
函数定位,个人了解:当一个完好功用的程序存储在外部内部ROM中时,即运用了内部ROM,或许我们内部ROM空间不行,部分函数在外部中,这时,假如要碑文整个功用,就需求告知编译器,其他功用函数的地址(函数在外部ROM中的地址),此刻就要用到函数定位功用。解决办法如下:
….待续…..
51内部ROM地址规模0x0000~0x0FFF,所以外部ROM的地址为0x1000~~最大0xFFFF。
c51bbs有详细介绍
编写完好的程序(假如树立两个工程,仓库等或许分配方位不同,导致地址重复或多个地址犯错),
编译后检查.M51文件,找到需求定位的函数称号信息(如?PR?_BCD2HEX?TOOLS),在KEIL51工程选项—BL51 lacate中code项中参加:?PR?_BCD2HEX?TOOLS(0x1000)再次编译工程,翻开.M51文件会发现?PR?_BCD2HEX?TOOLS现已定位在了0x1000方位了。
假如有多个程序需求定位,办法同上,找出函数的称号信息,添加到BL51 locate的CODE项中,每个函数之间用逗号离隔。并且要注意,所要定位的多个函数依据定位设置之前的地址凹凸组织,仍旧是低地址函数在前,高地址函数在后。
程序分为两部分存储,需求做的设置等如下:
….待续…..
完结函数定位设置后,我们函数是要烧录在两个ROM中,需求将HEX文件切割成两个,内部ROM空间规模与外部ROM空间规模是不一样的,天然就应该将内部ROM的地址规模的HEX代码存储为一个文件,将剩下部分的代码存储为另一个文件,就完结了切割。
例如HEX文件的0x0000~~0x0FFF地址区分为一个文件,0x1000~~0xFFFF区分为另一个文件。
这一点,假如所用的MCU的内部ROM巨细不一致,就需求依据详细的巨细区分切割HEX文件。
*编译器设置
我们是内部ROM和外部扩展ROM一起运用,在工程选项off-chip memory中需求设置外部ROM地址规模,如eprom start:0x1000 size:0xFFFF(依据详细ROM巨细设置size,一起use on-chip memory选项不选,电路中EA接高电平)
*扩展ROM,一切程序都在外部ROM中
51内部ROM不行用,但外部扩展的ROM应该足够了,所以,在扩展了ROM之后,尽量防止编程费事,一切功用均放在外部ROM中,此刻需求的设置操作等如下:
….待续…..
我们程序代码只用到了外部ROM,程序编译等不需求特别的设置,按正常编译。然后将整个代码烧录到外部ROM就能够了。也就不存在HEX文件切割的问题了。
*编译器设置
我们只用到了外部ROM,在工程选项off-chip memory中需求设置外部ROM地址规模,如eprom start:0x0000 size:0xFFFF(依据详细ROM巨细设置size,一起use on-chip memory选项不选,电路中EA接低电平),这儿的设置不同与内外部ROM都用的状况,没有运用内部ROM的状况下需求地址从0x0000开端,程序的开端地址中断向量等都在这儿(详细参阅内部ROM地址的运用)。EA接低电平一共程序是从外部ROM开端读起的,即不必内部ROM。
扩展ROM,RAM时,总线地址怎么组织*
在扩展了ROM,RAM时,总线地址要怎么组织,详细怎样设置呢?操作如下:
……待续…….
在程序规划时,要考虑硬件衔接。例如,在外部ROM,RAM的地址设置时(keil工程选项中),假定P15初始化置1了或在程序中,P15为1时WR RD信号才时序正常(运用了74门电路),则keil工程选项中的地址设置就要考虑作业状况P15是0或1的状况了。页选信号便是从这儿这样而来的,P15页选或地址线高字节页选。
*硬件衔接,需求考虑的问题
扩展ROM,RAM时,硬件需求则样衔接?总线上的时续,总线设备的速度匹配问题?
…….待续……..
运用总线方法衔接扩展设备时,51总线有固定的时序,时序也就决议了速度。比方每个读写的进程,相应的信号持续时间长短,扩展设备能否在这个周期内完结作业,是需求51的总线时序和扩展设备的时序匹配才能够的。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/yingjian/265618.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部