EVK-NINA-W10(技適付きESP32モジュールEVK)を使ってデバッガーの起動まで [Platform IO編]
ESP32にデバッガを繋げるのに苦労をしている方がいますが、そもそもデバッガ付きのボードがあるので紹介します。ここでは、Lチカのコードをデバッガー動作させるところまでを紹介します。
【EVK-NINA-W10】
EVK-NINA-W10のデバッガ付きボードとしての特徴は下記のようになります。
・チップセット:ESP32 (512K RAM / 2or4 MB ROM )
・認証:日本の技適付き(204-810001/203-JN1166)
・プログラム環境:Arduino / espidf
・デバッガ機能:FT4232のJTAG機能
・デバグ環境:Platform IO などなど
【Platform IO を使った開発環境構築】
Platform IOが espidf ver4.3 標準対応になったので、Platform IOで開発環境を構築してみます。ほぼ全自動でインストールしてくれるので、昔に比べとっても楽ですね。
1. VScode インストール
Microsoft よりVScode を入手してインストールします。私は、Sysytem Installer を用いました。
2. "日本語環境"と"PlatformIO" の インストール。
”日本語環境”は①を選択し②テキストボックスに japanexe と入力して、選択+インストール。"PlatformIO IDE"は①を選択し②テキストボックスに、platformio と入力し、選択+インストール。
3. Platform(Espressif 32)のインストール
①を選択し、PlatformIOを表示させます。②を選択しPlatform選択を表示させます。③のテキストボックスに Espressif と入力し、⑤検索します。④で"Espressif 32"を選択し、インストールします。
4. "espidf blink"のサンプルをbuild
①[Home] → ②[Project Example] と選択し、遷移後の画面から、"espidf blink"を選択し、import します。かなり時間がかかります。
③[✓]マークでBuildできます。まだ、EVK-NINA-W10用ではありません。Buildできるかどうかの確認です。かなり時間がかかります。41.2秒(@Ryzen 7 5800H)
5. ボードの準備
NINA-W10のJTAG端子に、FTDIのJTAG機能端子が接続されるように4つのジャンパーを図のように接続します。
次にEVK-NINA-W10をPCに接続します。
6. ドライバーの準備
6.1 標準FTDIドライバーのインストール
EVK-NINA-W10をPCに接続すると、自動で標準ドライバーが読み込まれるはずです。標準ドライバーが読み込まれなかったら、ココから、ドライバーをインストールします。
6.2 WinUSBドライバーへの置き換え
Zadigよりツールをダウンロードして、EVB-NINA-W10x(Interface 0)のドライバーを、WinUSB に下記のように置き換えます。
[Options] → [List All Devices] を選択するとドライバーがリストアップされます。
7. minimodule.cfg の修正
minimoduleの設定で、FT4232を認識するように書き換えます。
C:\Users\<USERNAME>\.platformio\packages\tool-openocd-esp32\share\openocd\scripts\interface\ftdi\minimodule.cfg を下記のように書き換えます。
#
# FTDI MiniModule
#
# http://www.ftdichip.com/Support/Documents/DataSheets/Modules/DS_FT2232H_Mini_Module.pdf
#
interface ftdi
ftdi_device_desc "EVB-NINA-W102"
ftdi_vid_pid 0x0403 0x6011
# Every pin set as high impedance except TCK, TDI, TDO and TMS
ftdi_layout_init 0x0008 0x000b
# nSRST defined on pin CN2-13 of the MiniModule (pin ADBUS5 [AD5] on the FT2232H chip)
# This choice is arbitrary. Use other GPIO pin if desired.
ftdi_layout_signal nSRST -data 0x0020 -oe 0x0020
ftdi_device_desc "EVB-NINA-W102"
ftdi_vid_pid 0x0403 0x6011
の部分が変更箇所です。
8. nina_w10.json の書き換え
多分、過渡期だとは思いますが、nina_w10の設定ファイルにデバッガの設定が抜けてます。仮に下記のように修正します。
C:\Users\<USERNAME>\.platformio\platforms\espressif32\boards\nina_w10.json
{
"build": {
"arduino":{
"ldscript": "esp32_out.ld",
"partitions": "minimal.csv"
},
"core": "esp32",
"extra_flags": "-DARDUINO_UBLOX_NINA_W10",
"f_cpu": "240000000L",
"f_flash": "40000000L",
"flash_mode": "dio",
"mcu": "esp32",
"variant": "nina_w10"
},
"connectivity": [
"wifi",
"bluetooth",
"ethernet",
"can"
],
"debug": {
"openocd_board":"esp-wroom-32.cfg"
},
"frameworks": [
"arduino",
"espidf"
],
"name": "u-blox NINA-W10 series",
"upload": {
"flash_size": "2MB",
"maximum_ram_size": 327680,
"maximum_size": 2097152,
"require_upload_port": true,
"speed": 460800
},
"url": "https://www.u-blox.com/en/product/nina-w10-series",
"vendor": "u-blox"
"debug": {
"openocd_board":"esp-wroom-32.cfg"
},
を加えてあります。
9. platformio.iniの書き換え。
"4"でBuildの試行をした環境に、"platformio.ini"があるので、下記のように書き換えます。[env:esp32dev]の環境から[env:nina_w10]の環境になります。
[env:nina_w10]
platform = espressif32
;board = esp32dev
board = nina_w10
framework = espidf
monitor_speed = 115200
build_flags =
-D CONFIG_BLINK_GPIO=21
debug_tool = minimodule
upload_protocol = minimodule
10 書き込み
①[→]を押して書き込み。②が正常終了時のログ。platformio.iniはここ[赤下線部]にあります。
11. デバッガーの起動
①[▶]を押して、②の起動したいコードを選びます。gpio_pad_select_gpio(BLINK_GPIO);のところで実行が停止して、入力待ちになります。③のようにデバッグコンソールにログが流れます。
【その他】
■コードが増えてしまったとき。
対象にしたいコードは①を押すと、なぜか②から選択できます。
■なんか意図しないエラーがでる。
対象コードの変更をしたときなどに、右下に 回転している矢印が出ますが、それが出ている間にアクションしても、準備が整っていないのでエラーになります。
■WiFiの電波を出力するコードを実行するとき【重要】
phy_init.cを書き換える必要があります。技適を守るためです。NINA-W10xのシステムインテグレーションマニュアルを参照してください。
patch ファイル自体はココから入手します。
■WiFiのコードをお試し実行。
WiFi出力をそのまますると、技適に引っかかるので、まずは受信のみのSCANをしてみる。下記からExampleを引っ張ってくる。
example の scan.c を、blink.cと入れ替えれば動作します。シリアルから下記のログが得られます。
rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0030,len:7188
load:0x40078000,len:14308
load:0x40080400,len:3716
entry 0x40080680
I (26) boot: ESP-IDF 4.3.1 2nd stage bootloader
I (26) boot: compile time 16:06:04
I (26) boot: chip revision: 1
I (29) boot_comm: chip revision: 1, min. bootloader chip revision: 0
I (36) boot.esp32: SPI Speed : 40MHz
I (41) boot.esp32: SPI Mode : DIO
I (45) boot.esp32: SPI Flash Size : 2MB
I (50) boot: Enabling RNG early entropy source...
I (55) boot: Partition Table:
I (59) boot: ## Label Usage Type ST Offset Length
I (66) boot: 0 nvs WiFi data 01 02 00009000 00006000
I (73) boot: 1 phy_init RF data 01 01 0000f000 00001000
I (81) boot: 2 factory factory app 00 00 00010000 000f0000
I (88) boot: 3 otadata OTA data 01 00 00100000 00002000
I (96) boot: 4 spiffs Unknown data 01 82 00102000 0000e000
I (103) boot: 5 app OTA app 00 11 00110000 000f0000
I (111) boot: End of partition table
I (115) boot: Defaulting to factory image
I (120) boot_comm: chip revision: 1, min. application chip revision: 0
I (127) esp_image: segment 0: paddr=00010020 vaddr=3f400020 size=14078h ( 82040) map
I (165) esp_image: segment 1: paddr=000240a0 vaddr=3ffb0000 size=041e0h ( 16864) load
I (172) esp_image: segment 2: paddr=00028288 vaddr=40080000 size=07d90h ( 32144) load
I (186) esp_image: segment 3: paddr=00030020 vaddr=400d0020 size=6b15ch (438620) map
I (345) esp_image: segment 4: paddr=0009b184 vaddr=40087d90 size=0cd88h ( 52616) load
I (366) esp_image: segment 5: paddr=000a7f14 vaddr=50000000 size=00010h ( 16) load
I (377) boot: Loaded app from partition at offset 0x10000
I (377) boot: Disabling RNG early entropy source...
I (389) cpu_start: Pro cpu up.
I (389) cpu_start: Starting app cpu, entry point is 0x40081248
I (0) cpu_start: App cpu up.
I (403) cpu_start: Pro cpu start user code
I (403) cpu_start: cpu freq: 160000000
I (403) cpu_start: Application information:
I (408) cpu_start: Project name: espidf-blink
I (413) cpu_start: App version: 1
I (417) cpu_start: Compile time: Nov 24 2021 16:05:31
I (423) cpu_start: ELF file SHA256: 4ebaaa26b406362f...
I (429) cpu_start: ESP-IDF: 4.3.1
I (434) heap_init: Initializing. RAM available for dynamic allocation:
I (442) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM
I (448) heap_init: At 3FFB7F10 len 000280F0 (160 KiB): DRAM
I (454) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM
I (460) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (467) heap_init: At 40094B18 len 0000B4E8 (45 KiB): IRAM
I (474) spi_flash: detected chip: mxic
I (477) spi_flash: flash io: dio
I (483) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
I (583) wifi:wifi driver task: 3ffc1aec, prio:23, stack:6656, core=0
I (583) system_api: Base MAC address is not set
I (583) system_api: read default base MAC address from EFUSE
I (603) wifi:wifi firmware version: 88c8747
I (603) wifi:wifi certification version: v7.0
I (603) wifi:config NVS flash: enabled
I (603) wifi:config nano formating: disabled
I (613) wifi:Init data frame dynamic rx buffer num: 32
I (613) wifi:Init management frame dynamic rx buffer num: 32
I (623) wifi:Init management short buffer num: 32
I (623) wifi:Init dynamic tx buffer num: 32
I (633) wifi:Init static rx buffer size: 1600
I (633) wifi:Init static rx buffer num: 10
I (633) wifi:Init dynamic rx buffer num: 32
I (643) wifi_init: rx ba win: 6
I (643) wifi_init: tcpip mbox: 32
I (653) wifi_init: udp mbox: 6
I (653) wifi_init: tcp mbox: 6
I (653) wifi_init: tcp tx win: 5744
I (663) wifi_init: tcp rx win: 5744
I (663) wifi_init: tcp mss: 1440
I (673) wifi_init: WiFi IRAM OP enabled
I (673) wifi_init: WiFi RX IRAM OP enabled
I (683) phy_init: phy_version 4670,719f9f6,Feb 18 2021,17:07:07
I (793) wifi:mode : sta (3c:71:bf:87:e0:94)
I (793) wifi:enable tsf
I (2893) scan: Total APs scanned = 14
I (2893) scan: SSID elecom-528e0d
I (2893) scan: RSSI -52
I (2893) scan: Authmode WIFI_AUTH_WPA2_PSK
I (2893) scan: Pairwise Cipher WIFI_CIPHER_TYPE_CCMP
I (2903) scan: Group Cipher WIFI_CIPHER_TYPE_CCMP
I (2903) scan: Channel 9
上記ログのようにIDFがVer4.3.1なのでpatchには、Ver4.3のものを使用しました。
patchは下記のように当てました。gitをあらかじめインストールしておけばwindowsでもpatchを使うことができます。フルパスで指定しないといけないのが面倒です。IDFがアップデートされるたびに当てる必要があります。
C:\Users\hiroa\.platformio>>patch -p2 -i c:\L\src\VScode\u-blox-sho-OpenCPU-master\NINA-W1-OTP\patches\ubx_phy_cal_esp_idf_4_3.patch -d C:\Users\hiroa\.platformio\packages\framedowk-espidf\components
patching file esp_wifi/CMakeLists.txt
patching file esp_wifi/src/phy_init.c
C:\Users\hiroa\.platformio>where patch
C:\Program Files\Git\usr\bin\patch.exe
プログラム的には下記のように、main_app.cのあるフォルダに、uxb_phy_cal.cとubx_phy_cal.hを置いておけばOKです。
読み込みが成功していると、NINA-W10xの起動時に、ubx_phy_cal:ログが出力されているので、正しい出力規制がされていることがわかります。
I (682) phy_init: phy_version 4670,719f9f6,Feb 18 2021,17:07:07
W (682) ubx_phy_cal: No RF calibration value is stored in flash, using 0 (no calibration)
W (692) ubx_phy_cal: rf freq calibration enabled, value_otp = 0(ppm), value_set = 0(8kHz)
W (852) phy_init: saving new calibration data because of checksum failure, mode(0)
I (882) wifi:mode : sta (3c:71:bf:87:e0:94)
■NINA-W102/NINA-W101がROM 2MByte , NINA-W106がROM 4Bbyte
アンテナ以外にこんな違いがあるのはややこしい。
■関連文書
□EVK-NINA-W1ユーザーガイド:https://www.u-blox.com/en/docs/UBX-17011007
□NINA-W1 シリーズデータシート:https://www.u-blox.com/en/docs/UBX-17065507
□NINA-W10 システムインテグレーションマニュアル:https://www.u-blox.com/en/docs/UBX-17005730
■購入
Digikeyでの購入:EVK-NINA-W106 4M Flash $99 くらい。EVK-NINA-W102 2M Flash $99くらい。
Mouserでの購入:EVK-NINA-W106 4M Flash $99 くらい。EVK-NINA-W102 2M Flash $99くらい。
u-bloxからの購入:EVK-NINA-W10x 87.51 EUR くらい。送料別。
どこで買ってもあまり値段は変わらないです。
■起動のログからの情報
"ESP-IDF 4.3.0 2nd stage bootloader" になってます。
rst:0x1 (POWERON_RESET),boot:0x37 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0030,len:7164
ho 0 tail 12 room 4
load:0x40078000,len:14292
load:0x40080400,len:3688
entry 0x40080678
I (29) boot: ESP-IDF 4.3.0 2nd stage bootloader
I (29) boot: compile time 21:09:08
I (29) boot: chip revision: 1
I (31) boot_comm: chip revision: 1, min. bootloader chip revision: 0
I (38) boot.esp32: SPI Speed : 40MHz
I (43) boot.esp32: SPI Mode : DIO
I (48) boot.esp32: SPI Flash Size : 2MB
I (52) boot: Enabling RNG early entropy source...
I (58) boot: Partition Table:
I (61) boot: ## Label Usage Type ST Offset Length
I (68) boot: 0 nvs WiFi data 01 02 00009000 00006000
I (76) boot: 1 phy_init RF data 01 01 0000f000 00001000
I (83) boot: 2 factory factory app 00 00 00010000 000f0000
I (91) boot: 3 otadata OTA data 01 00 00100000 00002000
I (98) boot: 4 spiffs Unknown data 01 82 00102000 0000e000
I (106) boot: 5 app OTA app 00 11 00110000 000f0000
I (113) boot: End of partition table
I (118) boot: Defaulting to factory image
I (122) boot_comm: chip revision: 1, min. application chip revision: 0
I (129) esp_image: segment 0: paddr=00010020 vaddr=3f400020 size=06d80h ( 28032) map
I (149) esp_image: segment 1: paddr=00016da8 vaddr=3ffb0000 size=02944h ( 10564) load
I (153) esp_image: segment 2: paddr=000196f4 vaddr=40080000 size=06924h ( 26916) load
I (166) esp_image: segment 3: paddr=00020020 vaddr=400d0020 size=13898h ( 80024) map
I (197) esp_image: segment 4: paddr=000338c0 vaddr=40086924 size=04114h ( 16660) load
I (204) esp_image: segment 5: paddr=000379dc vaddr=50000000 size=00010h ( 16) load
I (211) boot: Loaded app from partition at offset 0x10000
I (211) boot: Disabling RNG early entropy source...
I (225) cpu_start: Pro cpu up.
I (226) cpu_start: Starting app cpu, entry point is 0x400812dc
I (0) cpu_start: App cpu up.
I (240) cpu_start: Pro cpu start user code
I (240) cpu_start: cpu freq: 160000000
I (240) cpu_start: Application information:
I (244) cpu_start: Project name: espidf-blink
I (250) cpu_start: App version: 1
I (254) cpu_start: Compile time: Jul 9 2021 21:08:20
I (260) cpu_start: ELF file SHA256: 52b01bb93d6e3114...
I (266) cpu_start: ESP-IDF: 4.3.0
I (271) heap_init: Initializing. RAM available for dynamic allocation:
I (278) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM
I (284) heap_init: At 3FFB3158 len 0002CEA8 (179 KiB): DRAM
I (291) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM
I (297) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (303) heap_init: At 4008AA38 len 000155C8 (85 KiB): IRAM
I (310) spi_flash: detected chip: mxic
I (314) spi_flash: flash io: dio
I (319) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
■参考 partition map
2Mのバージョンでは下記のようなマップを使ってます。
# Partition Map
nvs ,data ,nvs ,0x9000 ,0x6000 ,
phy_init ,data ,phy ,0xf000 ,0x1000 ,
factory ,app ,factory ,0x10000 ,0x0F0000 ,
otadata ,data ,ota ,0x100000 ,0x2000 ,
spiffs ,data ,spiffs ,0x102000 ,0xE000 ,
app ,app ,ota_1 ,0x110000 ,0x0F0000 ,
■2022年10月25日でも、同じ手順でOKでした。
"ESP-IDF 4.4.2 2nd stage bootloader" になってます。
Restarting now.
ets Jun 8 2016 00:22:57
rst:0xc (SW_CPU_RESET),boot:0x33 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0030,len:6656
load:0x40078000,len:14848
load:0x40080400,len:3792
entry 0x40080694
I (27) boot: ESP-IDF 4.4.2 2nd stage bootloader
I (27) boot: compile time 06:07:12
I (27) boot: chip revision: 1
I (30) boot_comm: chip revision: 1, min. bootloader chip revision: 0
I (37) boot.esp32: SPI Speed : 40MHz
I (41) boot.esp32: SPI Mode : DIO
I (46) boot.esp32: SPI Flash Size : 2MB
I (51) boot: Enabling RNG early entropy source...
I (56) boot: Partition Table:
I (60) boot: ## Label Usage Type ST Offset Length
I (67) boot: 0 nvs WiFi data 01 02 00009000 00006000
I (74) boot: 1 phy_init RF data 01 01 0000f000 00001000
I (82) boot: 2 factory factory app 00 00 00010000 000f0000
I (89) boot: 3 otadata OTA data 01 00 00100000 00002000
I (97) boot: 4 spiffs Unknown data 01 82 00102000 0000e000
I (104) boot: 5 app OTA app 00 11 00110000 000f0000
I (112) boot: End of partition table
I (116) boot: Defaulting to factory image
I (121) boot_comm: chip revision: 1, min. application chip revision: 0
I (128) esp_image: segment 0: paddr=00010020 vaddr=3f400020 size=07874h ( 30836) map
I (148) esp_image: segment 1: paddr=0001789c vaddr=3ffb0000 size=02348h ( 9032) load
I (151) esp_image: segment 2: paddr=00019bec vaddr=40080000 size=0642ch ( 25644) load
I (166) esp_image: segment 3: paddr=00020020 vaddr=400d0020 size=148a4h ( 84132) map
I (197) esp_image: segment 4: paddr=000348cc vaddr=4008642c size=04e24h ( 20004) load
I (205) esp_image: segment 5: paddr=000396f8 vaddr=50000000 size=00010h ( 16) load
I (211) boot: Loaded app from partition at offset 0x10000
I (211) boot: Disabling RNG early entropy source...
I (225) cpu_start: Pro cpu up.
I (226) cpu_start: Starting app cpu, entry point is 0x4008103c
I (213) cpu_start: App cpu up.
I (240) cpu_start: Pro cpu start user code
I (240) cpu_start: cpu freq: 160000000
I (240) cpu_start: Application information:
I (245) cpu_start: Project name: hello-world
I (250) cpu_start: App version: 1
I (254) cpu_start: Compile time: Oct 25 2022 06:06:52
I (260) cpu_start: ELF file SHA256: 8d48af62d9dcce29...
I (266) cpu_start: ESP-IDF: 4.4.2
I (271) heap_init: Initializing. RAM available for dynamic allocation:
I (278) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM
I (284) heap_init: At 3FFB2C28 len 0002D3D8 (180 KiB): DRAM
I (291) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM
I (297) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (303) heap_init: At 4008B250 len 00014DB0 (83 KiB): IRAM
I (311) spi_flash: detected chip: mxic
I (314) spi_flash: flash io: dio
I (319) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
Hello world!
2022年10月25日@HoKoR