1. 程式人生 > >STC89C52微控制器的內外的RAM,ROM的討論

STC89C52微控制器的內外的RAM,ROM的討論

源地址:http://www.360doc.com/content/13/0204/10/6973384_264152196.shtml

關於STC89C52: 

1、STC89C52只有512位元組的的RAM,包括2部份,一是256位元組的內部RAM,二是256位元組的外部RAM;STC89C54以上的晶片才有1K的RAM(內256+外1024)

 2、1K的EEPROM(應為2K)出廠時內建有支援序列下載功能的程式碼,配合官方下載軟體完成程式碼的串列埠下載。這個區域在實際應用當中也可用於可儲存斷電後不能丟失的資料,但實際操作上不能像RAM那樣直接讀寫,需要通過專門的暫存器操作來完成讀寫。 

3、EEPROM不是ROM,也不是RAM,EEPROM也沒有用作RAM--你先這樣記,這個問題說起來內容比較多,後面細談。

 4、Flash程式儲存器8K就是當ROM用(這句話嚴格的講應該說成“Flash程式儲存器8K就是當程式儲存器用”):基本上是這樣。關於ROM、FALSH後面細說。 是否需要1K的RAM:可在編譯完成後觀察編譯結果,如果能編譯成功,應該有類似下面的資訊:“program size:data=9.0,xdata=1,code =2345”,其中data的整數部份就是你實際需要的內部RAM位元組數,xdata是你實際需要的外部RAM位元組數,code是程式碼長度。你可以根據這個資訊選擇最合適的STC微控制器型號。具體到STC89C52:data<256,xdata<256,code<8192就行對上述的一些概念補充說明(包括_at_)

 1、51微控制器的C語言中有個需要關注的概念就是變數或資料的儲存模式(PC機是否有類似的情況我不瞭解)。在C51中的儲存模式是data、bdata、idata、pdata、xdata、code共6種:

data、bdata、idata:就是說變數或資料位於微控制器的內部RAM中(ST89C52有256位元組),訪問速度最快。

 pdata、xdata:就是說變數或資料位於擴充套件的外部RAM中(ST89C52內集成了256位元組),相對內部RAM訪問速度要慢。

code:就是程式程式碼,位於微控制器的程式儲存其中(ST89C52內含8192位元組)

 KEIL C編譯時在有個選項叫資料儲存模式(Memory Model),如果

選擇小模式,則程式中的變數一般會放在內部RAM(data)中,選擇其它模式則會放在外部RAM(xdata或pdata,採用這兩種儲存模式的變數在物理上都放在外部RAM中,只是定址方式有所不同,整體上pdata更快些);當然,如果在定義變數時就聲明瞭儲存模式,編譯時會根據宣告決定該變數在哪個區。比如:char data flag就是指定將flag放在內部RAM中;char xdata flag _at_0x0000則指定放在外部RAM中,而且地址是0x0000。 "_at_" 用於指定變數在記憶體中的地址。指定地址的方法優點在於除錯方便,比如模擬單步執行時可以直接到該地址去更直觀的觀察變數的實際變化情況,若不指定則編譯器會自己決定放在什麼地方,只能通過.M51檔案去獲取該變數的地址了。其缺點則是容易出錯,由於人為的因素,可能會成各變數的地址重疊。所以實際應用中一般都不指定地址,編譯器會自動安排的,除非是特殊要求。 這裡針對內部RAM和外部RAM再說幾句:早先的微控制器(8031、8032)外部RAM和程式儲存器都需要通過P0口P2口來擴充套件的,51微控制器本身沒有哪怕是1個位元組的外部RAM,擴充套件起來很麻煩。後來隨著發展才演變到現在幾乎所有的微控制器都或多或少的集成了RAM和程式儲存器,這樣大多數應用只需要設計功能電路就可以了,不需要再去擴充套件,這就降低了不少成本。

2、關於FLASH、ROM、PROM、EPROM、EEPROM、RAM 我們現在一般都會把微控制器的程式儲存器叫ROM,早先的硬體程式程式碼確實是放在ROM型的器件中(包括電腦的BIOS),所以ROM就是程式、程式就是ROM,大家都理解,就成習慣了。其實這是不對的,真正的ROM現在很少用了。

