Firmware development
Custom embedded software, from register-level drivers to full RTOS applications, written for reliability, low power and the engineer who maintains it after us. Because we also design the boards, bring-up is fast and nobody argues about whose side the bug is on.
AI on the microcontroller
Small models running inside the firmware classify sensor data, vibration and sound on the device itself, with no network and very little power.
See AI integration- TinyML on STM32 and ESP32-S3
- Sensor and vibration classification
- Model updates over the air
What we do
Bare-metal and RTOS firmware for STM32, ESP32 and more: drivers, connectivity, bootloaders and OTA.
Bare-metal firmware
Register-level and HAL code for deterministic, low-latency work: interrupt routines, bootloaders and power-critical code.
- Register-level C
- ISR tuning
- HAL and CMSIS
RTOS applications
Multitasking firmware on FreeRTOS or Zephyr: scheduling, queues, semaphores, event groups and memory management.
- FreeRTOS
- Zephyr
- Task design
Device drivers
Drivers for I²C, SPI, UART, CAN, USB, ADC and displays, verified on hardware with a scope and logic analyser.
- I²C, SPI, UART
- CAN and CAN FD
- USB
- MIPI DSI
Wireless and IoT
Wi-Fi provisioning, BLE pairing, LoRaWAN, MQTT over TLS and certificate-based device authentication.
- Wi-Fi and BLE
- LoRaWAN
- MQTT and TLS
Low power
Sleep-mode architecture and power profiling for battery devices that must last for years.
- Sleep modes
- Power profiling
- Energy harvesting
Bootloaders and OTA
Dual-bank updates with rollback, signature checks and secure boot, tied into your fleet management.
- Dual-bank OTA
- Secure boot
- Rollback
How we write firmware
The standards and tools behind every release, and the platforms we work on.
- Languages
- C99, C++17, Arm assembly
- RTOS
- FreeRTOS, Zephyr, Azure RTOS
- Coding standard
- MISRA C:2012 guidelines
- Version control
- Git with GitLab CI or GitHub Actions
- Debugging
- JTAG and SWD, J-Link, OpenOCD
- Unit testing
- Unity, Ceedling, CMock
- Build
- CMake, Make, PlatformIO
- Protocols
- UART, SPI, I²C, CAN, USB, Ethernet
- Wireless stacks
- ESP-IDF, Zephyr Bluetooth, LoRaWAN
- Security
- TLS 1.3, AES-256, secure boot
- Documentation
- Doxygen, SRS, software design description
- Static analysis
- PC-lint, Clang-Tidy, Cppcheck
Platforms
STM32
Cortex-M0 to M7, our main platform for industrial products, including dual-core H7.
ESP32
ESP32, S3, C3 and C6 for Wi-Fi, BLE and Thread devices.
Nordic nRF52 and nRF9160
Low-power BLE and LTE-M for wearables and trackers.
NXP i.MX RT
Crossover MCUs for HMI, motor control and edge processing.
AVR and ATmega
Simple, low-cost controllers such as the ATmega32U4.
TI MSP430 and TM4C
Ultra-low-power designs for battery-critical products.
Raspberry Pi and CM4
Linux gateways, kiosks and edge AI.
RISC-V
GD32V, ESP32-C3 and custom SoC firmware.
How a project runs
- 01
Requirements and architecture
Timing, memory and power constraints turned into a task design, memory map and boot sequence before coding starts.
- SRS document
- Architecture diagram
- Memory map
- 02
Board bring-up
Clocks, peripherals and pin mapping brought up and checked against the schematic with a scope and logic analyser.
- BSP
- Clock configuration
- Bring-up log
- 03
Drivers and middleware
Drivers, sensor libraries and communication stacks, reviewed with static analysis and unit-tested with mocked hardware.
- Drivers
- Communication stacks
- Unit tests
- 04
Application and RTOS
State machines, inter-task communication and scheduling, profiled for CPU load, stack use and worst-case timing.
- Task design
- State machines
- CPU profile
- 05
Testing
Hardware-in-the-loop, stress and soak tests, watchdog recovery and power measurement, run in CI on every change.
- HIL tests
- Soak test log
- Power report
- 06
Release
A tagged binary with release notes, API documentation, porting guide and full source with Git history.
- Release binary
- API docs
- Porting guide
What you receive
Everything is yours at handover, including the source and its history.
Production binary
Tagged .hex, .bin and .elf with checksums and flashing instructions.
Full source code
Commented source with complete Git history.
API documentation
Generated reference for every module and public interface.
Architecture documents
Task diagrams, state machines and the memory map.
Test reports
Unit, hardware-in-the-loop and soak test results.
Porting guide
How to move the firmware to the next board revision.
Build system
CMake or Make project with CI scripts.
OTA package
Signed update image with manifest and rollback support.
Tools we use
Primary IDE
STM32CubeIDE and CubeMX
HAL generation, GDB debugging and profiling.
Multi-platform
VS Code and PlatformIO
One environment for STM32, ESP32, Nordic and more.
Debug and trace
SEGGER J-Link and Ozone
RTT logging, trace and power analysis.
Unit testing
Unity and Ceedling
C unit tests with hardware mocks in CI.
Static analysis
PC-lint and Cppcheck
MISRA checks as a gate in the pipeline.
Version control
Git and GitLab CI
Code review, automated builds and tests on every merge.
Related work
AI insideAn industrial controller you program by describing it
Our own STM32-based controller and the Shree-Mazu Workbench, which generates and flashes its firmware from a canvas or a plain-English request.
Read the case study

Contactless vital-signs monitoring
A 60 GHz radar and a thermal camera measure heart rate, breathing and temperature without touching the patient, shown on a branded touch-screen kiosk.
Read the case study
The Diamond Planner machine, designed end to end
A machine that scans a rough diamond in 3D and plans the most valuable stones inside it, using our own gravity-based optimization. We designed all of it: the mechanics, the 6-axis controller board and the software.
Read the case studyReady to make your machine smarter?
Tell us about the machine you run or the product you imagine. We reply within 24 hours on working days. We sign an NDA before you share details.
