0

プログラムフラッシュ領域に書き込む自己変更プログラムがあります(プログラムが実行されているフラッシュセクターとは別のフラッシュセクターに書き込むため、プログラムフローを中断しません-保護されたブートローダーセクションで実行されます)。

フラッシュへの書き込みという複雑な部分が機能します。デバッガーで確認できます。送信した値はフラッシュに正常に書き込まれています。

しかし、LPM命令で内容を確認しようとすると、常にゼロになっています。

LPM読み取りに失敗する可能性がある場合、次の原因を特定しました。

  1. ロック ビットが設定されている場合、フラッシュの読み取りを禁止します。ロックビットが設定されていないため、ここでは当てはまりません。
  2. フラッシュの読み取りは、前の書き込み命令のためにロックされています。ここではそうではありません。設定RWWSREして緑色のライトが点灯するまで待ちますwhile (SPMCSR & 0b01000000) {}
  3. アドレスの計算を間違えました (Z ポインターのセグメンテーションは難しい場合があります)。ここではそうではありません。最初の単語 (アドレス 0) でも試しましたが、まだ機能しません。

次のコードをテストに使用し、フラッシュの最初の 2 バイトを読み取ります (書き込み命令は正常に完了しました。その位置のプログラム メモリはゼロではないため、デバッガーでチェックされます)。

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

その前に、Zポインターをゼロに設定し、それが本当にゼロであることをデバッガーで確認します (r30およびr31)。

ただし、フラッシュの内容に関係なく、常にゼロになります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 に答える