我有一个自修改程序写入程序闪存区域(它不会破坏程序流程,因为我写入另一个闪存扇区,而不是我的程序运行的闪存扇区 - 它运行在受保护的引导程序部分)。 。
复杂的部分,写入闪存,工作。我可以在调试器中检查它,我发送的值已成功写入闪存。
但是,当我尝试使用LPM
指令检查内容时,它总是读为零。
当LPM
无法阅读时,我发现了以下原因:
RWWSRE
并等到while (SPMCSR & 0b01000000) {}
我使用以下代码进行测试,读取闪存的前两个字节(写入指令成功完成,因为该位置的程序存储器不为零,使用调试器检查)
lpm r0,Z+
lpm r1,Z+
movw r2, r0
在此之前,我将Z
指针设置为零,并使用调试器检查它是否为零(r30
和r31
)。
但是,r2
和r3
始终为零,无论闪光灯中是什么。
还有另一种情况LPM
无法阅读吗?
答案 0 :(得分:2)
我在逐步运行它并检查所有受影响的寄存器的内容时找到了解决方案。事实证明这个问题与LPM
无关,但我保留了这个问题以供将来参考。
代码部分
lpm r0,Z+
lpm r1,Z+
movw r2, r0
在C for循环中,Z
指针在该循环之前设置。但是,循环比较恰好被编译为使用r30
作为临时寄存器,因此它损坏了Z
指针。通过将Z
指针和带有LPM
的部分初始化到同一#asm ... #endasm
块中来解决问题。