微控制器內部擴充套件RAM

2021-07-03 20:02:39 字數 3024 閱讀 8164

51微控制器內部只有128位元組的ram(8051),而8052有256位元組的ram,低128位元組ram直接或間接定址都可以,高128位元組ram與srf特殊功能暫存器共用位址,sfr只能直接定址,高128位元組ram只能間接定址。所以通常用匯流排方式擴充套件一片ram。一般用62256(32kx8bit ram)。

現在新出的51微控制器都在內部擴充套件了外部ram。這個ram還是叫外部ram,不過在晶元內部,之所以還叫外部ram,是因為是用外部匯流排連線的,訪問方式還是用movx訪問。可以參考stc89c58rd+,擴充套件了1024位元組(byte)ram。所以stc89c58rd+一共有1024byte+256byte=1280byte這麼多位元組的ram。

內部擴充套件ram的使用

stc89c58rd+內部擴充套件ram的使用是通過對特殊功能暫存器auxr賦值實現的。

extram

internal/external ram access 

內部/ 

外部ram 訪問

0:

內部擴充套件的

ext_ram 

可以訪問.

rd+ 

系列微控制器 在

00h 

到3ffh 

單元(1024 

位元組),

使用movx @dptr 

指令訪問,超過

400h 

的位址空間總是訪問外部資料儲存器(含

400h 

單元),

movx @ri 

只能訪問

00h 

到ffh 單元

rc 系列微控制器 在

00h 

到ffh 

單元(256 

位元組),

使用movx @dptr 

指令訪問,超過

100h 

的位址空間總是訪問外部資料儲存器(含

100h 

單元),

movx @ri 

只能訪問

00h 

到ffh 單元

1:external data memory access.

外部資料儲存器訪問

,禁止訪問內部擴充套件

ram,此時

movx @dptr / movx @ri 的

使用同普通

8052 

微控制器除錯過程:

之前的板子是使用stc89c51rd+匯流排方式驅動62256,但只用到1024位元組的ram,而stc89c51rd+自身就有內部擴充套件的1k(外部)ram,所以這次先沒焊接62256。沿用以前程式(問題就處在這

!!!)。(以下程式經過簡化)

#include

#include

#include

void serial_init(void);

void printvalue(void);

void main(void)

void serial_init(void)

void printvalue(void)

for (j=0;j<3;j++)

delayms(10);

ti=0;                               //

關串列埠定時器 }

printf串列埠輸出。應該輸出scandata[0], scandata[1], scandata[2],都為0,可是確輸出0

256

512

我很吃驚,這麼簡單的程式都會出錯,所以一直找問題。問題出在auxr=0x03,之前是用了62256的,但這次沒有用,xdata的資料應該儲存在內部擴充套件的ram裡面,但確因為aurx這個暫存器進行相應改動,仍然訪問外部ram(62256)。因改為auxr=0x01 / auxr="0x00"。(auxr第一位是aleoff,用於ale禁止輸出)。改了之後,串列埠輸出:00

0正確了j

後來程式又改為:

#include

#include

#include

void serial_init(void);

void printvalue(void);

xdata unsigned int addata[512];

void main(void)

void serial_init(void)

void printvalue(void)

for (j=0;j<3;j++)

delayms(10);

ti=0;                               //

關串列埠定時器 }

定義了乙個全域性變數陣列addata[512],這個陣列的元素是int型的(16bit),所以一共占用1024位元組ram,加上3位元組的scandata陣列,一共使用了1027個位元組,編譯後也可以在keil的output window中看出。

program size: data="32".1 xdata="1027" code="1175"

此時,雖然auxr=0x01,定義成訪問內部擴充套件ram,但由於addata[512]是全域性變數,定義時就分配ram,所以但在printvalue裡分配區域性變數scandata時,ram已經超過的stc89c58rd+的1024內部擴充套件ram的上限,所以串列埠輸出出錯,和之前一樣,輸出

0256

512所以,千萬要注意外部ram夠不夠,不夠的話,就不要省一片62256了j

注意的話:

快速使用的數    用內部ram,只有128位元組(8051)/256位元組(8051)  訪問只用1個機器週期

儲存的資料      內部擴充套件的ram  要注意晶元datasheet上內部擴充套件ram的大小

外部ram  用匯流排方式訪問,如32kx8 ram 62256

51微控制器最大可64k定址

51微控制器內部ram

51微控制器預設的內部ram只有128位元組,52微控制器增加至256位元組,stc89c54 55 58 516等增加到1280位元組。微控制器內部ram,共256個單元,使用者使用前128個單元,用於存放可讀寫資料,後128個單元被專用暫存器占用。現在新出的51微控制器都在內部擴充套件了外部ra...

2 1 微控制器內部資源

在這裡我所講到的微控制器內部資源,和傳統微控制器書籍中講微控制器內部結構不同。我這裡講到的內部資源,是指作為微控制器使用者,微控制器提供給我們可使用的東西。總結起來,主要是三大資源 flash 程式儲存空間,早期微控制器是 otprom。ram 資料儲存空間。sfr 特殊功能暫存器。flash 在早...

51微控制器內部資源

運算器 功能 1 從儲存器中取出下一條要執行的指令 取指 2 對取出的指令進行解碼 解碼 3 指揮運算器運算或控制資料傳送 指揮 1 pc是乙個16位專用暫存器,由cpu控制提供下一條執行指令的首位址 2 程式執行時自動加1 按順序執行 3 復位時值為0000h,程式從0開始 4 可被指令修改功能實...