STM32 Nucleoを用いたnRF51向けのArduino開発環境をつくる

目的

AE-TYBLE16こと太陽誘電製EYSGJNAWY-WX(SoCはNordic Semiconductor製nRF51822)をSTM32 Nucleo付属デバッガーST-Link/V2-1を用いてArduinoで開発する環境の下準備(SoftDevice書込み)まで実施したので,それをまとめておく.

  1. 事前にSoftDevice書込み等,Arduino IDEで作成したArduinoスケッチが書込みできる環境の整備(本記事)
  2. GPIOやADC,シリアルインターフェースの機能確認:
    Arduino環境でAE-TYBLE16のピンファンクションを確かめる
  3. BLEの接続/非接続の確認:
    Arduino環境でAE-TYBLE16のBLEを始める(その1:接続/非接続)
  4. BLE経由のLチカ確認:
    Arduino環境でAE-TYBLE16のBLEを始める(その2:BLE経由のLチカ)
  5. 照度センサー明暗判定原理試作:
    Arduino環境でAE-TYBLE16のBLEペリフェラルデバイス~明暗判定編~
  6. リードスイッチドア開閉判定原理試作:
    Arduino環境でAE-TYBLE16のBLEペリフェラルデバイスを作る~ドア開閉判定編~

結論

まず,NUCLEOボードのST-Link部分は切り離す必要が全くないことに注意したい.もちろんジャマな場合は切り離してもよい.

NUCLEOボードのST-Link部分,正確にはST-Link/V2-1を用いてJ-Link化せずにArduino IDE 1.8.19上でSandeep Mistry氏のnRF5 Boardsパッケージ0.7.0のnRF5 Flash SoftDeviceでS130を書き込むことができた.

結線写真 結線レイアウト図

本記事で紹介するおもな環境は下表のとおり:

名称 規格 製造会社 備考
BLEモジュール AE-TYBLE16 秋月電子通商 購入時1,280JPY
太陽誘電製EYSGJNAWY-WX(SoCはNordic Semiconductor製nRF51822)
デバッガー NUCLEO-L053R8STSW-LINK009 2.0.2 STMicroelectronics タダ
201X年にSTの営業が会社に来たときのもの,ST-Link/V2-1として使用する
BLEモジュール用ソケット 2227P-16G-03 寬德 購入時100JPY
ハンダ不要でブレッドボード挿入に使える
ブレッドボード BB-801 万捷电子 ブレッドボードなら何でもよい
ジャンパーケーブル(オス・メス) DG01032-0024-RD-015など 協威亞洲 間違えないように色をわけたほうがよい
C-17228のほうが安い
USBケーブル(mini B) LDUC1011-1.5m EverU Electronics 充電専用でなければ何でもよい
黄緑色LED OSNG5113A,2.0[V],20[mA] OptoSupply 購入時500JPY
半固定ボリューム 3362P-1-103LF,10[kΩ],0.5[W] BOURNS 購入時50JPY
ホストPC マザーボードB450 AORUS M,CPU:Ryzen 7 3700X,メモリー:32[GB] - B450チップセット環境の注意点あり(後述)
IDE Arduino IDE 1.8.19 ARDUINO
nRF5ライブラリー Nordic Semiconductor nRF5 Boardsパッケージ Sandeep Mistry
Nordic SoftDevice S130 2.0.1 Nordic Semiconductor BLEプロトコルスタック
ホストPCのOS Windows 10 Pro 64ビット版 Microsoft 英語版(インターナショナル)

また,nRF5ライブラリーの設定は以下のとおり:

項目名 設定値 備考
ボード Generic nRF51
Chip 32kB RAM, 256kB flash (xxac) データシートよりEYSGJNZWYは32kB
SoftDevice S130
Low Frequency RC Oscillator データシートよりEYSGJNZWYは水晶振動子が未実装で内蔵RC発振回路で代替指示
ポート COMn 環境による
Programmer ST-Link V2-1 (ST-Link On-Board) 新規に作成(後述)

以下は,なくても要求を満たす:

名称 規格 製造会社 備考
J-Link化ツール ST-Link Reflash Utility SEGGER ST-LinkをJ-Link化する
ドライバー差替ツール Zadig 2.7 Pete Batard jlink→WinUSBにする
nRF CUIツール nRF Command Line Tools 10.18.1 Nordic Semiconductor

※結論に到達するまでの一連の流れは,以下の楽しいツイートたち参照.

詳細

ハードウェア

デバッガーにはST-Link/V2-1(STMicroelectronicsのNucleoボードのST-Link/V2)を使用する.SWD(Single Wire Debug)で接続するため,電源ラインを除いてクロックSWCLKとデバッグ信号SWDIOの2本の接続でよい!

