2016-05-21 45 views
0

在Atmega 128如何啓用外部SRAM,以及如何將文本複製到外部SRAM?例如,我在.dseg中有一些數據SomeData:.db 0x01,0x02,0x03,.....,0x.25,如何將此文本複製到外部SRAM中,從地址2100h開始?AVR彙編外部SRAM使用

在此先感謝。

+0

你確定你有AtMega128嗎?因爲我確信它沒有外部RAM接口(但是我沒有數據表,只是簡要介紹了atmega1284(後續版本)DS) –

+0

您可以使用軟件來完成此任務 - 查找數據表你想要接口的SRAM,它應該包含用於讀/寫芯片的協議的描述。然後在atmega上實現它。這不容易,也不是有效的,但是可行的。 –

回答

2

首先你讀manual

第19頁存在,顯示外部存儲器如何映射到內存空間中的人物。

外部存儲器接口的描述開始第25頁

存儲器的行爲類似於內部存儲器會做。

以下彙編代碼顯示如何從內部SRAM讀取字節並將其複製到外部SRAM存儲器。

.cseg 
copy: 
     ldi r17, 4 ; counter for how many bytes to copy 
     ldi YL, low(data) ; load pointer to data into Y pointer 
     ldi YH, high(data) 
     ldi ZL, low(0x2100) ; load pointer to external memory into Z 
     ldi ZH, high(0x2100) 
copy_loop: 
     ld r16, Y+ ; r16 <- [Y], Y++ 
     st Z+, r16 ; [Z] <- r16, Z++ 

     dec r17 
     brne copy_loop 
     <other code> 

data: .byte 4 

也對ST一看,LDSTSLDS被用於訪問內存指令。

AVR的指針X,Y和Z是16位寬。

小心!

你寫的東西,如:

.dseg 
data: .db 0x1, 0x2 

這是行不通的。您不能使用.db將數據寫入內部SRAM,因爲它是易失性的,必須使用程序代碼進行初始化!

可以編寫

.cseg 
<CODE> 
data_const: .db 0x1,0x2,0x3,0x4 

.dseg 
data: .byte 4 

這將在內部SRAM在FLASH和儲備創建一個四個字節初始化的數據陣列4個字節的空間。您現在可以將數據從data_const複製到代碼中的數據。順便提一下:C代碼中的預初始化變量也位於閃存中,並且將在執行main()之前通過啓動代碼複製到SRAM中。