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ライセンス以上）

![](https://lh3.googleusercontent.com/8rNk9fkLSMs7TjQ8_QQvzCVH6bJqOwjQdIOrscc_MzGjs4BbYAXxqk-3M4i-NHQLVJYBjO_YZr5ZGAUZbC_MLGOS8Gc75rExmu9mv-y6ChnfDASXy_I2se_mtj0F3ExMx3HDGhR7VPI=w2400)

# 事前準備

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

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

|パッド|信号名|
|:--:|:--:|
|SB6|SWCLK|
|SB10|SWDIO|

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

![](https://lh3.googleusercontent.com/5Bvs2lUvdilgcJQK0_irSpcu9MHrmnJ4iPk0kvLorb98bOcuS-TU2RdCJU8U4NRpbIohhw0IKuDE7lEmxHEC53MUl69874hOh1b_abKRUs2MyvM8WPaWx7jV9pEVUENVBrPk2-Gvi6s=w2400)

![](https://lh3.googleusercontent.com/3qRkvYxq7u-7HQl1zYXopwjeIhdTXZVsKMhHuwFa8DvpQNULYkRV1yYCoTFmbJLPzj9xfeiTDPNWCKP8HzvTwEU1bxBWtUiD7b2WH4blSduhx3x0MlhXuHEXz7-vmVcfnsnI84tbBmk=w2400)


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

http://www2.keil.com/coresight/coresight-connectors#20pin

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

![](https://lh3.googleusercontent.com/8Dub-3V_H06X2iTSUkDX_ib0DnM0rquk4vc8_y_zt-fheLDEVW0itQrCOqzxYXoZyunsbFMsBCnNrj0mhACHQiRkG21Ra_LGWFTVSnP5RkENVSvALZ5QsteZ1bvaAFjQ5BCGDpUmA9I=w2400)

# 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'...] を選択します。
![](https://lh3.googleusercontent.com/bZmWaBsXf-4Z33UYx3VryC_yNaNQ18Oe-cz2lFKx3Ks5PQnTm6ujXIslMs14Ax2x8Nl5l5xP6qMNHYsUobBlD5gu8mBPN3XdZ9FBMNYUEwDBQSJEELDEHg6GoeYPezx7UUYhQ3us9Lk=w2400)
Debugタブから接続するデバッグアダプター（ULINK-ME）を指定します。Settingsボタンを押して、有効なデバイスが接続されているか確認します。
![](https://lh3.googleusercontent.com/axzFiBhcqzr2JT82hC3I18R56I4jG9Nu50TKZgrdso86G6cSHBuDrtun5ze_DXdCXtaDHuOVpFib2x5zSUxWIxw_i1uJXVY-ZlE8i91HGakxiFMT3aXlDh1s-94AHQ3wWefYpjUa8_0=w2400)
Flash Downloadタブを選択し、Addボタンを押します。STM32F10x Flash Options を追加し、OKボタンを押して設定ダイアログを閉じます。
![](https://lh3.googleusercontent.com/jI8lRC4VC0dnGf6OUx_B6bwwtpMHl9oLcRCQ2lCJLMeZqMmqd3_f0P-EuS3fclh7xKbeRzyDi6GoB-Lv725sArrarvAeI_9mADkcTUYJOk3WpJrLEKRypMqCzbKwXqB4ilySvPsSXzo=w2400)
メニュー [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>
```
![](https://lh3.googleusercontent.com/3-C0MnNuPeAsq2pDvQvTaW8zpf4-kyWrhYTqX96GlY9CrKOtGxfWK3pdmkgH3Tk7WdoU5AqBKyrFLbef6JztXDT53SnwpBAOlGS1pstPeVLjdSsdjdPLdYyXADv_aLnyt5A1oeAlNsU=w2400)

以上です。