2023-10-29 22:26:18 +01:00
=================
stm32f401rc-rs485
=================
This page discusses issues unique to NuttX configurations for the
NuttX STM32F4-RS485 development board.
.. figure :: stm32f401rc_rs485.jpg
:align: center
Board information
=================
This board was release on NuttX International Workshop 2023 and developed based on
STM32F401RCT6 microcontroller.
STM32F401RCT6 microcontroller features:
- Arm 32-bit Cortex®-M4 CPU with FPU
2023-11-23 10:57:59 +01:00
- 256 Kbytes of Flash memory
2023-10-29 22:26:18 +01:00
- 64 Kbytes of SRAM
- Serial wire debug (SWD) & JTAG interfaces
- Up to 81 I/O ports with interrupt capability
- Up to 11 communication interfaces
- Up to 3 I2C interfaces
- Up to 3 USARTs
- Up to 4 SPIs
- SDIO interface
- USB 2.0 full-speed device/host/OTG controller with on-chip PHY
The board features:
- Digital I2C Temperature Sensor (TMP75)
- 2K bits (256x8) I2C EEPROM
- On-board RS485 Transceiver
- Two Analog Input Stages with Amplifier Buffer
- Two Analog Output Stages with Amplifier Buffer
- MicroSD Connector supporting 1 or 4-bit bus
- Four User LEDs
- Four User Buttons
- USB for DFU (Device Firmware Update) and USB device functionality, as well as powering the board
- Onboard voltage regulator from 5V to 3.3V
- SWD Pins for use as STLink (Pin header) and TC2030-IDC 6-Pin Tag-Connect Plug-of-Nails™ Connector
- Crystal for HS 8MHz
- Crystal for RTC 32.768KHz
Board documentation:
https://github.com/lucaszampar/NuttX_STM32F4_RS485_DevBoard
As F4 series have a USB DFuSe-capable BootROM [AN2606], the board can be flashed
via `dfu-util` over USB, or via `stm32flash` over UART without any debuggers.
LEDs
====
The STM32F4-RS485 has 4 software controllable LEDs.
2023-10-30 09:35:01 +01:00
===== =====
LED PINS
===== =====
LED_1 PC0
LED_2 PC1
LED_4 PC2
LED_5 PC3
===== =====
2023-10-29 22:26:18 +01:00
User Buttons
============
The STM32F4-RS485 has 4 user switches.
2023-12-10 20:48:28 +01:00
======= ===== ======
SWITCH PINS LABEL
======= ===== ======
SWIO_1 PB13 SW3
SWIO_2 PB14 SW4
SWIO_3 PB15 SW5
SWIO_4 PC6 SW6[1]
======= ===== ======
[1] The switch SWIO_4 (SW6) is disabled due a conflict with PIN
PC6 when using USART6.
2023-10-29 22:26:18 +01:00
UARTs
=====
The STM32F4-RS485 has 1 USART available for user.
2023-12-10 20:48:28 +01:00
USART6
2023-10-29 22:26:18 +01:00
------
2023-11-04 20:17:59 +01:00
========== =======
2023-10-30 09:35:01 +01:00
UART/USART PINS
2023-11-04 20:17:59 +01:00
========== =======
2023-12-10 20:48:28 +01:00
TX PC6 [1]
RX PC7
CK PA8
2023-11-04 20:17:59 +01:00
========== =======
2023-10-29 22:26:18 +01:00
2023-11-04 20:17:59 +01:00
[1] Warning you make need to reverse RX/TX on some RS-232 converters
2023-10-29 22:26:18 +01:00
2023-11-25 15:57:57 +01:00
SDCard support
==============
2023-10-29 22:26:18 +01:00
The STM32F4-RS485 has 1 SDCard slot connected as below:
2023-10-30 09:35:01 +01:00
========== =====
SDIO PINS
========== =====
SDIO_D0 PC8
SDIO_D1 PC9
SDIO_D2 PC10
SDIO_D3 PC11
SDIO_DK PC12
========== =====
2023-10-29 22:26:18 +01:00
EEPROM
======
The STM32F4-RS485 development board has serial EEPROM HX24LC02B, with 2k bits (256x8) and internally
organized with 32 pages of 8 bytes each. It is connected through I2C as below:
2023-10-30 09:35:01 +01:00
====== =====
I2C PINS
====== =====
SDA PB7
SCL PB8
====== =====
2023-10-29 22:26:18 +01:00
2023-12-04 00:42:56 +01:00
Users can enable EERPOM support on STM32F4-RS485 by following below configuration:
- Configure basic nsh::
./tools/configure.sh -l stm32f401rc-rs485:nsh
- Enable the following configs::
CONFIG_DEV_ZERO=y
CONFIG_EEPROM=y
CONFIG_FS_PROCFS=y
CONFIG_I2C=y
CONFIG_I2C_EE_24XX=y
CONFIG_STM32_I2C1=y
- Build and flash the STM32F4-RS485.
- Use dd command to write and read data from EEPROM as below::
nsh> dd if=/dev/zero of=/dev/eeprom
nsh: dd: write failed: 1
nsh> dd if=/dev/console of=/dev/eeprom bs=1 count=4
(type "Hello")
nsh> dd if=/dev/eeprom of=/dev/console bs=4 count=1
Hellonsh>
2023-10-29 22:26:18 +01:00
Temperature Sensor
==================
2024-02-24 20:41:12 +01:00
The STM32F4-RS485 development board has a temperature sensor TMP75 (compatible with LM75) connected through I2C as below:
2023-10-29 22:26:18 +01:00
2023-10-30 09:35:01 +01:00
====== =====
I2C PINS
====== =====
SDA PB7
SCL PB8
====== =====
2023-10-29 22:26:18 +01:00
RS485 Transceiver
2023-10-30 09:35:01 +01:00
=================
2023-10-29 22:26:18 +01:00
The STM32F4-RS485 development board has a half-duplex RS-485 transceiver, the BL3085B it is connected
through USART2 as below:
2023-10-30 09:35:01 +01:00
========== =====
USART2 PINS
========== =====
USART2_RX RO
USART2_RTS DE, /RE
2023-12-10 20:48:28 +01:00
USART2_RX DI
2023-10-30 09:35:01 +01:00
========== =====
2023-10-29 22:26:18 +01:00
A/D Converter
2023-10-30 09:35:01 +01:00
=============
2023-10-29 22:26:18 +01:00
The STM32F4-RS485 development board has two Analog to Digital converters with Amplifier Buffer (1COS724SR)
and connected as below:
2023-10-30 09:35:01 +01:00
======= =====
PWM PINS
======= =====
PWM_1 PB6
PWM_2 PA6
======= =====
2023-10-29 22:26:18 +01:00
D/C Converter
2023-10-30 09:35:01 +01:00
=============
2023-10-29 22:26:18 +01:00
The STM32F4-RS485 development board has two Digital to Analog converters with Amplifier Buffer (1COS724SR)
and connected as below:
2023-10-30 09:35:01 +01:00
======= =====
ADC PINS
======= =====
ADC_1 PA0
ADC_2 PA4
======= =====
2023-10-29 22:26:18 +01:00
Configurations
==============
Each stm32f401rc-rs485 configuration is maintained in a sub-directory and
can be selected as follow::
tools/configure.sh stm32f401rc-rs485:<subdir>
2023-10-30 09:35:01 +01:00
Where <subdir> is one of the following:
2023-10-29 22:26:18 +01:00
Configuration Directories
-------------------------
nsh
---
Configures the NuttShell (nsh) located at apps/examples/nsh. This
2023-12-10 20:48:28 +01:00
configuration enables a serial console on USART6.
2023-11-25 15:57:57 +01:00
2024-02-17 14:33:33 +01:00
usbnsh
------
Configures the NuttShell (nsh) located at apps/examples/nsh. This
configuration enables a serial console over USB.
After flasing and reboot your board you should see in your dmesg logs::
[ 2638.948089] usb 1-1.4: new full-speed USB device number 16 using xhci_hcd
[ 2639.054432] usb 1-1.4: New USB device found, idVendor=0525, idProduct=a4a7, bcdDevice= 1.01
[ 2639.054437] usb 1-1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 2639.054438] usb 1-1.4: Product: CDC/ACM Serial
[ 2639.054440] usb 1-1.4: Manufacturer: NuttX
[ 2639.054441] usb 1-1.4: SerialNumber: 0
[ 2639.074861] cdc_acm 1-1.4:1.0: ttyACM0: USB ACM device
[ 2639.074886] usbcore: registered new interface driver cdc_acm
[ 2639.074887] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters
You may need to press **ENTER** 3 times before the NSH show up.
2023-11-25 15:57:57 +01:00
sdcard
------
Configures the NuttShell (nsh) and enables SD card support.
The stm32f401rc-rs485 has an onboard microSD slot that should
be automatically registered as the block device /dev/mmcsd0 when
an SD card is present. The SD card can then be mounted by the
NSH commands::
nsh> mount -t procfs /proc
nsh> mount -t vfat /dev/mmcsd0 /mnt
2023-12-10 20:48:28 +01:00
modbus_slave
------------
Configures the NuttShell (nsh) and enables modbus in slave mode. This
configuration enables a serial console on USART6. The RS-485 is connected
to USART2. Follow below precedure to use modbus test aplication, you will
need a USB to RS-485 converter to connect the board to a PC via RS-485.
NuttShell configuration:
Run modbus application at NSH::
nsh> modbus -help
USAGE: modbus [-d|e|s|q|h]
Where:
-d : Disable protocol stack
-e : Enable the protocol stack
-s : Show current status
-q : Quit application
-h : Show this information
nsh> modbus -e
PC Configuration:
Download and install mbpoll aplication::
sudo apt install mbpoll
Check which TTY USB port is being used by you USB to RS-485 converter::
sudo dmesg
[99846.668209] usb 1-1.3: Product: USB Serial
[99846.676313] ch341 1-1.3:1.0: ch341-uart converter detected
[99846.677454] usb 1-1.3: ch341-uart converter now attached to ttyUSB1
Run the mbpoll as below::
mbpoll -a 10 -b 38400 -t 3 -r 1000 -c 4 /dev/ttyUSB1 -R
At PC terminal you will see the mbpoll application receiving the random values
generated by STM32F401RC-RS485 and transmitted over RS-485::
mbpoll 1.0-0 - FieldTalk(tm) Modbus(R) Master Simulator
Copyright © 2015-2019 Pascal JEAN, https://github.com/epsilonrt/mbpoll
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions; type 'mbpoll -w' for details.
Protocol configuration: Modbus RTU
Slave configuration...: address = [10]
start reference = 1000, count = 4
Communication.........: /dev/ttyUSB1, 38400-8E1
t/o 1.00 s, poll rate 1000 ms
Data type.............: 16-bit register, input register table
-- Polling slave 10... Ctrl-C to stop)
[1000]: 58080 (-7456)
[1001]: 0
[1002]: 0
[1003]: 0
-- Polling slave 10... Ctrl-C to stop)
[1000]: 6100
[1001]: 0
[1002]: 0
[1003]: 0
-- Polling slave 10... Ctrl-C to stop)
[1000]: 51010 (-14526)
[1001]: 0
[1002]: 0
[1003]: 0
-- Polling slave 10... Ctrl-C to stop)
[1000]: 12528
[1001]: 0
[1002]: 0
[1003]: 0
2024-02-10 15:52:55 +01:00
modbus_master
-------------
2024-03-02 16:40:57 +01:00
Configures the NuttShell (nsh) and enables modbus in master mode. This
2024-02-10 15:52:55 +01:00
configuration enables a serial console on USART6. The RS-485 is connected
to USART2. Follow below precedure to use modbusmaster test aplication, you will
need a USB to RS-485 converter to connect the board to a PC via RS-485.
PC Configuration:
Download and install diagslave aplication from https://www.modbusdriver.com/diagslave.html.
Check which TTY USB port is being used by you USB to RS-485 converter::
sudo dmesg
[99846.668209] usb 1-1.3: Product: USB Serial
[99846.676313] ch341 1-1.3:1.0: ch341-uart converter detected
[99846.677454] usb 1-1.3: ch341-uart converter now attached to ttyUSB1
Run the diagslave as below::
sudo diagslave -a 10 -b 38400 /dev/ttyUSB1
At PC terminal you will see the diagslave application listening to address 10,
notice that this address is configurable via MODBUSMASTER_SLAVEADDR::
diagslave 3.4 - FieldTalk(tm) Modbus(R) Diagnostic Slave Simulator
Copyright (c) 2002-2021 proconX Pty Ltd
Visit https://www.modbusdriver.com for Modbus libraries and tools.
Protocol configuration: Modbus RTU, frame tolerance = 0ms
Slave configuration: address = 10, master activity t/o = 3.00s
Serial port configuration: /dev/ttyUSB1, 38400, 8, 1, even
Server started up successfully.
Listening to network (Ctrl-C to stop)
Slave 10: readHoldingRegisters from 2, 1 references
.......
NuttShell configuration:
Run modbusmaster application at NSH::
NuttShell (NSH) NuttX-12.4.0
nsh> modbusmaster
Initializing modbus master...
Creating poll thread.
Sending 100 requests to slave 10
mbmaster_main: Exiting poll thread.
Modbus master statistics:
Requests count: 100
Responses count: 100
Errors count: 0
Deinitializing modbus master...
The application modbusmaster will send 100 requests, you can check on diagslave::
Server started up successfully.
Listening to network (Ctrl-C to stop)
Slave 10: readHoldingRegisters from 2, 1 references
Slave 10: readHoldingRegisters from 2, 1 references
Slave 10: readHoldingRegisters from 2, 1 references
Slave 10: readHoldingRegisters from 2, 1 references
Slave 10: readHoldingRegisters from 2, 1 references
Slave 10: readHoldingRegisters from 2, 1 references
Slave 10: readHoldingRegisters from 2, 1 references
2024-02-24 20:41:12 +01:00
lm75
----
Configures the NuttShell (nsh) over USB Serial (check usbserial configuration) and enables temperature sensor LM75.
NSH commands::
nsh> lm75 -help
Usage: temp [OPTIONS]
[-n count] selects the samples to collect. Default: 1 Current: 100
[-h] shows this message and exits
nsh> lm75 -n 3
30.13 degrees Celsius
30.13 degrees Celsius
30.13 degrees Celsius
2024-03-02 16:40:57 +01:00
adc
---
Configures the NuttShell (nsh) over USB Serial (check usbserial configuration) and enables ADC 1 on channels 0 and 4.
NSH commands::
nsh> adc -h
Usage: adc [OPTIONS]
Arguments are "sticky". For example, once the ADC device is
specified, that device will be re-used until it is changed.
"sticky" OPTIONS include:
[-p devpath] selects the ADC device. Default: /dev/adc0 Current: /dev/adc0
[-n count] selects the samples to collect. Default: 1 Current: 0
[-h] shows this message and exits
nsh> adc -n 2
adc_main: g_adcstate.count: 2
adc_main: Hardware initialized. Opening the ADC device: /dev/adc0
Sample:
1: channel: 0 value: 2684
Sample:
1: channel: 4 value: 2682
Currently there is a bug that causes the application to always read the same value for channel 0 and 4. If you want to read the value from channel 2, you will need to enable the config "ADC1 Scan Mode".
2024-03-10 21:26:44 +01:00
dac
---
Configures the NuttShell (nsh) over USB Serial (check usbserial configuration) and enables PWM 3 on channel 1.
Use pwm command on NSH to change dutty cycle, frequency and duration, use dac_out_2 to measure the output voltage.
NSH commands::
nsh> pwm -h
Usage: pwm [OPTIONS]
Arguments are "sticky". For example, once the PWM frequency is
specified, that frequency will be re-used until it is changed.
"sticky" OPTIONS include:
[-p devpath] selects the PWM device. Default: /dev/pwm0 Current: NONE
[-f frequency] selects the pulse frequency. Default: 100 Hz Current: 100 Hz
[-d duty] selects the pulse duty as a percentage. Default: 50 % Current: 50 %
[-t duration] is the duration of the pulse train in seconds. Default: 5 Current: 5
[-h] shows this message and exits
nsh> pwm -d 50 -t 3
pwm_main: starting output with frequency: 50 duty: 00007fff
pwm_main: stopping output
2024-03-16 20:32:17 +01:00
qencoder
--------
Configures the NuttShell (nsh) over USB Serial (check usbserial configuration) and enables Timer 3 on channels 1 and
2 to handle Quadrature Encoder.
NSH commands::
nsh> qe -help
Usage: qe [OPTIONS]
OPTIONS include:
[-p devpath] QE device path
[-n samples] Number of samples
[-t msec] Delay between samples (msec)
[-r] Reset the position to zero
[-h] Shows this message and exits
nsh> qe -p /dev/qe0 -n 5 -t 100 -r
nsh: qe: too many arguments
qe_main: Hardware initialized. Opening the encoder device: /dev/qe0
qe_main: Resetting the count...
qe_main: Number of samples: 5
qe_main: 1. 0
qe_main: 2. 0
qe_main: 3. 4
qe_main: 4. 2
qe_main: 5. 2
Terminating!
2024-04-28 16:25:13 +02:00
rndis
-----
Configures the NuttShell (nsh), enables a serial console on USART6 and enables RNDIS over USB.
NSH commands::
nsh> ping -h
Usage: ping [-c <count>] [-i <interval>] [-W <timeout>] [-s <size>] <hostname>
ping -h
Where:
<hostname> is either an IPv4 address or the name of the remote host
that is requested the ICMPv4 ECHO reply.
-c <count> determines the number of pings. Default 10.
-i <interval> is the default delay between pings (milliseconds).
Default 1000.
-W <timeout> is the timeout for wait response (milliseconds).
Default 1000.
-s <size> specifies the number of data bytes to be sent. Default 56.
-h shows this text and exits.
nsh> ping 10.42.0.1
PING 10.42.0.1 56 bytes of data
56 bytes from 10.42.0.1: icmp_seq=0 time=0.0 ms
56 bytes from 10.42.0.1: icmp_seq=1 time=0.0 ms
...
10 packets transmitted, 10 received, 0% packet loss, time 10100 ms
rtt min/avg/max/mdev = 0.000/0.000/0.000/0.000 ms