一方,AE-TYBLE16は,SoCはNordic SemiconductorのnRF51822で,モジュールとしては太陽誘電のEYSGJNAWY-WXである.このモジュールは類似の品番が多く詳細は不明なところが多い.詳細は購入時添付のProduct Passcodeを使用して,太陽誘電からアクセスできるが,第三者への情報提供、開示、配布、共有、公開はしないで下さい。(原文ママ)と注意書きがあるため,ブログ記事にできないので使用しない.

ST-Link/V2-1とAE-TYBLE16の結線

Nucleoボードのユーザーマニュアルおよび回路図,AE-TYBLE16の回路図から,以下の5本を結線した*1.また,NucleoボードをST-Linkとして使用するため,CN2の2つのジャンパーは取り外す.

Nucleoボード AE-TYBLE16 信号機能 備考
JP1の左側(+3V3_ST_LINK) DIP14(VCC_NRF/AVDD) 3.3[V]電源電圧 赤色
CN4の1(VDD_TARGET) ST-Link/V2-1への電源参照電圧 赤色
CN4の2(SWCLK) DIP3(SWDCLK) SWDクロック 黄色
CN4の3(GND) DIP13(GND) GND 黒色
CN4の4(SWDIO) DIP16(SWDIO) SWDデータI/O 青色
CN4の5(NRST) - リセット 未結線
CN4の6(SWO) - 予約 未結線

結線図

ST-Link/V2-1

単品販売しているST-Link/V2と同等(?)と思われるが,USBのPIDが異なるので,書込み操作時に注意する必要がある(後述).

EYSGJNAWY-WX

DigiKeyやMouserなどの海外サイトと,加賀電子FEIのサイトで,このモジュールに関連する情報が得られる.

確証はないが,太陽誘電アプリケーションソフトウェアが組み込まれたもの(UARTで通信できるもの)の場合,モジュール名にAが付与されると思われる.EYSGJNシリーズ,としてラインナップしているのは間違いないが.それが正しいとすると,このEYSGJNAWY-WXに対応する汎用品は,EYSGJNZWYと考えられる(下表参照).なお,同一の資料から,EYSGJNAWY-WXとEYSGJNZWYの特徴・ブロック図は以下のとおりである.

太陽誘電モジュールリスト

EYSGJNAWY-WX概要 EYSGJNAWY-WXブロック図
EYSGJNZWY概要 EYSGJNZWYブロック図

ソフトウェア

Arduino環境セットアップ(ProgrammerとSoftDeviceを除く)

Sandeep Mistry氏のライブラリーを使用する.追加方法は,ほかのライブラリー追加方法と同じ.

  1. ファイルメニューから環境設定を選択する
  2. 環境設定の追加ボードマネージャのURL:にhttps://sandeepmistry.github.io/arduino-nRF5/package_nRF5_boards_index.jsonを追加する
  3. ボードマネージャメニューを開く
  4. nordicで検索してインストールをクリック

ボード特有の設定項目は,以下のとおり.

項目名 今回の設定値 初期設定値 備考
ボード Generic nRF51 -
Chip 32kB RAM, 256kB flash (xxac) 16kB RAM, 256kB flash (xxaa) データシートよりEYSGJNZWYは32kB
SoftDevice S130 None 上記モジュール概要表よりEYSGJNZWYはS130対応できる*2
Low Frequency RC Oscillator Crystal Oscillator データシートよりEYSGJNZWYは水晶振動子が未実装で内蔵RC発振回路で代替指示
ポート COMn - 環境による
Programmer ST-Link V2-1 (ST-Link On-Board) - 新規に作成

上記,Low Frequencyを含め,データシートTY-BLE EYSGJNZ DataReportから,2点,クロック周波数の設定を変更しなければならない項目がある(詳細はデータシート参照).

クロック周波数について

Nordic Semiconductorの評価ボード(Development Kit,DK)には16MHzの水晶振動子が使われているために,提供されるサンプルコードは16MHzのクロックを使用するように設定されている.これに対して,太陽誘電のモジュールでは32MHzの水晶振動子が搭載されているので,そのままサンプルコードを動作させることができないとのこと.

具体的にはサンプルコードのHFCLKのXTALFREQレジスターが32MHz用の設定になっているので,UICR(User Information Configuration Register)というレジスターがある0x1001008に0xFFFFFF00を書き込む必要があるらしい.また,このUICRはSoftDevice書き込むと消去される(当たり前かもしれないけれど)とのこと.回避策は2つ記載されているが,以下のソースコードを変更する方法を使う.

ソースコードの必要な箇所を修正する.以下のコードをTASK_HFCLKSTARTタスクの前である,system_nRF51.cSystemInit関数に追加することで対応できるとのことである.

