1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

nRF52のDFU試験3: Serial DFU

Last updated at Posted at 2020-09-26

記事の概要

NordicのBLEモジュールnRF52のファームウェアを、UART通信で更新します。

今回はサンプルプログラムを用いてUART通信によるファームウェア更新ができることだけを確認します。
プログラムの解析は次回以降になります。

Serial DFU

nRF52のDFU試験1nRF52のDFU試験2ではアプリnRF Toolboxを用いてBLE通信でファームウェア更新を行いました。
今回はUART通信でファームウェア更新を行います。

Dual-bank

ファームウェア更新はDual-bank方式で行います。

Dual-bankは、内蔵ROMの空きメモリをBank0とBank1に分けます。
現在走らせているアプリケーションはBank0に書き込まれており、更新したいアプリケーションはBank1に書き込みます。

アプリケーション更新時、Bank1のアプリケーションを確認後に、Bank0のアプリケーションを置き換えて更新します。

更新に失敗してもBank0のアプリケーションが引き続き走るので、更新に失敗して動作が完全に停止して、再更新もできなくなるという事態を回避できます。

欠点は使用できるメモリが半分になってしまうことです。

詳細は以下をご参照ください。
Dual-bank and single-bank updates

サンプルプログラムのダウンロード

今回使用するのはNordic DevZoneのbackground-dfu-application-source-codeからダウンロードできるnRF_SDK_15.3.0_background_dfu_3.zipです。

サンプルプログラムのビルド

nRF_SDK_15.3.0_background_dfu_3\examples\ble_peripheral\ble_app_hrs_w_serial_dfuを開いてください。

nRF52480を使用している場合は、\examples\ble_peripheral\ble_app_hrs_w_serial_dfu\pca10056\s140\ses\ble_app_hrs_pca10056_s140.emProjectを開いてビルドしてください。

nRF52832を使用している場合は、\examples\ble_peripheral\ble_app_hrs_w_serial_dfu\pca10040\s132\ses\ble_app_hrs_pca10040_s132.emProjectを開いてビルドしてください。

サンプルプログラムの書き込み

program_bl_sd_bl_settings_52840.batを実行すると必要なソフトデバイス、ブートローダー、上記でビルドしたアプリケーションが全て書き込まれます。

スクリプトの中身は以下のようになっています。

nrfutil settings generate --application pca10056/s140/ses/Output/Debug/Exe/ble_app_hrs_pca10056_s140.hex --family NRF52840 --application-version 1 --bootloader-version 1 --bl-settings-version 2 settings.hex
nrfjprog --program settings.hex --chiperase
nrfjprog --program bootloader_hex/bootloader_w_softdevice_nrf52840.hex 
nrfjprog --program pca10056/s140/ses/Output/Debug/Exe/ble_app_hrs_pca10056_s140.hex -r

nRF52832を使用している場合は、program_bl_sd_bl_settings.batを実行してください。

これでUART通信でファームウェア更新する準備が整いました。

Serial DFUの実行

ここでCOMポートに新しい接続が追加されているので、その番号を調べてください。
私の場合はCOM12でした。

前回と同じようにzipファイルを生成します。

nrfutil pkg generate --application pca10056/s140/ses/Output/Debug/Exe/ble_app_hrs_pca10056_s140.hex --hw-version 52 --sd-req 0xB6 --application-version 2 --key-file key/private.pem dfu_app_package.zip

サンプルファイルには、あらかじめ生成されたdfu_app_package.zipもあるので、それを使用することもできます。

COM12のUART通信でdfu_app_package.zipを書き込むために、anacondaで以下のコマンドを実行します。

serial.png

書き込み成功後は、以下のようにNordic_HRMx1がスキャンできるようになっています。

nordic_hrmx1.png

次にすること

今回のプログラムは、UART通信で取得したデータを、BANK1に書き込み、書き込み完了後にDFUモードに遷移してBANK0を上書きしています。

サーバを介したファームウェア更新は、TFTPやMQTT通信でファームウェアのデータを取得して、BANK1に書き込むように修正すればいいわけです。

今回のサンプルプログラムで、UART通信で取得したデータをBANK1に書き込んでいるのはnrf_dfu_serial.c と nrf_dfu_serial_uart.c です。
これを修正することで、目的のサーバを介したファームウェア更新を行いたいと思います。

最新のSDKへの適用、サンプルプログラムの詳細、DFUモードへの遷移方法など調査しないといけないことは大量にあるので、まだまだ先は長そうです

(追記)
サーバからファームウェア更新するには、nrfutilを使わずにDFU開始しないといけないのですが、それをするには自分でnrfutilを解析しないといけないようです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?