2016年11月30日 星期三

[C51/ARM] 8051(C51)記憶體結構(ROM/RAM/SFR)

使用C51編譯器時,對於變數的宣告,除了變數名稱和資料型態外,還要指定記憶體類型,這樣51才知道要把變數放在硬體中的哪一個記憶體,如沒指定記憶體位子,則自動選擇內部記憶體(data)0x00~0x7F




內部資料記憶體(RAM) 0x80~0xFF,只能以間接定址方式存取
特殊功能站存器(SFR) 0x80~0xFF,只能以直接定址方式存取
(以上雖然地址重疊,但兩者是完全獨立的硬體空間)

資料型態:bit
●個位元變數宣告,儲存在內部資料記憶體的0x20~0x2F中。
資料型態:sbit(有兩種用途)
●存取內部資料記憶體(RAM)的可位元定址區0x20~0x2F。
●存取特殊功能暫存器(SFR)0x80~0xff中的可位元定址暫存器。

下圖左邊黑框是特殊功能暫存器(SFR)之可位元定址暫存器,其餘只能以位元組定址方式存取。


圖片來源

程式本身是放在ROM的區域(執行中是不會改變的),變數跟暫存器放在RAM(執行中可以改變)

SFR以RAM做為暫存器(Register),因為暫存器它的資料是變動性的,所以要用RAM才可以

ABSACC.H 提供了下列方便的宏(Macro)定義。
#define CBYTE ((unsigned char volatile code *) 0)
#define DBYTE ((unsigned char volatile data *) 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 data *) 0)
#define PWORD ((unsigned int volatile pdata *) 0)
#define XWORD ((unsigned int volatile xdata *) 0)

解說:
XBYTE為指向xdata地址空間unsigned char數據類型的指針,指針值為0 這樣,可以直接用XBYTE[0xnnnn]或*(XBYTE+0xnnnn)訪問外部RAM了。

例如:
#include<absacc.h>
rval=CBYTE[0x0004] //指向程式存儲器0004H地址
rval=XBYTE[0x0004] //指向外部RAM的0004H地址



#8051#C51#MCU#ROM#RAM#code#data#idata#bdata

沒有留言:

張貼留言