プログラムフラッシュ領域に書き込む自己変更プログラムがあります(プログラムが実行されているフラッシュセクターとは別のフラッシュセクターに書き込むため、プログラムフローを中断しません-保護されたブートローダーセクションで実行されます)。
フラッシュへの書き込みという複雑な部分が機能します。デバッガーで確認できます。送信した値はフラッシュに正常に書き込まれています。
しかし、LPM
命令で内容を確認しようとすると、常にゼロになっています。
LPM
読み取りに失敗する可能性がある場合、次の原因を特定しました。
- ロック ビットが設定されている場合、フラッシュの読み取りを禁止します。ロックビットが設定されていないため、ここでは当てはまりません。
- フラッシュの読み取りは、前の書き込み命令のためにロックされています。ここではそうではありません。設定
RWWSRE
して緑色のライトが点灯するまで待ちますwhile (SPMCSR & 0b01000000) {}
- アドレスの計算を間違えました (Z ポインターのセグメンテーションは難しい場合があります)。ここではそうではありません。最初の単語 (アドレス 0) でも試しましたが、まだ機能しません。
次のコードをテストに使用し、フラッシュの最初の 2 バイトを読み取ります (書き込み命令は正常に完了しました。その位置のプログラム メモリはゼロではないため、デバッガーでチェックされます)。
lpm r0,Z+
lpm r1,Z+
movw r2, r0
その前に、Z
ポインターをゼロに設定し、それが本当にゼロであることをデバッガーで確認します (r30
およびr31
)。
ただし、フラッシュの内容に関係なく、常にゼロになりますr2
。r3
LPM
読み取りに失敗する別の状況はありますか?