ST NucleoボードのST-LinkチップにDAPLinkファームウェアを書き込んでみた


STマイクロ製のNucleoボードのST-LinkをDAPLinkファームウェアに書き換えることができたので、作業手順を記載します。

注意

一度ファームウェアをDAPLinkに書き換えてしまうと、以後はST-Linkに戻すことはできません(STマイクロ社から提供されている書き換えツールから認識されなくなるため)。書き換えは十分に注意して行ってください。

今回使用した機材

  • NUCLEO-L476RG
  • ULINK-ME(MDK-ARMが対応しているデバッグアダプタであれば他の物でも可)
  • Keil MDK v5.27.1(MDK-Essentialライセンス以上)

事前準備

NucleoボードのST-Linkデバッガのファームウェアを書き換えるために、STM32F103CB(ST-Linkのチップ)とデバッグアダプタを接続します。

  • ボード上にST-LINKと記載されたショートピン2本を外します。
  • ボード裏面のSB10, SB6のパッドに配線を接続します。
パッド 信号名
SB6 SWCLK
SB10 SWDIO

上記SWCLKとSWDIOをULINK-MEのJTAG-20ピンコネクタに接続します。また、ボード上のCN11またはCN12からGNDを引き出して接続します。

JTAG 20ピンコネクタの信号は以下のようになっていますので、参考にしてください。

これで、ハードウェアの事前準備は完了です。

DAPLinkファームウェアのビルドと書き込み

GitHubのDAPLinkリポジトリから最新のリリースをcloneします。

> git clone -b v0253 https://github.com/ARMmbed/DAPLink
> cd DAPLink
> pip install -r requirements.txt
> progen generate -t uvision

これで、uvision用のプロジェクトが DAPLink\projectfiles\uvision 配下に生成されます。

DAPLink bootloader のビルドと書き込み

以下のプロジェクトファイルをダブルクリックして開きます。

DAPLink\projectfiles\uvision\stm32f103xb_bl

開いたときにエラーが出るので、Migrate to Device Pack を選択します(必要に応じて、Device Packのインストールが始まります)。

プロジェクトが開いたら、Build ボタンを押してビルドを行います。エラーなどは特に出ないはずです。

Build started: Project: stm32f103xb_bl
*** Using Compiler 'V5.06 update 6 (build 750)', folder: 'C:\Keil_v5\ARM\ARMCC\Bin'
Build target 'stm32f103xb_bl'
Before Build - User command #1: ..\..\..\tools\pre_build_script.bat
C:\work\DAPLink\projectfiles\uvision\stm32f103xb_bl>python ..\..\..\tools\pre_build_script.py
#> Pre-build script start
#> Getting git SHA
#> Checking for local changes
#> Keeping git version file since it didn't need to change
#> Pre-build script completed written ..\..\..\source\daplink\version_git.h
compiling stm32f103xb_bl.c...

(中略)

compiling settings.c...
linking...
Program Size: Code=30270 RO-data=3962 RW-data=516 ZI-data=10868  
After Build - User command #1: ..\..\..\tools\post_build_script.bat C:\work\DAPLink\projectfiles\uvision\stm32f103xb_bl\build\stm32f103xb_bl C:\Keil_v5\ARM
C:\work\DAPLink\projectfiles\uvision\stm32f103xb_bl>fromelf --bin C:\work\DAPLink\projectfiles\uvision\stm32f103xb_bl\build\stm32f103xb_bl.axf -o C:\work\DAPLink\projectfiles\uvision\stm32f103xb_bl\build\stm32f103xb_bl.bin
C:\work\DAPLink\projectfiles\uvision\stm32f103xb_bl>fromelf --i32 C:\work\DAPLink\projectfiles\uvision\stm32f103xb_bl\build\stm32f103xb_bl.axf -o C:\work\DAPLink\projectfiles\uvision\stm32f103xb_bl\build\stm32f103xb_bl.hex
C:\work\DAPLink\projectfiles\uvision\stm32f103xb_bl>python ..\..\..\tools\post_compute_crc.py C:\work\DAPLink\projectfiles\uvision\stm32f103xb_bl\build\stm32f103xb_bl.hex C:\work\DAPLink\projectfiles\uvision\stm32f103xb_bl\build\stm32f103xb_bl_crc
Start 0x8000000, Length 0xbc00, CRC32 0x90af67aa
".\build\stm32f103xb_bl.axf" - 0 Error(s), 0 Warning(s).
Build Time Elapsed:  00:00:19

ビルドが完了したので、STM32F103CBのフラッシュメモリに書き込みます。
メニューから [Project] - [Options for target 'stm32f103xb_bl'...] を選択します。

Debugタブから接続するデバッグアダプター(ULINK-ME)を指定します。Settingsボタンを押して、有効なデバイスが接続されているか確認します。

Flash Downloadタブを選択し、Addボタンを押します。STM32F10x Flash Options を追加し、OKボタンを押して設定ダイアログを閉じます。

メニュー [Flash] - [Erase] を押して、フラッシュメモリを全消去します。
そのあとに、メニュー [Flash] - [Download] を押して、ブートローダーを書き込みます。