下面就這幾個名詞解釋一下: 

RAM:一般都叫記憶體,特點是讀寫速度快,但斷電後資料丟失(後5種斷電後資料不丟失)

 ROM:只讀儲存器。特點是隻能讀,其內容在晶片出廠時就已經固化,如果有錯只能扔掉

 PROM:可程式設計只讀儲存器。特點是實際應用中只能讀,但應用產品生產環節可由使用者來完成對晶片的程式設計,只能寫1次,有錯的話下場同ROM。 

EPROM:可重複擦寫的只讀儲存器。特點是實際應用中只能讀,但可以通過紫外線擦除(也有電擦除的),從而實現再程式設計,只是程式設計時一般需要將晶片取下來在專用裝置上擦除、程式設計(電擦除的雖然可以在使用者系統上實現擦除及程式設計,但必須設計專門的擦除程式設計電路)。上世紀90年代基本上都採用的是這種模式,如果你看到某個晶片上有個小玻璃窗,一般就是這種工藝的晶片。紫外線擦除需要15分鐘的時間,也很麻煩,而且映像中程式設計次數只有1000次。

 EEPROM:可重複擦寫的非易失性儲存器。特點是可讀可寫,且斷電後資料不丟失。採取這種工藝的晶片大多數都是通過IIC匯流排模式來訪問的。但其容量一般都不大,適合於資料不多的應用。

 FLASH:可重複擦寫的非易失性儲存器。特點是可讀可寫,且斷電後資料不丟失。與EEPROM的主要區別在於口線更多、儲存容量更大、速度更快,還有就是擦寫方式不同:EEPROM可按位元組擦寫,而FLASH是塊擦寫模式,所以速度上FALSH的讀寫更快。 STC微控制器為什麼要採取EEPROM的模式而不採用FLASH我不知道,可能是因為EEPROM相對成本較低,而且可以直接用作非易失性儲存,不需要使用者外擴EEPROM了

在STC89C52非常感謝你,我說下我的理解:在Memory Model下設定compact,程式中就可以直接char i;預設的就是用的xram?不設定Memory Model,預設small,不過我在程式裡面用pdata,編譯後,也會使用xram?Program Size: data=159.1 xdata=0 code=5628這個data=159.1是不是編譯時候檢測到的變數定義使用ram情況,不包含程式處理中堆疊和區域性變數的使用?我要使用xram用idata還是pdata?data不夠我要儲存陣列怎麼用?
1、在Memory Model下設定compact,程式中就可以直接char i;預設的就是用的xram? 對。就是在外部RAM,不過應該是pdata,只是訪問方式和xdata不一樣,這點可以不用關心。2、不設定Memory Model,預設small,不過我在程式裡面用pdata,編譯後,也會使用xram? 沒錯!3、Program Size: data=159.1 xdata=0 code=5628這個data=159.1是不是編譯時候檢測到的變數定義使用ram情況,不包含程式處理中堆疊和區域性變數的使用? 區域性變數肯定包含在裡面,堆疊我說不大好,沒有在如此的極限狀態下用過。不過如果編譯能通過說明堆疊、區域性變數等都夠用。所以在建立工程前應選擇好晶片。4、我要使用xram用idata還是pdata? 用xram應使用pdata或xdata。idata和data都屬於內部RAM,只是idata採用的是間接訪問模式,data是直接訪問模式,效率上後者更高。 5、data不夠我要儲存陣列怎麼用 編譯時可以選擇small模式,然後宣告陣列是用比如:uchar xdata xx[100],就行了,這樣的話其它的變數都會使用內部RAM,只有陣列由於聲明瞭xdata會放到外部RAM中。其實這也是常規做法,只有內部變數不夠的時候才會選用中模式或大模式,然後相提高程式碼效率時,再將那些區域性變數什麼的去宣告為data、idata等,倒過來做。如果嫌麻煩直接使用大模式也行。