ModTOS
Modbus RTU Driver for STM32 + FreeRTOS
Interrupt driven frame handling with RS485 GPIO direction control
Overview
ModTOS is a lightweight dependency free Modbus RTU slave implementation designed for STM32 microcontrollers running FreeRTOS. It acts as a cooperative background task minimizing CPU load and avoiding interference with timing critical logic.
The driver leverages UART interrupt with idle line detection to capture Modbus RTU frames without polling. RS485 direction is controlled via GPIO enabling half duplex communication commonly found in industrial systems.
ModTOS exposes a flat holding register table accessible through standard Modbus function codes 0x03 Read Holding Registers and 0x10 Write Multiple Holding Registers.
Features
- Modbus RTU Slave one unit ID per UART
- Function Code 0x03 Read Holding Registers
- Function Code 0x10 Write Multiple Holding Registers
- CRC 16 Modbus validation on all frames
- Modbus Exception Handling:
0x01ILLEGAL_FUNCTION0x02ILLEGAL_DATA_ADDRESS0x03ILLEGAL_DATA_VALUE
- Flat register buffer 128 x uint16_t
- Task based integration with FreeRTOS
- Zero dynamic memory allocation
- Uses UART Receive to Idle mode no polling
- Portable to bare metal & polling environments with minimal changes
High Level Design
1 Global Modbus Register Table
- Represents Modbus holding registers starting at address 0
- Accessible directly by application code or via Modbus transactions
2 UART RX & TX Buffers
request_frameholds raw Modbus RTU request bytesresponse_frameused to construct replies- Both statically sized for worst case message sizes
3 RS485 Direction Control
- DE and RE pin sets transceiver mode:
- RX default
- TX only during response transmission
Execution Flow
1 Initialization
- Clears buffers
- Sets RS485 to RX mode
- Enables UART in idle line receive mode
2 Receiving a Frame
- UART receives bytes into
request_frame - Idle line detection triggers reception complete callback
- Application must implement callback to forward the frame for parsing
3 Processing the Request
- Frame validation:
- Minimum length
- Slave ID match
- CRC 16 check
- Dispatch to appropriate handler:
0x03Read holding registers0x10Write multiple holding registers- Others Modbus exception
Function Code Handlers
FC 0x03 Read Holding Registers
- Parses
startAddrandnumRegs - Validates bounds
- Builds response:
- Slave ID
- Function code
- Byte count
- Register values High byte Low byte per register
- CRC
FC 0x10 Write Multiple Holding Registers
- Parses
startAddrnumRegsandbyteCount - Validates range and byte consistency
- Writes values to register table
- Responds with echo:
- Slave ID
- Function code
- Start address
- Quantity
Response Transmission
- Appends CRC to
response_frame - Sets RS485 to TX mode
- Sends frame via blocking UART
- Switches RS485 back to RX mode
- TX timeout currently fixed at 100 ms
Description
Modbus RTU driver for STM32 + FreeRTOS with interrupt‑driven frame handling and RS485 GPIO direction control.
Languages
C
100%