【发布时间】: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