在Atmega 128上如何启用外部SRAM,以及如何将文本复制到外部SRAM?例如,我在.dseg中有一些数据SomeData:.db 0x01,0x02,0x03,.....,0x.25,如何从地址2100h开始将此文本复制到外部SRAM?
提前致谢。
答案 0 :(得分: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 , ld , sts 和 lds 指令存储器中。
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
这将在FLASH中创建一个四字节初始化数据阵列,并在内部SRAM中保留4个字节的空间。您现在可以将数据从data_const复制到代码中的数据。
顺便提一下:C代码中的预初始化变量也位于闪存中,并在执行main()之前由启动代码复制到SRAM中。