質問

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

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

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

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

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

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

更新:

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

解決

LSBが1のアドレスにジャンプしてください。説明については、次のサイトを参照してください。 http://www.embedded.com/columns/beginerscorner/15200241?_requestid=162471

他のヒント

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

リチャード、

あなたが成功したのと同じことをしようとしていましたが、問題がありました。 IAR IDEを使用し、*。icfファイル(" proj"ディレクトリ内)を更新して、アプリケーションを0x08002000に配置し、0x08002004のリセットベクターのアドレスにジャンプするだけの別のプロジェクトを0x08000000にロードしました。ブートコードが起動し、アプリケーションの起動にジャンプするようですが、IARの初期化中にアプリケーションが失敗し、不正な命令トラップになります。

アプリケーションコードをシングルステップ実行した後、割り込みベクトルのベースアドレスをアプリケーションのベースアドレスに設定するのを忘れていました。まだ0x08000000を指していたため、コードが異常になりました。割り込みを有効にする前にベクトルアドレスを設定するための呼び出しを追加すると、問題が解決し、フラッシュでアプリケーションをシフトする場合に必要になります。

イラ。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top