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