================= 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 - 256 Kbytes of Flash memory - 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. ===== ===== LED PINS ===== ===== LED_1 PC0 LED_2 PC1 LED_4 PC2 LED_5 PC3 ===== ===== User Buttons ============ The STM32F4-RS485 has 4 user switches. ======= ===== ====== 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. UARTs ===== The STM32F4-RS485 has 1 USART available for user. USART6 ------ ========== ======= UART/USART PINS ========== ======= TX PC6 [1] RX PC7 CK PA8 ========== ======= [1] Warning you make need to reverse RX/TX on some RS-232 converters SDCard support ============== The STM32F4-RS485 has 1 SDCard slot connected as below: ========== ===== SDIO PINS ========== ===== SDIO_D0 PC8 SDIO_D1 PC9 SDIO_D2 PC10 SDIO_D3 PC11 SDIO_DK PC12 ========== ===== 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: ====== ===== I2C PINS ====== ===== SDA PB7 SCL PB8 ====== ===== 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> Temperature Sensor ================== The STM32F4-RS485 development board has a temperature sensor TMP75 (compatible with LM75) connected through I2C as below: ====== ===== I2C PINS ====== ===== SDA PB7 SCL PB8 ====== ===== RS485 Transceiver ================= The STM32F4-RS485 development board has a half-duplex RS-485 transceiver, the BL3085B it is connected through USART2 as below: ========== ===== USART2 PINS ========== ===== USART2_RX RO USART2_RTS DE, /RE USART2_RX DI ========== ===== A/D Converter ============= The STM32F4-RS485 development board has two Analog to Digital converters with Amplifier Buffer (1COS724SR) and connected as below: ======= ===== PWM PINS ======= ===== PWM_1 PB6 PWM_2 PA6 ======= ===== D/C Converter ============= The STM32F4-RS485 development board has two Digital to Analog converters with Amplifier Buffer (1COS724SR) and connected as below: ======= ===== ADC PINS ======= ===== ADC_1 PA0 ADC_2 PA4 ======= ===== Configurations ============== Each stm32f401rc-rs485 configuration is maintained in a sub-directory and can be selected as follow:: tools/configure.sh stm32f401rc-rs485: Where is one of the following: Configuration Directories ------------------------- nsh --- Configures the NuttShell (nsh) located at apps/examples/nsh. This configuration enables a serial console on USART6. 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. 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 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 modbus_master ------------- Configures the NuttShell (nsh) and enables modbus in master mode. This 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 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 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". 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 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! rndis ----- Configures the NuttShell (nsh), enables a serial console on USART6 and enables RNDIS over USB. NSH commands:: nsh> ping -h Usage: ping [-c ] [-i ] [-W ] [-s ] ping -h Where: is either an IPv4 address or the name of the remote host that is requested the ICMPv4 ECHO reply. -c determines the number of pings. Default 10. -i is the default delay between pings (milliseconds). Default 1000. -W is the timeout for wait response (milliseconds). Default 1000. -s 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 usbmsc ------ Configures the NuttShell (nsh), enables a serial console on USART6 and enables USB Mass Storage. NSH commands:: nsh> msconn mcsonn_main: Creating block drivers mcsonn_main: Configuring with NLUNS=1 mcsonn_main: handle=0x20004c10 mcsonn_main: Bind LUN=0 to /dev/mmcsd0 mcsonn_main: Connected nsh> msdis