8

ファームウェアのアップグレードが必要です。USB DFU クラスを使用する予定です。ただし、私の場合、ファームウェア アップグレードのコマンドは PC アプリケーションから送信されます。そのため、システム メモリにあるブートローダーに切り替える必要があります。最初はアプリケーションを実行しているので、ユーザー フラッシュから起動されます。つまり、Boot0 ピンと Boot 1 ピンがユーザー フラッシュ用に構成されています。DFU ブートローダはシステム フラッシュにあるため、Boot0 および Boot1 ピンの設定を変更する必要があります。ブート 0 とブート 1 の設定がユーザー フラッシュ メモリと同じままで、アプリケーションでシステム メモリにジャンプする方法はありますか?

4

5 に答える 5

6

ブートローダーの状態をシミュレートできます。コンデンサと並列抵抗を BOOT ピンからグランドに接続します。別の空いているピンを BOOT ピンに接続します。コンデンサは外部ピンで充電でき、抵抗で放電できます。計算/実験できる正確な値を覚えていません(RC回路の時定数が重要です)。

外部ピンを 1 に設定してこのコンデンサを充電し、 でソフトウェア リセットを実行しますNVIC_SystemReset。リセット後、ブートローダーを実行します。コンデンサに接続された抵抗器は放電を行います。ファームウェアの更新後、デバイスをリセットすると、アプリケーションが実行されます。

一部のアプリケーションでこれを使用していますが、うまく機能します。このソリューションの欠点は、外部回路が必要なことですが、実装が非常に簡単で、すべての STM32 デバイスに共通です。

于 2015-03-30T17:19:03.603 に答える
4

新しい画像にジャンプすることはそれほど難しくありません。パワーオン セルフ テストの一環として、正常に完了しました。

  1. 2 番目のイメージ (この場合はブートローダー) が存在するフラッシュ内のアドレスを、2 番目のイメージをリンクするときにリンカに渡す必要があります。代わりに位置に依存しないコードを使用することもできますが、それには別の問題があります。
  2. 明らかに、リンカーに指定したのと同じアドレスから始まる 2 番目のイメージをフラッシュ プログラムする必要があります。
  3. ジャンプ機能を設定しますvoid (* const jumpFunction)(void) = (void (*)(void))(APPLICATION_ADDRESS + 4ul + 1ul);。4 のオフセットはスタック ポインターを通過するためのもので、1 のオフセットは Thumbmode 用です。
  4. 新しいスタック開始ポインターを指定します__set_MSP((uint32_t)*APPLICATION_ADDRESS)。2 番目のイメージの最初の 4 バイトには、新しいスタック ポインターが含まれます。
  5. 関数を呼び出してジャンプします。jumpFunction();
  6. 2 番目のプログラムでは、デフォルトの初期化でベクター テーブル オフセット (VTOR) を設定しようとします SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET;。これをに変更する必要がありますSCB->VTOR = APPLICATION_ADDRESS | VECT_TAB_OFFSET;

FLASH_BASEスタックにコア結合 SRAM を使用し、メイン SRAM でメモリ チェックを実行し、メイン プログラムの信頼性をチェックしてから、メイン プログラムにジャンプするPOST プログラムがあります。

何も変わっていないかのようにメイン プログラムをデバッグできます。

注意!私は最近、これを自分で行ったばかりです。確認しなければならないことがいくつかあります。懸念事項の 1 つは、ソフトウェア リセットで何が起こるかです。2 番目のプログラムから呼び出された場合、最初のプログラムではなく、2 番目のプログラムのリセット ルーチンに移動すると思います。

于 2015-02-24T06:49:33.603 に答える