LPCマイコンにプログラムを書き込む (DFU-UART編)

JTAGなどの書き込み機を使わずにLPCマイコンにプログラムを書き込んでみるお話です。
ちらっと耳にしたことがあるかもしれませんがDFUに関するお話です。
 

DFUモードとは

では、DFUモードとは一体なんなんでしょうか……
DFUは、Device Fireware Updateの頭文字をとったもので、直訳するとデバイスのファームウェアを更新するといった具合でしょうか。
つまるところ、DFUモードとはデバイスのファームウェアを更新するためのモードということになります。
ファームウェアを書き込むためのファームウェアが起動している状態と捉えることもできますね。
 

DFUモードで書き込んでみる

回路図

URATを使ったDFUで書き込むための回路はこんな感じ↓↓↓

FT232ってのは秋月電子とかで売ってるUSB-シリアル変換ICのことです。
ISP[0:1]はプルアップをして、FT232のTX, RXをそれぞれマイコンのRX, TXに繋ぎます。
基本的に5Vトレラントになってるはずなので気にしなくてもいいかもしれませんが、FT232のロジックは3.3Vで動作させるようにしておきましょう。
 

DFUモードに移行する

DFUモードに遷移するには、起動時に所定のピンの論理をある状態にしていなければなりません。
マイコンの種類やピン数によってそのピンが違うので一概には言えないのですが、ここでは僕がよく使ってるLPC1549JBD48を例にとって解説していこうと思います。
このマイコンにUARTでファームウェアを書き込む際に使用するピンは次の通りです。

ピン名称 物理ピン
ISP_0 PIO0_4
ISP_1 PIO0_16
TX PIO0_15
RX PIO0_14

ISPピンの状態を設定してあげることでDFUモードに入ったり普通に起動したりします。

動作モード ISP_0 ISP_1
NO DFU High High
UART-DFU Low Low

 

ファームウェアを用意する

UARTで書き込むには、*.hexファイルを用意する必要があります。このファイルはLPC Xpresso IDEでコンパイルしたときに生成する方法があるのでこのオプションを使いましょう。
具体的には、プロジェクトのプロパティでC/C++ Build > Settings > Build stepsと進んでいき、Post-build stepsの中身をこんな感じにします↓↓↓

arm-none-eabi-size "${BuildArtifactFileName}"
arm-none-eabi-objcopy -v -O ihex "${BuildArtifactFileName}" "${BuildArtifactFileBaseName}.hex"

 

ファームウェアを書き込む

DFUモードにする方法もわかって、書き込むためのファイルを用意することが出来たので、最後にこのファイルを実際に書き込む方法の説明に移ります。
マイコンにファームウェアを書き込むためには、FlashMagicというソフトウェアを使用します。
FlashMagicで書き込むには使用するCOMポートを指定してやる必要があるので、デバイスマネージャを使用してFT232がどのポートに割り当てられているのか確認しておきましょう。
Macの人はこれをつかってシリアル変換ICがどのCOMに割り当てられているか確認しましょう。
 
FlashMagicの起動画面はこんな感じになっています↓↓↓

設定が必要な個所は, COM PortHex Fileです。
COMは先ほど調べておいたやつに設定し、HexはLPC Xpresso IDEで出力したものを使用します。たぶん/path/to/project/Debug/ProjectName.hexとして出力されていると思うのでそれを指定してください。
OptionのFill unused Flashはどちらでもよいのですが、Flashがおおきいやつでこれを有効にしていると時間がかかるのでここでは無効にしています。
また、チップは適宜使用しているものに置き換えてください。
Startを押したら書き込みが始まり、下のほうにFinishと表示されたら成功です。エラーダイアログが出た場合には接続やCOMの設定を再度見直してみてください。
チップをリセットすると書き込んだプログラムが走り出すはずです。
 

さいごに

今回はUARTを使って書き込む方法を紹介しましたが、mbedのようにbinファイルを放り込むだけで書き込む方法もあるので、つぎはその方法に関して解説していこうと思います。
 

あわせて読みたい

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です