2017-11-23 11 views
0

私はarm-none-eabi-gcc 5.3を使用してSTM32L4のバイナリを生成しています。私はプログラムをフラッシュするためにブートローダーを使用しています。問題は、ファイル全体が点滅しているかどうかわかりません。私は利用可能なCRCがありません。フラッシュは0x800000000x80040000(ブートローダとメインプログラムの2つのバンク)から開始されます。現在私は、0x80040004が0x800400000x80080000の間にあると仮定して、プログラムはフラッシュされます。しかし、プログラムが有効かどうかをどうやって確認できますか?フラッシュ上に書き込まれるべきバイナリのサイズがどこにあるのか分からないので、最後の整数をチェックすることができます。 BINからプログラム全体がARMでフラッシュされているかどうかを確認する方法は?

ここで最初の数バイト(申し訳ありませんが、ファイル全体を投稿することはできません): enter image description here 最終バイトにプログラムされていない(プログラムが72704バイトを持っている)0x80051C00です。

+0

私はわかりませんファイルコンテンツはすべて役に立ちますが、質問コンテンツへのオフサイトリンクを投稿していないことを確認してください。 – Clifford

+0

最後のいくつかをチェックすることで、間にあるものが正しいことが確認されませんでした。バイナリに何かを追加して、ベリファイやランタイムでローダの最後でこれを行うか、最後にfillを入れてから、チェックサム/ crcをそこに入れる必要があります。ランタイムスタートアップコードは全体のスペースをチェックします。または先のオプションは、それがmcuをプログラムし、次に読み戻しを行い、....またはその両方を行うときに、ホストからの何かを選択します。 –

+0

このアプリケーションノート[AN277](http://www.keil.com/appnotes/files/an277.pdf)では、バイナリイメージにCRCを追加する方法について説明します。 (この例ではKeilツールを使用していますが、他のツールチェーンにも適用できます) – kkrambo

答えて

1

転送中にデータ接続が失われる可能性が最も高いエラーは、画像の一部しか書き込まれないためです。転送プロトコルに何らかのデータ整合性チェックを含める必要があるにしても、データを受け取った後にプログラミングエラーが発生する可能性はごくわずかです。そのためには、単純に16進ファイルレコードのチェックサムを検証するか、XMODEM-CRCやXMODEM-1KなどのCRCエラーチェック付きのプロトコルを使用することができます。

部分的に読み込まれたアプリケーションイメージを開始しないようにすることは簡単です。アドレス順に、またはデータが到着する順番にフラッシュをプログラムする必要はありません。それで、0x80040004のリセットベクトルのデータが受信されると、それをRAMに保持して最後にプログラムします。プログラミングが完了しなかった場合は、リセットベクタ値は常に0xFFFFFFFFのになりますその方法:

擬似コード:スタートアップコードで次に

WHILE receiving data 

    IF program_address in range 
     // Write all data except address at reset vector 
     IF program_address == 0x80040004 
      start_address = program_data 
     ELSE 
      write(program_address, program_data) 
     ENDIF 
    ENDIF 
ENDWHILE 

// Write reset vector *LAST* 
write(0x80040004, start_address) 

IF @0x80040004 == 0xFFFFFFFFFF 
    NO APPLICATION - DO SOMETHING! 
ELSE 
    START APPLICATION 
ENDIF 
+0

これは私が今やっていることです – Razi91

+1

@ Razi91:しかし、それはあなたの質問に書いたことではありません。この解決策については不満足です。それは堅牢です。 – Clifford

関連する問題