我有一个自修改程序,它写入程序闪存区域(它不会中断程序流程,因为我写入了另一个闪存扇区,而不是我的程序正在运行的闪存扇区 - 它在受保护的引导加载程序部分运行)。
复杂的部分,写入闪存,工作正常。我可以在调试器中检查它,我发送的值已成功写入闪存。
但是,当我尝试使用LPM
指令检查内容时,它总是显示为零。
LPM
无法阅读时,我确定了以下原因:
- 当锁定位被设置时,禁止读取闪存。这里不是这种情况,因为没有设置锁定位。
- 由于先前的写指令,闪存的读取被锁定。这里不是这种情况,因为我设置
RWWSRE
并等到绿灯亮起while (SPMCSR & 0b01000000) {}
- 我算错了地址(Z 指针的分段可能很棘手)。这里不是这种情况,因为我也用第一个单词(地址 0)尝试了它,但它仍然不起作用。
我使用以下代码进行测试,读取闪存的前两个字节(写入指令成功完成,因为该位置的程序内存不为零,用调试器检查)
lpm r0,Z+
lpm r1,Z+
movw r2, r0
在此之前,我将Z
指针设置为零,并使用调试器检查它是否真的为零(r30
和r31
)。
但是,无论闪存中的内容如何,都将始终为零r2
。r3
是否还有其他LPM
无法阅读的情况?