5

STM32 フラッシュに 2 つのアプリケーションが必要です。1 つは基本的にブートで、もう 1 つは「メイン」アプリケーションです。それぞれをフラッシュのさまざまな領域にロードする方法を見つけました。メモリ ダンプを取得した後、すべてが適切な場所にあるように見えます。

そのため、リセットを行うとブートがロードされ、現時点でブートが行うのはアプリケーションへのジャンプだけです。ブートをデバッグすると、これはすべて正しく機能しているように見えます。ただし、アプリケーションにジャンプした後に問題が発生し、1 つの命令 (アセンブリ) を実行しただけで、ブートに戻ります。アプリケーションに無期限に保持する必要があります。

私の質問は、アプリのどこに「ジャンプ」する必要があるかということです。

割り込みベクトル、リセット ハンドラー、アプリのメイン関数など、いくつかの潜在的なスポットがあるようです。実際、私はそれらすべてを試しましたが、成功しませんでした。

うまくいけば、それが理にかなっています。そうでない場合は、質問を更新します。

ご協力いただきありがとうございます!リチャード

アップデート:

  • 私はデバッガーで遊んで、手動でプログラム カウンターをアプリケーションのメインに変更しましたが、それは魅力的に機能したので、ジャンプに何か問題があると思います。なぜプログラム カウンターが動かないのですか?ジャンプの後?
  • 実際には PSR のようです。「T」はジャンプ時にリセットされます。ジャンプ後に再度設定すると、アプリは希望どおりに続行します
  • わかりました解決策が見つかりました。分岐を行うとき、または「ARM」モードに入るときにPC LSBを1に設定する必要があるようです(「サム」モードのような16ビット命令ではなく32ビット命令。かなりあいまいな小さな問題、あなたと共有させてくれてありがとう!
4

3 に答える 3

6

必ず LSB が 1 のアドレスにジャンプしてください。説明については、次のサイトを参照してください: https://www.embedded.com/introduction-to-arm-thumb/

于 2008-10-20T08:31:25.467 に答える
1

stm32 の RS232 psort からコードをブートロードできる IAP (アプリケーション内プログラマー) を検索することをお勧めします。私は使い始めましたが、ソースコードが提供されているので、目的に合わせて変更するのは非常に簡単です。基本的にリセット後、アドレス 0x08002000 またはアドレス 0x08003000 からブートロードするように IAP をコーディングできます。その後、アプリケーション コードにフラグを設定し、再起動と言うだけで、新しいアプリケーションが実行されます。これがお役に立てば幸いです。

于 2010-03-31T21:58:07.190 に答える
0

リチャード、

私はあなたが成功したのと同じことをしようとしていましたが、問題がありました. IAR IDE を使用していて、アプリケーションを 0x08002000 に配置するために *.icf ファイル (「proj」ディレクトリ内) を更新し、0x08002004 のリセット ベクターのアドレスにジャンプする別のプロジェクトを 0x08000000 にロードしました。ブート コードが起動し、アプリケーションの起動にジャンプしたように見えますが、IAR の初期化中にアプリケーションが失敗し、最終的に ILLEGAL INSTRUCTION トラップが発生しました。

アプリケーション コードを 1 ステップ実行した後、割り込みベクターのベース アドレスをアプリケーションのベース アドレスに設定するのを忘れていることに気付きました。それはまだ 0x08000000 を指していたので、コードは正気ではありませんでした。割り込みを有効にする前にベクトル アドレスを設定する呼び出しを追加することで問題が解決し、アプリケーションをフラッシュでシフトしたい場合に必要です。

イラ。

于 2009-06-23T08:06:53.587 に答える