AVR组装外部SRAM使用

时间:2016-05-21 16:13:49

标签: assembly external avr atmega atmel

在Atmega 128上如何启用外部SRAM,以及如何将文本复制到外部SRAM?例如,我在.dseg中有一些数据SomeData:.db 0x01,0x02,0x03,.....,0x.25,如何从地址2100h开始将此文本复制到外部SRAM?

提前致谢。

1 个答案:

答案 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中。