DAPLink interfaceファームウェアのビルドと書き込み

ブートローダに続いて、DAPLink interfaceファームウェアを書き込みます。
以下のプロジェクトファイルをダブルクリックして開きます(今回は、Nucleo L476RGを使用しましたが、他にも対応しているターゲットがあります)。

DAPLink\projectfiles\uvision\stm32f103xb_stm32l476rg_if

開いたときにエラーが出るので、Migrate to Device Pack を選択します(必要に応じて、Device Packのインストールが始まります)。

プロジェクトが開いたら、Build ボタンを押してビルドを行います。エラーなどは特に出ないはずです。

Build started: Project: stm32f103xb_stm32l476rg_if
*** Using Compiler 'V5.06 update 6 (build 750)', folder: 'C:\Keil_v5\ARM\ARMCC\Bin'
Build target 'stm32f103xb_stm32l476rg_if'
Before Build - User command #1: ..\..\..\tools\pre_build_script.bat
C:\work\DAPLink\projectfiles\uvision\stm32f103xb_stm32l476rg_if>python ..\..\..\tools\pre_build_script.py
#> Pre-build script start
#> Getting git SHA
#> Checking for local changes
#> Keeping git version file since it didn't need to change
#> Pre-build script completed written ..\..\..\source\daplink\version_git.h
compiling stm32l476rg.c...

(中略)

compiling usbd_STM32F103.c...
linking...
Program Size: Code=45682 RO-data=5026 RW-data=748 ZI-data=11464  
After Build - User command #1: ..\..\..\tools\post_build_script.bat C:\work\DAPLink\projectfiles\uvision\stm32f103xb_stm32l476rg_if\build\stm32f103xb_stm32l476rg_if C:\Keil_v5\ARM
C:\work\DAPLink\projectfiles\uvision\stm32f103xb_stm32l476rg_if>fromelf --bin C:\work\DAPLink\projectfiles\uvision\stm32f103xb_stm32l476rg_if\build\stm32f103xb_stm32l476rg_if.axf -o C:\work\DAPLink\projectfiles\uvision\stm32f103xb_stm32l476rg_if\build\stm32f103xb_stm32l476rg_if.bin
C:\work\DAPLink\projectfiles\uvision\stm32f103xb_stm32l476rg_if>fromelf --i32 C:\work\DAPLink\projectfiles\uvision\stm32f103xb_stm32l476rg_if\build\stm32f103xb_stm32l476rg_if.axf -o C:\work\DAPLink\projectfiles\uvision\stm32f103xb_stm32l476rg_if\build\stm32f103xb_stm32l476rg_if.hex
C:\work\DAPLink\projectfiles\uvision\stm32f103xb_stm32l476rg_if>python ..\..\..\tools\post_compute_crc.py C:\work\DAPLink\projectfiles\uvision\stm32f103xb_stm32l476rg_if\build\stm32f103xb_stm32l476rg_if.hex C:\work\DAPLink\projectfiles\uvision\stm32f103xb_stm32l476rg_if\build\stm32f103xb_stm32l476rg_if_crc
Start 0x800c000, Length 0x13c00, CRC32 0x4aa8eb79
".\build\stm32f103xb_stm32l476rg_if.axf" - 0 Error(s), 0 Warning(s).
Build Time Elapsed:  00:00:25

ビルドが完了したので、STM32F103CBのフラッシュメモリに書き込みます。
メニューから [Project] - [Options for target 'stm32f103xb_stm32l476rg_if'...] を選択します。

Debugタブから接続するデバッグアダプター(ULINK-ME)を指定します。Settingsボタンを押して、有効なデバイスが接続されているか確認します。

メニュー [Flash] - [Download] を押して、インタフェースファームウェアを書き込みます(ここでは、Eraseは選択しないでください)。

書き込み後、ULINK-MEをNucleoボードから取り外し、ショートピン2本を元の位置に戻します。NucleoのUSBケーブルを一度ホストPCから取り外し、再度接続するとDAPLinkとして認識されます。

PS C:\work\daplink> mbed detect
[mbed] Auto-installing missing Python modules...

[mbed] Detected NUCLEO_L476RG, port COM17, mounted D:, interface version 0253:
[mbed] Supported toolchains for NUCLEO_L476RG
| Target        | mbed OS 2 | mbed OS 5 |    uARM   |    IAR    |    ARM    |  GCC_ARM  |
|---------------|-----------|-----------|-----------|-----------|-----------|-----------|
| NUCLEO_L476RG | Supported | Supported | Supported | Supported | Supported | Supported |
Supported targets: 1
Supported toolchains: 4
PS C:\work\daplink> mbedls
| platform_name | platform_name_unique | mount_point | serial_port | target_id                                        | daplink_version |
|---------------|----------------------|-------------|-------------|--------------------------------------------------|-----------------|
| NUCLEO_L476RG | NUCLEO_L476RG[0]     | D:          | COM17       | 07650000066fff545253675187134109a5a5a5a597969908 | 0253            |
PS C:\work\daplink>

以上です。