<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 51單片機同時(shí)外擴RAM,ROM的具體實(shí)現及Keil的具體設置

51單片機同時(shí)外擴RAM,ROM的具體實(shí)現及Keil的具體設置

作者: 時(shí)間:2016-11-19 來(lái)源:網(wǎng)絡(luò ) 收藏
51MCU內部有RAM,ROM,不同于8031。盡管如今的增強行51MCU的內部RAM,ROM可能已經(jīng)很大的空間。但就技術(shù)而言,擴展RAM,ROM還是需要學(xué)會(huì )的。
對于不同的設計方案需求,擴展可能基于以下任何一種設計:
A,只擴展RAM
B,只擴展ROM
C,擴展ROM,RAM
總線(xiàn)擴展時(shí),P2口是否可用做普通IO口
這種擴展是基于總線(xiàn)擴展的,所以,P0P2口就已經(jīng)不可以再做它用了(有網(wǎng)友提供信息,總線(xiàn)擴展P2還可以做普通IO口用,有兩種可能:1,P2口復用,如同P1利用373鎖存器。2,在總線(xiàn)擴展時(shí),只用到了低地址總線(xiàn),P2口未用到。就作為普通IO口應用。由于技術(shù)還不到位,不做評論。)
*擴展RAM程序
擴展RAM,在程序中定義的xdata類(lèi)型 XBYTE類(lèi)型等地址范圍在外部RAM的變量,對其讀寫(xiě)的過(guò)程。用C51語(yǔ)言編寫(xiě)程序,且使用總線(xiàn)擴展的RAM,則時(shí)序電路不用考慮,WR RD等信號由編譯器/硬件自動(dòng)完成。
編譯器設置*
內部RAM:0x00~~0xFF
外部RAM:0x0000~~0xFFFF
RAM的地址雖重復,但是兩個(gè)RAM是沒(méi)有關(guān)系的,所以不會(huì )造成干擾
使用了外部RAM,就在工程選項---off-chip xdata memory中設置 start:0x0000 size:0xFFFF(根據具體的RAM大小設置size)。
*擴展RAM時(shí)的變量定位及連續讀取問(wèn)題*
ROM,RAM的擴展時(shí),需要用到變量的絕對地址定位,函數定位等。
變量的絕對地址定位,是由于在程序中可能需要即時(shí)讀取某個(gè)變量,但變量的類(lèi)型可能是XDATA,存儲在外部RAM中。這里有兩個(gè)方法:
1,用 _at_ 定位 關(guān)鍵字定位
unsigned char xdata xxx _at_ 0x1100 //定義變量XXX數據類(lèi)型xdata,位置0x1100
[memory_space]tepe variable_name _at_ constant;
*絕對地址的變量不可以被初始化;函數或BIT類(lèi)型的變量是不可以被定義為絕對地址;
2,用 XBYTE 定位 宏定義 絕對地址訪(fǎng)問(wèn)
#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] //變量類(lèi)型為unsigned char 類(lèi)型的數據xxx,位置xdata 0x8000
yyy=XBYTE[0x8000]; //變量類(lèi)型為unsigned char 類(lèi)型的數據yyy,位置xdata 0x8000
(在這里,有網(wǎng)友提到,當編譯器優(yōu)化時(shí),用絕對地址定位的變量,可能導致變量在連續讀取時(shí)出
錯,采用解決方法:
a,將編譯器優(yōu)化調整為0,即不優(yōu)化,程序不用修改,做以下操作
>>選擇project窗口的Target,然后打開(kāi)"OptionsforTarget” 設置對話(huà)框,選擇“C5l”選項卡,
將“Code Optimiztaion”中的“Level”選擇為“0:Costant folding”。再次編譯<<
b,修改變量定義,增加“volatile”關(guān)鍵字說(shuō)明其特征:就是說(shuō)明該變量具有‘揮發(fā)’性,每次的讀取都一
有意義的,這樣編譯器即使在優(yōu)化時(shí),編譯后的代碼也不會(huì )省略掉重復讀取的過(guò)程。如:
unsigned char volatile xdata xxx_at_0x8000;
由上文XBYTE等的宏定義函數原型可以看出,該宏定義已經(jīng)說(shuō)明了變量具有volatile特性,因此,
也可以直接用XBYTE定義所需要的變量
c,硬件解決辦法
以上解決方法為參考網(wǎng)絡(luò )文章)
*擴展ROM時(shí)的函數定位函數一部分在內部ROM,一部分在外部ROM中
函數定位,個(gè)人理解:當一個(gè)完整功能的程序存儲在外部?jì)炔縍OM中時(shí),即利用了內部ROM,可能由于內部ROM空間不夠,部分函數在外部中,這時(shí),如果要執行整個(gè)功能,就需要告訴編譯器,其他功能函數的地址(函數在外部ROM中的地址),此時(shí)就要用到函數定位功能。解決方法如下:
....待續.....
51內部ROM地址范圍0x0000~0x0FFF,所以外部ROM的地址為0x1000~~最大0xFFFF。
c51bbs有詳細介紹
編寫(xiě)完整的程序(如果建立兩個(gè)工程,堆棧等可能分配位置不同,導致地址重復或多個(gè)地址出錯),
編譯后查看.M51文件,找到需要定位的函數名稱(chēng)信息(如?PR?_BCD2HEX?TOOLS),在KEIL51工程選項---BL51 lacate中code項中加入:?PR?_BCD2HEX?TOOLS(0x1000)再次編譯工程,打開(kāi).M51文件會(huì )發(fā)現?PR?_BCD2HEX?TOOLS已經(jīng)定位在了0x1000位置了。
如果有多個(gè)程序需要定位,方法同上,找出函數的名稱(chēng)信息,添加到BL51 locate的CODE項中,每個(gè)函數之間用逗號隔開(kāi)。而且要注意,所要定位的多個(gè)函數根據定位設置之前的地址高低安排,仍舊是低地址函數在前,高地址函數在后。
程序分為兩部分存儲,需要做的設置等如下:
....待續.....
完成函數定位設置后,由于函數是要燒錄在兩個(gè)ROM中,需要將HEX文件分割成兩個(gè),內部ROM空間范圍與外部ROM空間范圍是不一樣的,自然就應該將內部ROM的地址范圍的HEX代碼存儲為一個(gè)文件,將剩余部分的代碼存儲為另一個(gè)文件,就完成了分割。
例如HEX文件的0x0000~~0x0FFF地址劃分為一個(gè)文件,0x1000~~0xFFFF劃分為另一個(gè)文件。
這一點(diǎn),如果所用的MCU的內部ROM大小不一致,就需要根據具體的大小劃分分割HEX文件。
*編譯器設置
由于是內部ROM和外部擴展ROM同時(shí)使用,在工程選項off-chip memory中需要設置外部ROM地址范圍,如eprom start:0x1000 size:0xFFFF(根據具體ROM大小設置size,同時(shí)use on-chip memory選項不選,電路中EA接高電平)
*擴展ROM,所有程序都在外部ROM中
51內部ROM不夠用,但外部擴展的ROM應該足夠了,所以,在擴展了ROM之后,盡量避免編程麻煩,所有功能均放在外部ROM中,此時(shí)需要的設置操作等如下:
....待續.....
由于程序代碼只用到了外部ROM,程序編譯等不需要特殊的設置,按正常編譯。然后將整個(gè)代碼燒錄到外部ROM就可以了。也就不存在HEX文件分割的問(wèn)題了。
*編譯器設置
由于只用到了外部ROM,在工程選項off-chip memory中需要設置外部ROM地址范圍,如eprom start:0x0000 size:0xFFFF(根據具體ROM大小設置size,同時(shí)use on-chip memory選項不選,電路中EA接低電平),這里的設置不同與內外部ROM都用的情況,沒(méi)有使用內部ROM的情況下需要地址從0x0000開(kāi)始,程序的開(kāi)始地址中斷向量等都在這里(具體參考內部ROM地址的使用)。EA接低電平表示程序是從外部ROM開(kāi)始讀起的,即不用內部ROM。
擴展ROM,RAM時(shí),總線(xiàn)地址如何安排*
在擴展了ROM,RAM時(shí),總線(xiàn)地址要如何安排,具體怎樣設置呢?操作如下:
......待續.......
在程序設計時(shí),要考慮硬件連接。例如,在外部ROM,RAM的地址設置時(shí)(keil工程選項中),假設P15初始化置1了或在程序中,P15為1時(shí)WR RD信號才時(shí)序正常(使用了74門(mén)電路),則keil工程選項中的地址設置就要考慮工作狀態(tài)P15是0或1的情況了。頁(yè)選信號就是從這里這樣而來(lái)的,P15頁(yè)選或地址線(xiàn)高字節頁(yè)選。
*硬件連接,需要考慮的問(wèn)題
擴展ROM,RAM時(shí),硬件需要則樣連接?總線(xiàn)上的時(shí)續,總線(xiàn)設備的速度匹配問(wèn)題?
.......待續........
使用總線(xiàn)方式連接擴展設備時(shí),51總線(xiàn)有固定的時(shí)序,時(shí)序也就決定了速度。比如每個(gè)讀寫(xiě)的過(guò)程,相應的信號持續時(shí)間長(cháng)短,擴展設備能否在這個(gè)周期內完成工作,是需要51的總線(xiàn)時(shí)序和擴展設備的時(shí)序匹配才可以的。


關(guān)鍵詞: 51單片機外擴RAMROMKei

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>