STM32でNUTTXを使ってみる

STM32F4 DiscoveryへのFirmware書き込み


Nuttxのファームウェアは、kconfig frontendを使って機能を追加していきます。
STM32F4 Discovery用には以下のディレクトリに色々なひな形があらかじめ用意さ れています。
$ ls ~/nuttxspace/nuttx/boards/arm/stm32/stm32f4discovery/configs
adb         elf          max31855      nsh             rgbled      usbnsh
audio       ether_w5500  max7219       nxlines         rndis       wifi
brickmatch  ipv6         mmcsdspi      nxscope_cdcacm  sporadic    xen1210
canard      kostest      modbus_slave  pm              st7789
composite   lcd1602      module        posix_spawn     testlibcxx
cxxtest     lwl          netnsh        pseudoterm      usbmsc

今回は最も簡単にファームの動作確認ができるusbnshのひな形を使います。
ターゲットマイコンや設定を変更する場合は、distcleanで既存の環境定義を削除しておく必要が有ります。
$ cd $HOME/nuttxspace/nuttx

$ make distclean

$ ./tools/configure.sh -l stm32f4discovery:usbnsh
  Copy files
  Refreshing...

$ ls -l .config
-rw-rw-r-- 1 nop nop 62230  1月  4 13:57 .config

引数で開発環境を指定することができます。
指定できる開発環境には以下が用意されています。
  -l selects the Linux (l) host environment.
  -m selects the macOS (m) host environment.
  -c selects the Windows host and Cygwin (c) environment.
  -g selects the Windows host and MinGW/MSYS environment.
  -n selects the Windows host and Windows native (n) environment.
  -B selects the *BSD (B) host environment.

カレントディレクトリに[.config]ファイルができます。これがNuttxの機能を定義しているファイルです。
menuconfig(=kconfig frontend)で[.config]ファイルに色々と機能を追加していきます
$ make menuconfig

古いバージョンでは、TeraTermでリモートログインしていると、表示が崩れましたが、V10ぐらいからこの問題は解決しています。


今回は、特に何も変更せずにそのままExitで抜けます。
デフォルトの[.config]を使ってファームウェアをビルドします。
$ make
Create version.h
LN: platform/board to /home/nop/nuttxspace/apps/platform/dummy
Register: hello
Register: nsh
Register: sh

$ ls -l nuttx*
-rwxrwxr-x 1 nop nop 270896  1月  4 13:59 nuttx
-rwxrwxr-x 1 nop nop  74348  1月  4 13:59 nuttx.bin
-rw-rw-r-- 1 nop nop 209188  1月  4 13:59 nuttx.hex
-rw-rw-r-- 1 nop nop     47  1月  4 13:59 nuttx.manifest
-rw-rw-r-- 1 nop nop 786347  1月  4 13:59 nuttx.map

[nuttx.bin]がNuttxのファームウェアで、これをマイコンに書き込みます。
ST-LINKを使って[nuttx.bin]をターゲットマイコンに書き込みます。
ここでホストマシンとF4 DiscoveryをUSBで接続します。
F4 Discoveryにはオンボード上に2つのUSBコネクターがありますが、ST-Link側のUSBポート(ミニUSB)を使います。
dmesgとlsusbで接続状況を確認することができます。
$ sudo dmesg
 1542.163033] usb 2-1.1: new full-speed USB device number 10 using ehci-pci
[ 1542.274244] usb 2-1.1: New USB device found, idVendor=0483, idProduct=3748, bcdDevice= 1.00
[ 1542.274264] usb 2-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 1542.274270] usb 2-1.1: Product: STM32 STLink
[ 1542.274275] usb 2-1.1: Manufacturer: STMicroelectronics
[ 1542.274279] usb 2-1.1: SerialNumber: Wyk\x06IgHV7\x06        \xc2\x87
[ 1542.453522] usb 2-1.1: USB disconnect, device number 10
[ 1553.186516] usb 2-1.1: new full-speed USB device number 11 using ehci-pci
[ 1553.297703] usb 2-1.1: New USB device found, idVendor=0483, idProduct=3748, bcdDevice= 1.00
[ 1553.297727] usb 2-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 1553.297735] usb 2-1.1: Product: STM32 STLink
[ 1553.297740] usb 2-1.1: Manufacturer: STMicroelectronics
[ 1553.297745] usb 2-1.1: SerialNumber: Wyk\x06IgHV7\x06        \xc2\x87

