0

我有一个自修改程序,它写入程序闪存区域(它不会中断程序流程,因为我写入了另一个闪存扇区,而不是我的程序正在运行的闪存扇区 - 它在受保护的引导加载程序部分运行)。

复杂的部分,写入闪存,工作正常。我可以在调试器中检查它,我发送的值已成功写入闪存。

但是,当我尝试使用LPM指令检查内容时,它总是显示为零。

LPM无法阅读时,我确定了以下原因:

  1. 当锁定位被设置时,禁止读取闪存。这里不是这种情况,因为没有设置锁定位。
  2. 由于先前的写指令,闪存的读取被锁定。这里不是这种情况,因为我设置RWWSRE并等到绿灯亮起while (SPMCSR & 0b01000000) {}
  3. 我算错了地址(Z 指针的分段可能很棘手)。这里不是这种情况,因为我也用第一个单词(地址 0)尝试了它,但它仍然不起作用。

我使用以下代码进行测试,读取闪存的前两个字节(写入指令成功完成,因为该位置的程序内存不为零,用调试器检查)

  lpm r0,Z+
  lpm r1,Z+
  movw r2, r0

在此之前,我将Z指针设置为零,并使用调试器检查它是否真的为零(r30r31)。

但是,无论闪存中的内容如何,​​都将始终为零r2r3

是否还有其他LPM无法阅读的情况?

4

1 回答 1

2

我在逐步运行它并检查所有受影响寄存器的内容时​​找到了解决方案。原来这个问题与 无关LPM,但我保留这个问题以备将来参考。

代码部分

  lpm r0,Z+
  lpm r1,Z+
  movw r2, r0

在 C for 循环中,并且Z在该循环之前设置了指针。但是,循环比较恰好被编译为r30用作临时寄存器,因此它损坏了Z指针。通过将Z指针的初始化和带有 的部分LPM放在同一个#asm ... #endasm块中来解决问题。

于 2012-08-08T07:52:54.140 回答