Firmware for safety-critical automotive subsystems — bare-metal C on Cortex-M4, closed-loop motor control, and the signal processing that turns a noisy sensor into a number the vehicle can act on. Lately, also the local AI tooling that reads the reference manuals so I do not have to.
I am an embedded software engineer with three years on safety-critical automotive products — bare-metal C on STM32, closed-loop BLDC motor control, and ECG and radar signal processing. Now also building local AI tooling for firmware work.
Most of this work started at a bench: a motor, an encoder, a serial terminal, and a control loop that behaved nothing like the simulation. The problems are physical, the feedback is immediate, and a fault path either trips on the bench or it does not exist.
A local, offline assistant that answers STM32 firmware questions from the real ST reference manuals, with document and page citations. Firmware source is confidential, so nothing leaves the machine.
Retrieval-augmented generation over RM0090, UM1725 and the STM32F407VG datasheet: hybrid retrieval, vector plus BM25, feeding an INT4-quantised Qwen2.5-Coder 7B through Ollama. Bus, pin and clock facts are read from CMSIS headers and the project's .ioc file, not from the model. Later phases check a CubeIDE project's configuration and expose the checks as MCP tools in VS Code.
Not yet measured: answer accuracy on the 50-question set, retrieval hit rate @5, FP16 / INT8 / INT4 benchmark — phase 3. Scope: STM32F4, three documents, self-written question set.
Keyword search sits beside the vector search because a register name is an exact string, and an embedding will happily return something that merely reads like one.
Bare-metal application firmware on an STM32F446RE for a motorised active seatbelt: a four-mode state machine — belt slack reduction, park assist, comfort tension, haptic alert — commanding a sensored-FOC BLDC controller over UART.
A timed 9.5 s tightening profile of linear ramps, with a 12 A motor-current cutoff evaluated on a ~5 ms supervision cycle, bounds restraint force on the occupant and protects the driver stage. Sensored FOC commissioned against an AS5048A magnetic encoder over SPI; raised-cosine haptic waveform with live pull strength from a 12-bit ADC. Stall and mid-profile-release fault paths validated on the bench.
The ramp is the easy part. The dashed line is the requirement: force on an occupant is bounded by a number the supervision cycle can check every 5 ms.
Contact through a steering wheel is intermittent by nature. The filtering is what makes the trace below possible, and everything downstream depends on it.
Real-time ECG acquisition from steering-wheel electrodes, with a MAX30001 analog front end configured over SPI.
Butterworth band-pass filtering and preprocessing make intermittent contact signals usable; R–R intervals, detected with NeuroKit2 and WFDB, give beats per minute. UTC-synchronised logging and live visualisation over serial, with ECG waveforms collected across driving conditions.
A simulated FMCW radar chain in MATLAB: 1-D FFT range detection, 2-D FFT range–Doppler estimation, and 2-D CFAR thresholding with configurable training cells, guard cells and offset.
Alongside it, an open-source computer-vision driver-monitoring pipeline — drowsiness, distraction, phone use — deployed on a Raspberry Pi with haptic and buzzer alert output.
The threshold is estimated from the training cells, the guard ring keeps the target's own energy out of that estimate, and the offset decides everything.
Read it top to bottom, the way a signal travels from the application down to the pin.
Bold entries are where I have shipped production work. The rest I have worked in and can be useful in from day one.
C · C++ · Python · Embedded C · MATLAB
Algorithms & data structures · embedded software architecture · bare-metal / super-loop design · state machines
STM32F446RE (ARM Cortex-M4, ARMv7-M) · ESP32 · Raspberry Pi · VESC · Arduino
1-D / 2-D FFT · CFAR thresholding · Butterworth band-pass filtering · embedded closed-loop control · PID · FOC · SVPWM · system identification
SPI · UART · LIN · CAN · I²C · ADC / DAC · MAX30001 ECG AFE · AS5048A magnetic encoder
ISO 26262 fundamentals · V-model development lifecycle
STM32CubeIDE (Eclipse) · VESC Tool · Vector CANoe · Git · PuTTY · Python (NumPy, SciPy, Matplotlib)
Retrieval-augmented generation · hybrid retrieval (vector + BM25) · embeddings · INT4-quantised local LLMs · Ollama · ChromaDB · PyMuPDF · Streamlit · MCP tools
Send me the requirement and the constraint you are stuck on. I read datasheets for fun.