Use Node.js in your end devices(QQ: 796448809)
We work on STM32F4 board for NuttX and the detail of the reference board is well described at STM32F4-discovery with BB.
We do not have any business relation with STM board. It is selected because it has enough RAM and Flash ROM, so that development can be more comfortable. And it has lots of pins to play with.
When IoT.js is built up and optimized, it may work in devices having smaller resource.
$ sudo apt-get install autoconf libtool gperf flex bison autoconf2.13
$ sudo apt-get install cmake libncurses-dev libusb-1.0-0-dev
$ sudo apt-get install libsgutils2-dev gcc-arm-none-eabi minicom
To use menuconfig in NuttX, you may need to install kconfig frontend.
$ git clone https://github.com/jameswalmsley/kconfig-frontends.git
$ cd kconfig-frontends
$ ./bootstrap
$ ./configure --enable-mconf
$ make
$ sudo make install
$ sudo ldconfig
$ xcode-select --install
$ brew tap PX4/homebrew-px4
$ brew update
$ brew install cmake bash-completion pkg-config kconfig-frontends
$ brew install gcc-arm-none-eabi libusb minicom
|Repository|Tag Name| |———-|:——:| | nuttx | nuttx-7.19 | | app | nuttx-7.19 |
We only guarantee that the specified version will work well. It is recommended to check out with the specified tag from a git repository.
Clone IoT.js and NuttX into iotjs-nuttx directory
$ mkdir iotjs-nuttx
$ cd iotjs-nuttx
$ git clone https://github.com/Samsung/iotjs.git
$ git clone https://bitbucket.org/nuttx/nuttx.git --branch nuttx-7.19
$ git clone https://bitbucket.org/nuttx/apps.git --branch nuttx-7.19
$ git clone https://github.com/texane/stlink.git
Note that we only support the specified git tag from nuttx repository
The following directory structure is created after these commands
iotjs-nuttx
+ apps
+ iotjs
| + config
| + nuttx
| + stm32f4dis
+ nuttx
+ stlink
To generate headers which are required to build IoT.js, for the first time, you need to build NuttX at least once. This time NuttX build will be failed. But don’t worry at this time. After one execution, you don’t need this sequence any more.
$ cd apps/system
$ mkdir iotjs
$ cp ../../iotjs/config/nuttx/stm32f4dis/app/* ./iotjs/
# assuming you are in iotjs-nuttx folder
$ cd nuttx/tools
# configure NuttX USB console shell
$ ./configure.sh stm32f4discovery/usbnsh
Now you can configure nuttx like either of below. For convenience, we provide built-in configure file for you. (This configure file is equipped with modules specified as always
. For optional
modules, you might follow instructions below.)
$ cd ..
$ cp ../iotjs/config/nuttx/stm32f4dis/config.default .config
Or if you want to configure yourself, you can follow guide below.
$ cd ..
# might require to run "make menuconfig" twice
$ make menuconfig
Followings are the options to set:
Change Build Setup -> Build Host Platform from Windows to [Linux |
OSX] |
System Type -> FPU support
System Type -> STM32 Peripheral Support -> SDIO
RTOS Features -> Clocks and Timers -> Support CLOCK_MONOTONIC
RTOS Features -> Pthread Options -> Enable mutex types
RTOS Features -> Files and I/O -> Enable /dev/console
RTOS Features -> Work queue support -> High priority (kernel) worker thread
Device Drivers -> Disable driver poll interfaces
Device Drivers -> MMC/SD Driver Support
Device Drivers -> MMC/SD Driver Support -> MMC/SD SDIO transfer support
Networking Support -> Networking Support
Networking Support -> Socket Support -> Socket options
Networking Support -> Unix Domain Socket Support
Networking Support -> TCP/IP Networking
Networking Support -> TCP/IP Networking -> Enable TCP/IP write buffering
File Systems -> FAT file system
File Systems -> FAT file system -> FAT upper/lower names
File Systems -> FAT file system -> FAT long file names
Device Drivers -> Network Device/PHY Support -> Late driver initialization
Library Routines -> Standard Math library
Application Configuration -> System Libraries and NSH Add-ons -> IoT.js
Application Configuration -> System Libraries and NSH Add-ons -> readline() Support
(for those who wants to use readline)net
module
System Type -> STM32 Peripheral Support -> Ethernet MAC
System Type -> STM32 Peripheral Support -> USART2
System Type -> STM32 Peripheral Support -> USART6
System Type -> Ethernet MAC configuration -> PHY address
to 0
System Type -> Ethernet MAC configuration -> PHY Status Register Address (decimal)
to 31
System Type -> Ethernet MAC configuration -> PHY Status Alternate Bit Layout
System Type -> Ethernet MAC configuration -> PHY Mode Mask
to 0x001c
System Type -> Ethernet MAC configuration -> 10MBase-T Half Duplex Value
to 0x0004
System Type -> Ethernet MAC configuration -> 100Base-T Half Duplex Value
to 0x0008
System Type -> Ethernet MAC configuration -> 10Base-T Full Duplex Value
to 0x0014
System Type -> Ethernet MAC configuration -> 10MBase-T Full Duplex Value
to 0x0018
System Type -> Ethernet MAC configuration -> RMII clock configuration
to External RMII clock
Board Selection -> STM32F4DIS-BB base board
Device Drivers -> Network Device/PHY Support -> Board PHY Selection
to SMSC LAN8720 PHY
Networking Support -> Data link support -> Local loopback
Networking Support -> TCP/IP Networking -> TCP/IP backlog support
Networking Support -> ARP Configuration -> ARP send
dgram
Networking Support > UDP Networking
pwm
module
System Type -> STM32 Peripheral Support -> TIM(N)
System Type -> Timer Configuration -> TIM(N) PWM
System Type -> Timer Configuration -> TIM(N) PWM -> TIM(n) PWM Output Channel
to channel number you wantDevice Drivers -> PWM Driver Support
adc
module
System Type -> STM32 Peripheral Support -> ADC(N)
System Type -> STM32 Peripheral Support -> TIM(M)
System Type -> Timer Configuration -> TIM(M) ADC
Device Drivers -> Analog Device(ADC/DAC) Support
Device Drivers -> Analog Device(ADC/DAC) Support -> Analog-to-Digital Conversion
uart
module
System Type -> STM32 Peripheral Support -> U[S]ART(N)
i2c
module
System Type -> STM32 Peripheral Support -> I2C1
Device Drivers -> I2C Driver Support
spi
module
System Type -> STM32 Peripheral Support -> SPI1
Device Drivers -> SPI exchange
# assuming you are in iotjs-nuttx folder
$ cd nuttx/
$ make context
These options are needed.
--target-arch=arm
--target-os=nuttx
--nuttx-home=/path/to/nuttx
--target-board=stm32f4dis
--jerry-heaplimit=[..]
For example,
$ ./tools/build.py \
--target-arch=arm --target-os=nuttx --nuttx-home=../nuttx \
--target-board=stm32f4dis --jerry-heaplimit=78
Library files will be generated like below when build is successful.
$ ls build/arm-nuttx/release/lib
libhttpparser.a libiotjs.a libjerrycore.a libtuv.a
# assuming you are in iotjs-nuttx folder
$ cd nuttx/
$ make IOTJS_ROOT_DIR=../iotjs
For release version, you can type R=1 make on the command shell.
Connect Mini-USB for power supply and connect Micro-USB for NSH
console.
To configure stlink
utility for flashing, follow the instructions here.
To install,
# assuming you are in stlink folder
$ cd stlink
$ make
To flash,
# assuming you are in nuttx folder
$ sudo ../stlink/build/Release/st-flash write nuttx.bin 0x8000000
There are two USB Connections on the Target board. USB mini CN1 and USB micro CN5. Both USB ports need to be connected to your Host. CN1 is used for power and Flashing, but it will not appear as a device in Linux. CN5 is used for NSH and will appear as /dev/ttyACM0(linux)
or /dev/tty.usbmodem1(macOS)
when things work well.
// linux
$ minicom --device=/dev/ttyACM0
// macOS
$ minicom --device=/dev/tty.usbmodem1
You may need to enable Add Carriage Return option.
Press Enter key several times to trigger NuttShell to start.
If micro SD is enabled, you can copy any script file to it and run with nsh, for example;
NuttShell (NSH)
nsh> mount -t vfat /dev/mmcsd0 /mnt/sdcard
nsh> iotjs /mnt/sdcard/path_to_file.js
If you see
+-----------------------------+
| |
| Cannot open /dev/ttyACM0! |
| |
+-----------------------------+
and it stays on the screen, something is wrong. Blue LED may blink if NuttX is in abnormal state. Press black(reset) button on the board and try again. If you still see this warning message, begin with original NuttX code and check your board, USB line and other softwares.