8

コマンドを使用して、STM32F4 Discovery ボードにプログラムをアップロードしたいと考えていst-flashます。問題は、*.hex または *.elf ファイルをアップロードしようとすると、機能しないことです。*.elf または *.hex から *.bin に変換する多くの方法 ( xxd を使用するなど) を試しましたが、アップロードしてもまだ機能しません。はい、他の Windows コンピューターから hex ファイルをアップロードしてみましたが、うまくいきました。

16 進ファイルのサンプル (最初の 3 行、内部がどのように見えるかを示すため):

:020000040800F2
:100000000000022099020008A1020008A5020008D1
:10001000A9020008AD020008B102000800000000BB

私のOSはUbuntu 14.04 LTSです。

手伝ってくれてありがとう!

4

3 に答える 3

13

Linux がインストールされていて、 がインストールされていると想定しているbinutilsので、次のようにします。

objcopy --input-target=ihex --output-target=binary code00.hex code00.bin
于 2016-05-14T12:09:04.023 に答える
2

.hexファイル形式は Web 上で文書化されています。ロードプロセスを制御するためのいくつかの種類のレジスタがあるため、それを理解できるローダープログラムが必要です。一部のレジスタは、エントリ ポイント アドレスを制御します。その他は、固定アドレスにロードされるデータです。

Intel Hex 形式 (このように呼ばれます) については、ウィキペディア (私はそこで見つけました) で情報を取得できます。すべてのデータが 1 つのセグメントのみにあり、エントリ ポイントが指定されていない場合、理論的にはバイナリ データに変換して読み込むことはできますが、それはありえません。

これは、「:」文字で始まる行で構成されるテキスト ファイルであり、次に、このレコードが持つデータのバイト数を表す 2 つのフィールドの 16 進数、次にこのデータがロードされるアドレス、次にファイルの種類が続きます。次のいずれかになります。

  • 00この値は一連のデータ用で、通常は 16 バイト (0x10)
  • 01ファイルの終わり。データがないため、常に :00000001FF としてコード化されます
  • 02拡張セグメント アドレス。16 ビットを超えるアドレスを許可します。
  • 03 Start エントリ ポイント アドレス。初期 CS:IP アドレスを 0x86 アーキテクチャに登録します。
  • 04拡張リニア アドレス。32 ビット アドレスを指定します。これは、00 レジスタの上位 16 ビット アドレス部分を指定します。
  • 05開始エントリ ポイント リニア アドレス。これは、32 ビットの線形エントリ ポイント アドレスです。

次に、n バイト (n は最初のフィールドの値) のデータ (16 進コード) がロードされ、最後にチェックサム バイト (コロンから上にあるすべてのレコード バイトの 2 の補数の合計) が続きます。

于 2014-11-18T12:21:50.857 に答える