if (*(uint32_t *)0x10001008 == 0xFFFFFFFF)
{
    NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Wen << NVMC_CONFIG_WEN_Pos;
    while (NRF_NVMC->READY == NVMC_READY_READY_Busy){}
    *(uint32_t *)0x10001008 = 0xFFFFFF00;
    NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Ren << NVMC_CONFIG_WEN_Pos;
    while (NRF_NVMC->READY == NVMC_READY_READY_Busy){}
    NVIC_SystemReset();
    while (true){}
}

Arduino環境の場合,Ver.0.7.0では以下のファイル

%USERPROFILE%\AppData\Local\Arduino15\packages\sandeepmistry\hardware\nRF5\0.7.0\cores\nRF5\SDK\components\toolchain\system_nrf51.c

が該当し,ファイル内で定義されている__SYSTEM_CLOCK(これが16MHz)の適用がSystemInit関数の最後で行われているため,SystemInit関数の末尾に上記を追加する.一部記載を省略するが,system_nrf51.cは以下となる*3

<<<略>>>
#define __SYSTEM_CLOCK      (16000000UL)     /*!< nRF51 devices use a fixed System Clock Frequency of 16MHz */

#if defined ( __CC_ARM )
    uint32_t SystemCoreClock __attribute__((used)) = __SYSTEM_CLOCK;
#elif defined ( __ICCARM__ )
    __root uint32_t SystemCoreClock = __SYSTEM_CLOCK;
#elif defined   ( __GNUC__ )
    uint32_t SystemCoreClock __attribute__((used)) = __SYSTEM_CLOCK;
#endif

void SystemCoreClockUpdate(void)
{
    SystemCoreClock = __SYSTEM_CLOCK;
}

void SystemInit(void)
{
<<<略>>>
    SystemCoreClockUpdate();
    if (*(uint32_t *)0x10001008 == 0xFFFFFFFF){
        NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Wen << NVMC_CONFIG_WEN_Pos;
        while (NRF_NVMC->READY == NVMC_READY_READY_Busy){
        }
        *(uint32_t *)0x10001008 = 0xFFFFFF00;
        NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Ren << NVMC_CONFIG_WEN_Pos;
        while (NRF_NVMC->READY == NVMC_READY_READY_Busy){
        }
        NVIC_SystemReset();
        while (true){
        }
    }
}

ソースコードから推測すると,__SYSTEM_CLOCK(16000000UL)から(32000000UL)に変更すればよいとも思われるが未確認.

32kHzクロックについて

Arduino環境の設定上,Low Frequencyの項目がこれに該当する.32.768kHzの水晶振動子は未搭載のため,外付けで用意しない場合は内蔵の32.768kHzのRC発振回路(32k RCOSC)を有効にする必要があるとのこと.SDKによって変更箇所が異なる可能性ありという記載もあるが,幸いArduino環境ではメニュー項目にそれがあるため特に考慮不要と判断した.

具体的には以下の設定とのことで,また,RC発振回路動作の場合,水晶振動子使用時と比較しておよそ10[uA]平均電流が増大するとのことだが,AE-TYBLE16としては対応のしようがない.

SOFTDEVICE_HANDLER_INIT(NRF_CLOCK_LFCLKSRC_RC_250_PPM_TEMP_1000MS_CALIBRATION, false);

Arduino環境セットアップ(Programmer)

Programmersのメニューには,J-Link,ST-Link V2,CMSIS DAP,Black Magic Probe (GDB)の4つがある.

しかしながら,NucleoボードのST-Link/V2-1を使用する場合,初期状態ではいずれも使用できない.既存のST-Link V2が使用できない理由は,以下のPIDの違いである.

デバッガー VID PID 備考
ST-Link/V2 0x0483 0x3748 デバッガーとして販売しているST-Link/V2の場合
ST-Link/V2-1 0x0483 0x374B NucleoボードのST-Link/V2-1の場合

ここでは,ProgrammerメニューにST-Link V2-1 (ST-Link On-Board)としてST-Link/V2-1を追加するため,以下stlinkobの6行を%USERPROFILE%\AppData\Local\Arduino15\packages\sandeepmistry\hardware\nRF5\0.7.0\programmers.txtに追記する.stlinkobの部分は,同ファイル内の名称と重複しなければ何でもよい.

stlinkob.name=ST-Link V2-1 (ST-Link On-Board)
stlinkob.communication=USB
stlinkob.protocol=stlink-v2-1
stlinkob.program.protocol=stlink-v2-1
stlinkob.program.tool=openocd
stlinkob.program.setup_command=transport select hla_swd; set WORKAREASIZE 0x4000;

