2016-05-21 49 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中。