UF2メモ書きとAdafruit_nRF52_Bootloaderのビルド

はじめに

最近触ったUF2関係のメモ書きです。(けっこうてきとう)


UF2とは?

USB Flashing Format(UF2)とはMicrosoftが開発したマイコン書き込み用のファイルフォーマットです。Raspberry Pi Picoなどに採用されており、専用のブートローダーとセットで用いることでUSB経由で簡単にマイコンをフラッシュできます。

UF2書き込みのワークフロー

マイコンの物理ボタンなどでDFUモードに入る
-->USB経由でPCに接続
-->マイコンのフラッシュがドライブとして認識される
-->FWをドライブにコピー又はDnDして書き込み

UF2に対応している主要なマイコン
ハードウェアレベルでの対応
Rp2040

TinyUF2 Bootloaderで対応
ESP32 S2/S3,STM32F3,STM32F4

Adafruit nRF52 Bootloaderで対応
nRF52840,nRF52832(?)

UF2データの作成

UF2のデータフォーマットはUF2データブロック+データで構成されており、`.bin`のファイルに専用のヘッダーなどを追加することで作成することが可能です。
変換の方法はいくつかありますが、一番安心感のある方法は公式のuf2conv.pyを用いる事です。

基本の使用

python3 uf2conv.py filename.bin -c"

実際の使用(nRF52840の場合)

python3 uf2conv.py filename.bin -c -b 0x26000 -f 0xADA52840

`-c` フラッシュを行わないで変換(convert)のみ行います
`-f` familyIDを指定する必要がある場合は指定します
(例 nRF52840:`0xADA52840` nRF52832:`0x621E937A`)
`-b` データのオフセットです。nRF52シリーズのSoftDeviceの様に別途プロトコルスタックがある場合は必要になります
(例 S140 v6:`0x26000` S140 v7:`0x27000`)
※hexからuf2に変換することもできますが、binからhexに変換するときにオフセットした場合は不要です

詳しくは↓
uf2conv -- Packing and unpacking UF2 files

Adafruit_nRF52_Bootloaderのビルド

Adafruit_nRF52_BootloaderはnRF52用に作られたUF2対応ブートローダーで、UF2だけでなくOTAやシリアル経由の書き込みなど、さまざま機能がある汎用的なブートローダーです。
リセットボタンのピン番号やボード情報を変更する場合は再ビルドする必要があります。
せっかくなのでWSL環境でのビルド方法のメモ書きを残します。(てきとうです)

必要なもの
・IntelHexをインストールします。

pip install intelhex

ARM GCCをインストールします。

sudo add-apt-repository ppa:team-gcc-arm-embedded/ppa
sudo apt install gcc-arm-embedded 

※arm-none-eabi-gcc (15:10.3-2021.07-4) 10.3.1 20210621 (release)で動作確認済み

nRF Command Line Toolをインストールします。(gdebiを使います)
nrf-command-line-tools_10.23.0_amd64.debを公式サイトからダウンロードします。

sudo apt install gdebi
sudo gdebi nrf-command-line-tools_10.23.0_amd64.deb

リポジトリをクローンします。(gitをインストールしていない場合はそれも)

sudo apt-get install git
git clone https://github.com/adafruit/Adafruit_nRF52_Bootloader
cd Adafruit_nRF52_Bootloader
git submodule update --init

ファイル構成

└── Adafruit_nRF52_Bootloader/
    ├── src/
    │   └── boards/
    │       └── boardname/
    │           ├── board.h
    │           ├── borad.mk
    │           └── pinconfig.c
    └── _builds/
        └── build-boardname/
            ├── boardname~~~nosd.hex
            ├── boardname~~~s140~~~.hex
            └── update-boardname~~~nosd.uf2

`board.h`を書き換えることでブートローダーの設定を変更します.

ビルド

make BOARD=boardname all

`_build`内にビルド結果が出力されます。出力された`.hex`ファイルをJlinkなどでICに書き込み、指定した方法でDFUモードに入ることでUF2を用いた書き込みが可能です。また、既にuf2のブートローダーが書き込まれている場合は`_build`内の`.uf2`ファイルを用いてブートローダーのアップデートをすることも可能です。

この記事が気に入ったらサポートをしてみませんか?