基本的には元々記載されていたST-Link V2(stlinkとして定義あり)をコピーし,stlinkob.protocolstlinkob.program.protocolstlink-v2-1に変更しただけである.この変更を行うことで,%USERPROFILE%\AppData\Local\Arduino15\packages\sandeepmistry\tools\openocd\0.10.0-dev.nrf5\scripts\interface\stlink-v2-1.cfgが参照されるようになる.

ProgrammerメニューへのST-Link V2-1(ST-Link On-Board)追加

Arduino環境セットアップ(SoftDevice)

SoftDeviceは,Nordic Semiconductorが提供するnRF5シリーズ向けBluetooth無線プロトコルスタックの名称で,コンパイル済のバイナリーで提供されるものを指す.ユーザーはApplicationの階層のソフトウェアを作成すればよい.

SoftDeviceの階層

AE-TYBLE16には,初期状態では太陽誘電アプリケーションソフトウェアが書き込まれているため,下表のSoftDeviceからいずれかを選び,初回だけ書き込む必要がある.使えるSoftDeviceは,SoCがnRF51822なので,下表のとおりS110,S120,S130である.ただし,今回のArduinoライブラリーではメニューにS110とS130の2つしかないため,いずれかとなる.

SoftDeviceと対応するRole,SoC

なお,2023/01/01時点でのダウンロードできる3つのSoftDeviceのバージョンと,ROM/RAM使用量は以下のとおり(リリースノート参照).

SoftDevice名 ROM
使用量
RAM
使用量
備考
S110(8.0.0) 96kB 8kB
S120(2.1.0) 116kB 10kB
S130(2.0.1) 108kB 4.95kB

