【问题标题】:AVR Assembly - store port data in program flashAVR 组装 - 将端口数据存储在程序闪存中
【发布时间】:2015-07-05 02:37:46
【问题描述】:

有人能指点我一个很好的教程,解释在 Atmega 328P 的程序闪存中存储数据吗?我计划以 1 Mhz 的频率从 portB 接收 8 位数据,我想将接收到的前 19200 字节数据存储在具有 32k 内存的程序闪存中。我是 AVR 程序集的新手,在阅读了所有可以用谷歌搜索的内容后我有点困惑,因此非常感谢直接回答或阅读一些好的教程。

到目前为止,我已将其编码为

LDI XL, LOW(NRWW_START_ADDR)
LDI XH, HIGH(NRWW_START_ADDR)
loadBuffer:
IN R0,PORTB
ST X+,R0
CPI XH,0x4B
BRNE loadBuffer

但我不确定这是否是正确的做法。我不想覆盖引导加载程序。另外,我正在寻找汇编程序中的解决方案。

非常感谢任何帮助或指针。

【问题讨论】:

  • ST 指令不写入程序存储器。您需要使用 STM 指令来写入程序存储器,但这比这要复杂得多。您也不能以这种方式从 PORTB 读取串行数据。 PORTB 寄存器仅用于输出,它是一个并行端口输出。最后,如果您的程序确实有效,它将覆盖引导加载程序部分,因为它位于 NRWW 部分,并溢出程序存储器的末尾。 NRWW 段只有 2K,存在于程序存储器的末尾。
  • 非常感谢。你能告诉我在什么位置可以开始写入闪存吗?我在想我需要以某种方式找出引导加载程序的可用区域,并且应用程序将被写入闪存。你知道怎么解决吗?
  • 您需要在应用程序中为缓冲区保留 19200 字节(9600 字)。缓冲区需要按页对齐(128 字节,64 字),因为您必须按页擦除和写入程序存储器。您还需要将 STM 指令放在引导加载程序部分,因为它在应用程序部分不起作用。您还需要保留一大块 SRAM,以便在页面写入操作发生时使用缓冲区来存储传入的数据。执行这些操作需要 3.7 毫秒到 4.5 毫秒。完成这一切所需的代码比您的示例代码复杂得多。

标签: assembly avr arduino-uno atmega atmelstudio


【解决方案1】:

两个音符:

  1. 您在此示例中犯了一个常见错误:在同一端口上混洗输入和输出。如果要从B端口读取,则必须读取PINB;如果你想给它写信,你必须写信给PORTB。 (假设之前设置了DDRB。)

  2. 您确定要使用闪存存储数据吗?数据表说:

    写入/擦除周期:10,000

【讨论】:

  • 嗨,我意识到我对代码不小心,对我来说它仍然是伪代码。我知道读/写限制,但我可以接受“附带损害”。我阅读并理解闪存只能由位于引导加载程序部分的代码写入 - 这使得它变得更加棘手。由于非常严格的时序限制,我正在使用汇编程序进行编码。我想从 1 Mhz 的数字输入端口捕获 2 位数据,持续大约 65k 周期。所以本质上,我需要每 4 个周期将 2 位数据累积成一个字节,然后每一个字节。
猜你喜欢
  • 2016-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-17
  • 2019-07-10
  • 1970-01-01
  • 1970-01-01
  • 2016-09-17
相关资源
最近更新 更多