Sancia Fernandes

Embedded Software Engineerwith AI

2023 — 2026

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.

CS SCK MOSI MISO t₁ · rotor angle latched AS5048A · 0x3FFF — read angle register

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.

Sancia Fernandes at the bench

Contents

  1. 1.STM32 assistant, offline RAGOngoing · local INT4 model · ST reference manuals with page citations
  2. 2.Active seatbelt motor controlBare-metal STM32F446RE · sensored FOC · four-mode state machine
  3. 3.Vitals health monitoringSteering-wheel ECG · MAX30001 · band-pass filtering, R–R to BPM
  4. 4.FMCW radar & driver monitoring1-D and 2-D FFT · 2-D CFAR · vision pipeline on Raspberry Pi
  5. 5.Skills, toolchain & benchFull skill index by type · what I build, debug, and test with
SWDIO / SWCLK encoder STM32F446RE every project on this page started here
01

STM32 assistant, offline RAG

ongoing · phase 1 of 6Python 3.12OllamaQwen2.5-Coder 7B INT4ChromaDB + BM25PyMuPDF

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.

4 073clean page records from 4 174 pages
~4 sfull document pipeline
~20 tok/sINT4 on a 6 GB laptop GPU

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.

indexed once ST PDFs extract · clean chunks embeddings · index retrieved context question vector + BM25 local LLM answer + doc/page no network anywhere in this path deterministic facts — bus, pins, clocks — come from CMSIS headers and the .ioc file, never from the model

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.

02

Active seatbelt motor control

STM32F446REEmbedded Cbare metalFOC · VESCSPI · UART · ADC

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.

9.5 stimed tightening profile
12 Amotor-current cutoff
~5 mssupervision cycle
12 A4 A0 slack take-upholdrelease cutoff — supervision trips and exits the mode 9.5 s

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.

03

Vitals health monitoring

MAX30001SPIPythonSciPyNeuroKit2 · WFDB
raw · steering-wheel electrodes, hands moving band-pass filtered · R peaks marked R–R R–R → BPM

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.

TBDECG sample rate, Hz
TBDband-pass corners, Hz
TBDhours of waveform recorded
04

FMCW radar & driver monitoring

MATLAB1-D / 2-D FFT2-D CFAROpenCVRaspberry Pi

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.

TBDrange resolution, m
TBDCFAR offset, dB, at chosen false-alarm rate
3driver states flagged on-device
chirp · ADC 1-D FFT · range 2-D FFT · r–D 2-D CFAR range–Doppler map, one CFAR window cell under test guard cells training cells doppler →

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.

What I work with

Read it top to bottom, the way a signal travels from the application down to the pin.

Toolinglocal AI, built for this work Python 3.12retrieval-augmented generationhybrid retrieval, vector + BM25embeddingsquantised local LLMs, INT4OllamaChromaDBPyMuPDFStreamlitMCP tools
Applicationproduct logic Embedded CC11C++state machinesPythonMATLABalgorithms & data structures
Signal & controlthe maths on the target sensored FOCButterworth band-passPIDSVPWM1-D / 2-D FFTCFAR thresholdingsystem identification
Runtimetiming and supervision bare-metal super-loopfixed-cycle supervisiontimed ramp profilesfault detection and exit paths
Driversperipheral access SPIUARTADC / DACLINCANI²CMAX30001 ECG AFEAS5048A encoder
Processsafety and lifecycle LIN / CAN network validationISO 26262 fundamentalsV-model development lifecyclebench and integration testing
Silicontargets STM32F446RE · Cortex-M4, ARMv7-MESP32Raspberry PiVESCArduino

Bold entries are where I have shipped production work. The rest I have worked in and can be useful in from day one.

Skills, by type

Programming languages

C · C++ · Python · Embedded C · MATLAB

Computer science

Algorithms & data structures · embedded software architecture · bare-metal / super-loop design · state machines

Embedded platforms

STM32F446RE (ARM Cortex-M4, ARMv7-M) · ESP32 · Raspberry Pi · VESC · Arduino

Signal processing & control

1-D / 2-D FFT · CFAR thresholding · Butterworth band-pass filtering · embedded closed-loop control · PID · FOC · SVPWM · system identification

Interfaces & sensors

SPI · UART · LIN · CAN · I²C · ADC / DAC · MAX30001 ECG AFE · AS5048A magnetic encoder

Functional safety

ISO 26262 fundamentals · V-model development lifecycle

Tools & debugging

STM32CubeIDE (Eclipse) · VESC Tool · Vector CANoe · Git · PuTTY · Python (NumPy, SciPy, Matplotlib)

AI & local tooling

Retrieval-augmented generation · hybrid retrieval (vector + BM25) · embeddings · INT4-quantised local LLMs · Ollama · ChromaDB · PyMuPDF · Streamlit · MCP tools

On the bench

  • Vector CANoe — LIN and CAN network validation
  • VESC Tool — FOC commissioning, live motor telemetry
  • SWD via STM32CubeIDE — stepping, live watch
  • PuTTY over serial — protocol bring-up, logging
  • Motor and encoder rig — stall and release fault injection

Build and verify

  • STM32CubeIDE — Eclipse toolchain, bare-metal builds
  • Git — branching, review, history that reads
  • NumPy and SciPy — filter design, offline analysis
  • Matplotlib — waveform and profile plots
  • NeuroKit2 and WFDB — R-peak detection, reference datasets
  • Ollama and ChromaDB — local quantised models, offline retrieval

Have a board that needs firmware?

Send me the requirement and the constraint you are stuck on. I read datasheets for fun.