今回はS130を選ぶこととし,コンパイル済のバイナリーを該当のディレクトリーに配置する.以下,S130の場合だが,S110の場合も以下の手順は同等である.

  1. S130のSoftDeviceをNordic Semiconductorのサイトからダウンロードする(2023/01/01時点ではs130nrf51201.zip
    https://www.nordicsemi.com/Products/Development-software/S130/Download#infotabs
  2. ダウンロードしたzipファイルからhexファイルを探す(s130nrf51201.zipの場合はs130_nrf51_2.0.1_softdevice.hex
    hexファイル(コンパイル済のバイナリー)
  3. hexファイルをArduinoが参照するディレクトリー以下に配置する
    %USERPROFILE%\AppData\Local\Arduino15\packages\sandeepmistry\hardware\nRF5\0.7.0\cores\nRF5\SDK\components\softdevice\s130\hex
  4. nRF Flash SoftDeviceを押下して,SoftDevice書込みを実施する
    nRF Flash SoftDeviceの実施
C:\Users\so2akt\AppData\Local\Arduino15\packages\sandeepmistry\tools\openocd\0.10.0-dev.nrf5/bin/openocd.exe -d2 -f interface/stlink-v2-1.cfg -c transport select hla_swd; set WORKAREASIZE 0x4000; -f target/nrf51.cfg -c init; halt; nrf51 mass_erase; program {{C:\Users\so2akt\AppData\Local\Arduino15\packages\sandeepmistry\hardware\nRF5\0.7.0/cores/nRF5/SDK/components/softdevice/s130/hex/s130_nrf51_2.0.1_softdevice.hex}} verify reset; shutdown; 
Open On-Chip Debugger 0.10.0-dev-00254-g696fc0a (2016-04-10-10:13)
Licensed under GNU GPL v2
For bug reports, read
    http://openocd.org/doc/doxygen/bugs.html
debug_level: 2
0x4000
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
adapter speed: 1000 kHz
Info : Unable to match requested speed 1000 kHz, using 950 kHz
Info : Unable to match requested speed 1000 kHz, using 950 kHz
Info : clock speed 950 kHz
Error: libusb_open() failed with LIBUSB_ERROR_NOT_SUPPORTED
Info : STLINK v2 JTAG v37 API v2 SWIM v26 VID 0x0483 PID 0x374B
Info : using stlink api v2
Info : Target voltage: 3.268829
Info : nrf51.cpu: hardware has 4 breakpoints, 2 watchpoints
nrf51.cpu: target state: halted
target halted due to debug-request, current mode: Thread 
xPSR: 0x61000000 pc: 0x0001a92e msp: 0x20001178
Info : nRF51822-CFAC(build code: A0) 256kB Flash
nrf51.cpu: target state: halted
target halted due to debug-request, current mode: Thread 
xPSR: 0xc1000000 pc: 0xfffffffe msp: 0xfffffffc
** Programming Started **
auto erase enabled
Info : Padding image section 0 with 2112 bytes
Warn : using fast async flash loader. This is currently supported
Warn : only with ST-Link and CMSIS-DAP. If you have issues, add
Warn : "set WORKAREASIZE 0" before sourcing nrf51.cfg to disable it
nrf51.cpu: target state: halted
target halted due to breakpoint, current mode: Thread 
xPSR: 0x61000000 pc: 0x2000001e msp: 0xfffffffc
wrote 110592 bytes from file C:\Users\so2akt\AppData\Local\Arduino15\packages\sandeepmistry\hardware\nRF5\0.7.0/cores/nRF5/SDK/components/softdevice/s130/hex/s130_nrf51_2.0.1_softdevice.hex in 5.414282s (19.947 KiB/s)
** Programming Finished **
** Verify Started **
nrf51.cpu: target state: halted
target halted due to breakpoint, current mode: Thread 
xPSR: 0x61000000 pc: 0x2000002e msp: 0xfffffffc
nrf51.cpu: target state: halted
target halted due to breakpoint, current mode: Thread 
xPSR: 0x61000000 pc: 0x2000002e msp: 0xfffffffc
verified 108448 bytes in 0.698503s (151.619 KiB/s)
** Verified OK **
** Resetting Target **
shutdown command invoked

その他

J-Link化した場合の使い方

J-Link化したST-Link/V2-1でもSoftDeviceの書込みはできる.

J-Link化の実行

公式の実施手順

  1. ST-Link/V2-1ドライバーのインストール
  2. J-Link software packageのインストール
    J-Link Software Packageのダウンロード先
  3. ST-Link Reflash Utilityのインストール
    ST-Link Reflash Utilityのダウンロード先

インストールしたST-Link Reflash Utilityを使用して,以下の手順を実施するとJ-Link化したST-Linkとなる(aa20の順でキーボード入力する).なお,ST-Link/V2-1に戻す場合は再度ST-Link Reflash Utilityを使用して,aa30とキーボード入力する.

(c) 2016 SEGGER Microcontroller GmbH & Co. KG    www.segger.com
STLinkReflash compiled Aug 12 2019 10:30:05

The following terms come from SEGGER Microcontroller GmbH & Co. KG ("SEGGER")
You must agree to them in order to proceed.

=============================================================================
* IMPORTANT *
This utility enables You to replace the firmware of an existing ST-LINK
on-board with firmware from SEGGER that makes the ST-LINK on-board
behave J-Link compatible. You do this replacement at Your own risk.
Though extremely unlikely, You are aware that the replacement process may
result in an unusable ST-LINK on-board. The utility and firmware from SEGGER
are provided on an as-is basis and come without any warranty
and without support.
You further agree to only use the firmware provided by SEGGER via this utility,
within the bounds of the license stated on the download page:
https://www.segger.com/jlink-st-link.html
Except as expressly set forth in this agreement,
the Agreement remains unchanged and continues in full force and effect.

=============================================================================

I hereby accept the terms provided by SEGGER.
(A)ccept / (D)ecline
Selection>a
At the request of STMICROELECTRONICS ("ST"), the below
"Amendment to Evaluation Board License Agreement" has been added
to this utility. You must agree to this amendment in order to proceed.

=============================================================================
* IMPORTANT *
When You purchased Your STMICROELECTRONICS ("ST") Evaluation Board, You entered
into an Evaluation Board License Agreement ("Agreement") with ST.
You may install the SEGGER J-Link software ("J-Link") onto Your ST
Evaluation Board only if You  agree to this amendment ("Amendment")
of the Agreement.
STMICROELECTRONICS ("ST") hereby authorizes You to install
SEGGER J-Link software ("J-Link") onto Your ST Evaluation Board,
as an exception to the terms and conditions of the Agreement.
You acknowledge and agree that J-Link is provided solely by SEGGER,
and not by ST. You acknowledge and agree that ST does not endorse, recommend,
nor provide any assurance or warranty, whether express
or implied, in relation to J-Link or its use with Your ST Evaluation Board.
You acknowledge and agree that ST shall not be liable for any direct, indirect,
special, incidental or consequential damages resulting from Your use of J-Link,
even if advised of the possibility thereof.
This Amendment shall be governed, construed and enforced in accordance with the
laws of Switzerland.
Except as expressly set forth in this Amendment, the Agreement remains unchanged
and continues in full force and effect.

=============================================================================

I hereby accept the amendment to the Evaluation Board License Agreement
provided by STMICROELECTRONICS ("ST")(A)ccept / (D)ecline
Selection>a
[0] Quit
[1] Upgrade to J-Link
[2] Update J-Link firmware
[3] Restore ST-Link
Selection>1

Preparing for FW update (can take up to 10 seconds)...O.K.
Identifying ST-LINK variant...O.K.: ST-LINK/V2-1
Performing firmware update...O.K.

[0] Quit
[1] Upgrade to J-Link
[2] Update J-Link firmware
[3] Restore ST-Link
Selection>0

バイスマネージャーでの確認(J-Link)

USBドライバー差替

Zadigというツールを使用して,J-Link化したST-Link/V2-1のドライバーをjlinkからWinUSBに差し替える.

  1. Zadigを起動して,List All Devicesをクリックしてチェックを入れる
    List All Devicesの選択
  2. リストからjlinkで表示されるものを選択して,Replace Driverを実施する(私の環境ではBULK interface (Interface 2)がDriverjlink (v2.70.8.0)と表示された)
    jlinkが表示されるドライバーの選択

ドライバーのインストールが終了すると,デバイスマネージャーでの見え方が以下のように変化する.

バイスマネージャーでの確認(BULK interface)

なお,もとのJ-Linkドライバーに戻すには,BULK interfaceのドライバーを削除するだけでよい.この操作は,ST-Link/V2-1に戻すときに必要となることに注意

BULK interfaceのドライバー削除

Arduino IDEからのSoftDevice書込み

大まかにはST-Link/V2-1での書込み時と同一で以下の設定とし,SoftDeviceを書き込む.体感で,ST-Link/V2-1のときよりも1.5倍程度時間がかかる.

項目名 今回の設定値 初期設定値 備考
ボード Generic nRF51 -
Chip 32kB RAM, 256kB flash (xxac) 16kB RAM, 256kB flash (xxaa) データシートよりEYSGJNZWYは32kB
SoftDevice S130 None 上記モジュール概要表よりEYSGJNZWYはS130対応できる*4
Low Frequency RC Oscillator Crystal Oscillator データシートよりEYSGJNZWYは水晶振動子が未実装で内蔵RC発振回路で代替指示
ポート COMm - ST-Link/V2-1のときとCOMポート番号が異なる
Programmer J-Link -
C:\Users\so2akt\AppData\Local\Arduino15\packages\sandeepmistry\tools\openocd\0.10.0-dev.nrf5/bin/openocd.exe -d2 -f interface/jlink.cfg -c transport select swd; set WORKAREASIZE 0; -f target/nrf51.cfg -c init; halt; nrf51 mass_erase; program {{C:\Users\so2akt\AppData\Local\Arduino15\packages\sandeepmistry\hardware\nRF5\0.7.0/cores/nRF5/SDK/components/softdevice/s130/hex/s130_nrf51_2.0.1_softdevice.hex}} verify reset; shutdown; 
Open On-Chip Debugger 0.10.0-dev-00254-g696fc0a (2016-04-10-10:13)
Licensed under GNU GPL v2
For bug reports, read
    http://openocd.org/doc/doxygen/bugs.html
debug_level: 2
0
cortex_m reset_config sysresetreq
adapter speed: 1000 kHz
Info : No device selected, using first device.
Info : J-Link STLink V21 compiled Aug 12 2019 10:29:20
Info : Hardware version: 1.00
Info : VTarget = 3.300 V
Info : clock speed 1000 kHz
Info : SWD IDCODE 0x0bb11477
Info : nrf51.cpu: hardware has 4 breakpoints, 2 watchpoints
nrf51.cpu: target state: halted
target halted due to debug-request, current mode: Thread 
xPSR: 0x61000000 pc: 0x0001a92e msp: 0x20001178
Info : nRF51822-CFAC(build code: A0) 256kB Flash
nrf51.cpu: target state: halted
target halted due to debug-request, current mode: Thread 
xPSR: 0xc1000000 pc: 0xfffffffe msp: 0xfffffffc
** Programming Started **
auto erase enabled
Info : Padding image section 0 with 2112 bytes
Warn : not enough working area available(requested 32)
Warn : no working area available, falling back to slow memory writes
wrote 110592 bytes from file C:\Users\so2akt\AppData\Local\Arduino15\packages\sandeepmistry\hardware\nRF5\0.7.0/cores/nRF5/SDK/components/softdevice/s130/hex/s130_nrf51_2.0.1_softdevice.hex in 26.675529s (4.049 KiB/s)
** Programming Finished **
** Verify Started **
Warn : not enough working area available(requested 52)
Warn : not enough working area available(requested 52)
verified 108448 bytes in 2.154908s (49.147 KiB/s)
** Verified OK **
** Resetting Target **
shutdown command invoked

なお,Zadigでドライバーを差し替えていない場合は,以下のようなメッセージが出て必ず書込みができない.

C:\Users\so2akt\AppData\Local\Arduino15\packages\sandeepmistry\tools\openocd\0.10.0-dev.nrf5/bin/openocd.exe -d2 -f interface/jlink.cfg -c transport select swd; set WORKAREASIZE 0; -f target/nrf51.cfg -c init; halt; nrf51 mass_erase; program {{C:\Users\so2akt\AppData\Local\Arduino15\packages\sandeepmistry\hardware\nRF5\0.7.0/cores/nRF5/SDK/components/softdevice/s130/hex/s130_nrf51_2.0.1_softdevice.hex}} verify reset; shutdown; 
Error while flashing SoftDevice.
Open On-Chip Debugger 0.10.0-dev-00254-g696fc0a (2016-04-10-10:13)
Licensed under GNU GPL v2
For bug reports, read
    http://openocd.org/doc/doxygen/bugs.html
debug_level: 2
0
cortex_m reset_config sysresetreq
adapter speed: 1000 kHz
jaylink: Failed to open device: LIBUSB_ERROR_NOT_FOUND.
Info : No device selected, using first device.
Error: No J-Link device found.

UICRレジスターへの書き込み動作

32MHzの水晶振動子を使用する指示は,nRF CUIツールことnRF Command Line Tools 10.18.1を使って,以下のコマンドライン

nrfjprog --snr <your_jlink_debugger_serial_number> --memwr 0x10001008 --val 0xFFFFFF00

を実行することで,直接SoCのアドレスを指定して値を書き込むことができるという方法もデータシートに記載されている.しかしながら,こちらは正規のJ-Linkが必要で,J-Link化したST-Link/V2-1(ST-Link/V2は未確認)ではシリアル番号(上記<your_jlink_debugger_serial_number>の部分)は確認できるが,以下のエラーメッセージが出て書き込みすることができない.

J-Link化したST-Linkは使用できないというエラーメッセージ

C:\Users\so2akt>nrfjprog -i
779715930

C:\Users\so2akt>nrfjprog --snr 779715930 --memwr 0x10001008 --val 0xFFFFFF00
[error] [SeggerBackend] - JLinkARM.dll reported "-1", "An unknown error.".
[error] [SeggerBackend] - JLinkARM.dll reported "-1", "An unknown error.".
[error] [SeggerBackend] - JLinkARM.dll reported "-1", "An unknown error.".
[error] [SeggerBackend] - JLinkARM.dll reported "-1", "An unknown error.".
[error] [SeggerBackend] - JLinkARM.dll reported "-1", "An unknown error.".
[error] [SeggerBackend] - JLinkARM.dll reported "-1", "An unknown error.".
[error] [SeggerBackend] - JLinkARM.dll reported "-1", "An unknown error.".
[error] [SeggerBackend] - JLinkARM.dll reported "-1", "An unknown error.".
[error] [SeggerBackend] - JLinkARM.dll reported "-1", "An unknown error.".
Failed to read device memories.
[error] [SeggerBackend] - JLinkARM.dll reported "-1", "An unknown error.".
[error] [  nRF51] - Failed when checking readback protect status.
ERROR: Cannot connect to any nRF device. Please make sure a device is
ERROR: connected to the debugger and supplied.
NOTE: For additional output, try running again with logging enabled (--log).
NOTE: Any generated log error messages will be displayed.

上記の使用手順では,ProgrammerのメニューにST-Link V2-1 (ST-Link On-Board)としてST-Link/V2-1を追加したが,既存のメニューST-Link V2でST-Link/V2-1を使うようにすることもできる.ただし,この変更を行うと,このNordic Semiconductor nRF5 Boardsパッケージ内でST-Link/V2は使えなくなることに注意.

$USERPROFILE%\AppData\Local\Arduino15\packages\sandeepmistry\tools\openocd\0.10.0-dev.nrf5\scripts\interface\stlink-v2.cfgの8行目を

hla_vid_pid 0x0483 0x3748

から

hla_vid_pid 0x0483 0x374b

に変更する.

Arduino IDE 2.xではSoftDevice書込みができない

2023/01/02現在では,Arduino 1.8.xはLegacy IDEとされている.しかしながら,Arduino IDE 2.xでは,SoftDeviceを書き込むためのメニューnRF Flash SoftDeviceが表示されないため,SoftDevice書込みにはArduino 1.8.xを使用する必要がある.SoftDeviceの書込みができないだけであるため,Arduinoスケッチ作成以降のアプリケーションソフトウェアの作成は,Arduino 2.xでもできる.

Arduino 2.0.3ではSoftDevice書込み不能

連結ソケットとブレッドボード

AE-TYBLE16には,付属の商品添付カードによると,型番2227P-16G-03の連結ソケットではなく,表面実装用の2227MC-16-03-150-F6が推奨されている.しかしながら,前者の2227P-16G-03であれば,前述の結論に掲載した写真のとおり,AE-TYBLE16をハンダ付けせずに使用可能である.

この場合,ひとつ注意点として,先に連結ソケットをブレッドボードに挿してからAE-TYBLE16を連結ソケットに配置することである.順番を逆にすると,連結ソケットの足が開いてしまい,ブレッドーボードに挿さらない.

有効なUSBポート

"AMDチップセット環境であることがのちに効いてくる"としていた内容がこちら.これで累計3時間程度をムダにした.(おそらくB450チップセットの)AMDユーザーは注意が必要.

B450チップセットにおいてUSBホストコントローラーインターフェースには以下の2つがあり,AMD USB3.1 eXtensible Host ControllerのほうにST-Link/V2-1またはJ-Link化したものを接続すると必ず書込みに失敗する

OK/NG USBホストコントローラーインターフェース 備考
OK USB xHCI Compliant Host Controller マザーボード上に4ポートしか存在しない
NG AMD USB3.1 eXtensible Host Controller マザーボード上に10ポート存在するが今回の用途では全く使えず,迷惑

なお,接続したUSB機器がどのUSBホストコントローラーインターフェースの配下にいるか判断するには,USBView(2022/12/19現在)を使用するとよい(USBView の入手先の手順に従ってインストールできる).

※自分自身,以前もハマっている……
OrionSoft PS1 Memory Card ManagerでPS1メモリーカードを正常に読み書きする - so2akt’s technical diary

改訂履歴

# 日付 内容
1 2022/12/29 ハードウェア(ST-Link/V2-1とAE-TYBLE16の結線)を記載
章 データシート等を作成し,参照したデータシートを掲載
章 連結ソケットとブレッドボードを作成し,ブレッドボードでの開発について記載
2 2023/01/01 章 ハードウェア,ソフトウェアを記載
章 データシート等に,太陽誘電およびNordic Semiconductorのデータシートを追記
章 J-Link化した場合の使い方を記載
3 2023/01/02 章 Programmerメニュー追加ではなくST-Link V2の設定を編集して使うを追記
Arduino IDE 2.xではSoftDevice書込みができないを追記
4 2023/01/03 章 結論の使用機材について一部修正
章 目的に関連記事を追記
5 2023/03/21 誤記修正:$USERPROFILE%%USERPROFILE%

データシート等

  1. STMicroelectronics:UM1724 STM32 Nucleo-64 boards (MB1136),第14版,2020/08/20発行)
  2. STMicroelectronics:MB1136-DEFAULT-C03 Board schematic,第C-03版,2018/11/05発行)
  3. 秋月電子通商AE-TYBLE16商品添付カード,2017/10/23発行
  4. 太陽誘電TY-BLE EYSGJNAWY-WX BriefDataReport,第1.2版,2017/06/30発行
  5. 太陽誘電Wireless Module Bluetooth low energy Module Overview,第1.8版,2018/05/30発行
  6. 太陽誘電TY-BLE EYSGJNZ DataReport,第2.0版,2019/02/27発行
  7. Nordic Semiconductor:nRF51822 Product Specification,第3.4版,2021/04/02発行
  8. Nordic Semiconductor:Getting started with nRF5 SDK and SES (nRF51 & nRF52 Series),第1.5版,2022/10/26発行
  9. Nordic Semiconductor:S130 - nordicsemi.com
  10. Nordic Semiconductor:S110 - nordicsemi.com
  11. Nordic Semiconductor:S120 - nordicsemi.com

