【问题标题】:AVR assembly external SRAM usageAVR 组件外部 SRAM 使用
【发布时间】:2016-05-21 16:13:48
【问题描述】:

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

提前致谢。

【问题讨论】:

  • 你确定你有一台 AtMega128 吗?因为我很确定它没有外部 RAM 接口(但我没有数据表 - 只是快速查看了 atmega1284(继任者)DS)
  • 您可以在软件中执行此操作——找到您要连接的 SRAM 的数据表,它应该包含用于读取/写入芯片的协议的描述。然后在atmega上实现它。这既不容易也不高效,但却是可行的。

标签: assembly external avr atmega atmel


【解决方案1】:

首先你阅读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

还可以查看用于访问的 stldstslds 指令记忆。

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 中创建一个 4 字节的初始化数据数组,并在内部 SRAM 中保留 4 字节的空间。您现在可以将 data_const 中的数据复制到代码中的数据中。

顺便说一句:C 代码中预初始化的变量也位于闪存中,并在 main() 开始执行之前由启动代码复制到 SRAM 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-17
    • 2021-02-06
    • 2010-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-04
    • 2023-03-30
    相关资源
    最近更新 更多