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),如果
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等,倒過來做。如果嫌麻煩直接使用大模式也行。