参考サイト

  1. EYSGCNZWY(nRF51822)をArduinoIDE+Nucleoで開発する ~Serial通信をBluetoothで無線化~ - Qiita
  2. stm32 - STM32F0, ST-link v2, OpenOCD 0.9.0: open failed - Stack Overflow
  3. AE-TYBLE16をArduinoとしてBLE通信 - Qiita
  4. AE-TYBLE16をArduinoとしてLチカ - Qiita
  5. 秋月電子の BLE モジュール AE-TYBLE16 を Hack - Qiita
  6. Programming Bluetooth LE with nRF51822 (Arduino IDE + BLE400)
  7. Development RedBearLab BLE mini with Nucleo F401RE - Nordic Q&A - Nordic DevZone - Nordic DevZone
  8. Debugging the STM32 Blue Pill board with Visual Studio – VisualGDB Tutorials
  9. ST LinkV2(互換品)を使ってOpenOCDと評価ボード(STM32F103C8T6)を接続してみる - chakokuのブログ(rev4)
  10. NucleoのST-LinkをJ-Link化してみる - マイコン工作実験日記
  11. ST-LINK On-Board
  12. [ARDUINO]自分のISPを作ろう。 - Qiita
  13. 加賀FEI:無線モジュールBluetooth EYSGJNZWY

リンク先はすべて2023/01/03現在のもの

*1:CN4の1番ピンは接続しなくても動作するが,機能上ボードのVDD電源電圧なので念のため接続している.

*2:AE-TYBLE16にはS120が書き込まれていると思われる.

*3:追加部分は,適用先のスタイルに書式を合わせた

*4:AE-TYBLE16にはS120が書き込まれていると思われる.