$ lsusb
Bus 002 Device 003: ID 0483:374b STMicroelectronics ST-LINK/V2.1
Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

接続を確認したら以下のコマンドでファームウェアをマイコンに書き込みます。
$ st-flash --connect-under-reset write nuttx.bin 0x8000000
st-flash 1.7.0-352-g8c581c3
2024-01-04T15:24:29 INFO common.c: STM32F4x5_F4x7: 192 KiB SRAM, 1024 KiB flash in at least 16 KiB pages.
file nuttx.bin md5 checksum: 31dd856758335ee8a777de6d8e6d6ab, stlink checksum: 0x00730e2e
2024-01-04T15:24:29 INFO common_flash.c: Attempting to write 74348 (0x1226c) bytes to stm32 address: 134217728 (0x8000000)
EraseFlash - Sector:0x4 Size:0x10000 -> Flash page at 0x8010000 erased (size: 0x10000)
2024-01-04T15:24:32 INFO flash_loader.c: Starting Flash write for F2/F4/F7/L4
2024-01-04T15:24:32 INFO flash_loader.c: Successfully loaded flash loader in sram
2024-01-04T15:24:32 INFO flash_loader.c: Clear DFSR
2024-01-04T15:24:32 INFO flash_loader.c: enabling 32-bit flash writes
2024-01-04T15:24:33 INFO common_flash.c: Starting verification of write complete
2024-01-04T15:24:33 INFO common_flash.c: Flash written and verified! jolly good!

ファームの書き込みが終了したら、ホストマシンとUSB-OTG側のUSBポート(マイクロUSB)を接続します。
こちらもdmesgとlsusbで接続状況を確認することができます。
赤字がST-LINK、青字がUSB-OTGです。
安物のUSB-HUBにST-LINKとUSB-OTGの両方を刺したら、USB-OTGを認識しませんでした。
USB-OTG側はホストマシン本体のUSBポートに刺しています。
USB-OTGを認識しないときは、ホスト側のUSBポートやUSBケーブルを変えてみて下さい。
$ sudo dmesg
(略)
[ 1605.944031] usb 2-1.3: new full-speed USB device number 12 using ehci-pci
[ 1606.055320] usb 2-1.3: New USB device found, idVendor=0525, idProduct=a4a7, bcdDevice= 1.01
[ 1606.055344] usb 2-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 1606.055352] usb 2-1.3: Product: CDC/ACM Serial
[ 1606.055357] usb 2-1.3: Manufacturer: NuttX
[ 1606.055362] usb 2-1.3: SerialNumber: 0
[ 1606.059231] cdc_acm 2-1.3:1.0: ttyACM0: USB ACM device

$ lsusb
Bus 002 Device 005: ID 0525:a4a7 Netchip Technology, Inc. Linux-USB Serial Gadget (CDC ACM mode)
Bus 002 Device 004: ID 0483:3748 STMicroelectronics ST-LINK/V2
Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

デバイスファイルを確認します。
これがUSB-OTGのデバイスです。
$ ls /dev/ttyACM*
/dev/ttyACM0

USB-OTGのデバイスにscreenコマンドで接続します。
$ sudo apt install screen
$ sudo screen /dev/ttyACM0

Enterキーを何回か押すとnshコンソール画面が表示されます。
hello nsh shの3つのアプリケーションが組み込まれているNuttxファームが動きます。


free、ps、lsなどのnsh組み込みコマンドが使えます。


最初からdmesgが使えるようになっています。
syslogの出力先はRAMLOGです。


ボード上のリセットボタン(黒いボタン)を押すと、Linuxに戻ります。

続く...