Chat

Welcome to Flux

Treat Flux like your intern. Tell it what you'd like to build and it'll get to work. You can also ask it questions, brainstorm ideas, and teach it your preferences. Learn More

Explain project
Write a project description
Find schematic issues
Create a test plan
Simulate a circuit
Prepare for Manufacturing
Component Selection Workflow
New Subsystem Wizard
Write I2C initialization code
Generate firmware skeleton

Refine this doc
Ask about this doc
Firmware Starter — STM32L152 + ESP32 EEG/BCI Board
Platforms
  • U2 STM32L152RET6: STM32 HAL / STM32CubeIDE or PlatformIO; primary ADS1299 acquisition controller.
  • U3 ESP32-WROOM-32E: ESP32 Arduino or ESP-IDF; wireless bridge and microSD logger.
Pin Mapping — STM32L152RET6 U2

Table


FunctionU2 PinNetConnected ToNotes
SPI1_SCKPA5ADS_SPI1_SCLKU1 SCLKADS1299 SPI clock
SPI1_MISOPA6ADS_SPI1_MISOU1 DOUTADS1299 data out
SPI1_MOSIPA7ADS_SPI1_MOSIU1 DINADS1299 command/data in
ADS CSPB6ADS_SPI1_CSU1 ~CSActive low
ADS RESETPC7ADS_RESET_CTRLU1 ~RESETActive low
ADS DRDYPA9ADS_DRDYU1 ~DRDYInterrupt input
SPI2_SCKPB13STM32_ESP_SPI2_SCKU3 IO18STM32 ↔ ESP32 bridge
SPI2_MISOPB14STM32_ESP_SPI2_MISOU3 IO19STM32 ↔ ESP32 bridge
SPI2_MOSIPB15STM32_ESP_SPI2_MOSIU3 IO23STM32 ↔ ESP32 bridge
SPI2_CSPB12STM32_ESP_SPI2_CSU3 IO5STM32 ↔ ESP32 bridge
READYPC8STM32_ESP_READYU3 IO27Interprocessor ready/handshake
SWDIOPA13SWDIOJ1 pin 2SWD programming
SWCLKPA14SWCLKJ1 pin 4SWD programming
NRSTNRSTMCU_NRSTJ1 pin 5, C26Reset
BOOT0BOOT0MCU_BOOT0R6 10k to GNDNormal boot low
Pin Mapping — ESP32-WROOM-32E U3

Table


FunctionESP32 PinNetConnected ToNotes
UART0_RXIO3ESP_UART0_RXU8 TXDUSB-UART programming/debug
UART0_TXIO1ESP_UART0_TXU8 RXDUSB-UART programming/debug
ENENESP_ENPullup, cap, reset button, Q1Reset/program circuit
BOOTIO0ESP_IO0_BOOTPullup, boot button, Q2Bootloader strap
SPI bridge SCKIO18STM32_ESP_SPI2_SCKU2 PB13Separate from microSD VSPI
SPI bridge MISOIO19STM32_ESP_SPI2_MISOU2 PB14Separate from microSD VSPI
SPI bridge MOSIIO23STM32_ESP_SPI2_MOSIU2 PB15Separate from microSD VSPI
SPI bridge CSIO5STM32_ESP_SPI2_CSU2 PB12Separate from microSD VSPI
READYIO27STM32_ESP_READYU2 PC8Handshake
microSD CLKIO14SD_VSPI_CLKJ4 CLKVSPI SD bus
microSD MISOIO12SD_VSPI_MISO_IO12_STRAPJ4 DAT0, 10k pulldownBoot strap; held low at boot
microSD MOSIIO13SD_VSPI_MOSIJ4 CMDVSPI SD bus
microSD CSIO15SD_VSPI_CSJ4 DAT3/CD, 10k pullupVSPI SD bus
STM32 HAL Starter Skeleton

C


#include "main.h"
#include <stdint.h>

SPI_HandleTypeDef hspi1; // ADS1299
SPI_HandleTypeDef hspi2; // ESP32 bridge

#define ADS_CS_GPIO_Port GPIOB
#define ADS_CS_Pin GPIO_PIN_6
#define ADS_RESET_GPIO_Port GPIOC
#define ADS_RESET_Pin GPIO_PIN_7
#define ADS_DRDY_GPIO_Port GPIOA
#define ADS_DRDY_Pin GPIO_PIN_9

static void ADS1299_Select(void) { HAL_GPIO_WritePin(ADS_CS_GPIO_Port, ADS_CS_Pin, GPIO_PIN_RESET); }
static void ADS1299_Deselect(void) { HAL_GPIO_WritePin(ADS_CS_GPIO_Port, ADS_CS_Pin, GPIO_PIN_SET); }

static HAL_StatusTypeDef ADS1299_Command(uint8_t cmd) {
    ADS1299_Select();
    HAL_StatusTypeDef st = HAL_SPI_Transmit(&hspi1, &cmd, 1, 100);
    ADS1299_Deselect();
    return st;
}

int main(void) {
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_SPI1_Init();
    MX_SPI2_Init();

    HAL_GPIO_WritePin(ADS_CS_GPIO_Port, ADS_CS_Pin, GPIO_PIN_SET);
    HAL_GPIO_WritePin(ADS_RESET_GPIO_Port, ADS_RESET_Pin, GPIO_PIN_RESET);
    HAL_Delay(10);
    HAL_GPIO_WritePin(ADS_RESET_GPIO_Port, ADS_RESET_Pin, GPIO_PIN_SET);
    HAL_Delay(100);

    ADS1299_Command(0x11); // SDATAC before register configuration

    while (1) {
        if (HAL_GPIO_ReadPin(ADS_DRDY_GPIO_Port, ADS_DRDY_Pin) == GPIO_PIN_RESET) {
            uint8_t tx[27] = {0};
            uint8_t rx[27] = {0};
            ADS1299_Select();
            HAL_SPI_TransmitReceive(&hspi1, tx, rx, sizeof(rx), 100);
            ADS1299_Deselect();
            HAL_SPI_Transmit(&hspi2, rx, sizeof(rx), 100);
        }
    }
}
ESP32 Arduino Starter Skeleton

Cpp


#include <Arduino.h>
#include <SPI.h>
#include <SD.h>
#include <WiFi.h>

#define STM32_SPI_SCK   18
#define STM32_SPI_MISO  19
#define STM32_SPI_MOSI  23
#define STM32_SPI_CS    5
#define STM32_READY     27

#define SD_CLK          14
#define SD_MISO         12
#define SD_MOSI         13
#define SD_CS           15

SPIClass sdSPI(VSPI);

void setup() {
  Serial.begin(115200);
  pinMode(STM32_READY, INPUT);
  pinMode(STM32_SPI_CS, INPUT_PULLUP);

  sdSPI.begin(SD_CLK, SD_MISO, SD_MOSI, SD_CS);
  if (!SD.begin(SD_CS, sdSPI)) {
    Serial.println("microSD init failed");
  } else {
    Serial.println("microSD ready");
  }

  WiFi.mode(WIFI_STA);
  Serial.println("ESP32 EEG bridge ready");
}

void loop() {
  // TODO: implement STM32 SPI slave/handshake protocol or use an ESP32-supported slave library.
  delay(1000);
}
Bring-up Notes
  • Use SWD header J1 for STM32 programming.
  • Use USB-C/CP2102N and EN/IO0 buttons or auto-reset for ESP32 programming.
  • Confirm IO12 remains low at ESP32 boot because it is both microSD MISO and a boot strap pin.
  • Platforms

  • Pin Mapping — STM32L152RET6 U2

  • Pin Mapping — ESP32-WROOM-32E U3

  • STM32 HAL Starter Skeleton

  • ESP32 Arduino Starter Skeleton

  • Bring-up Notes

Wearable EEG BCI Acquisition Board

Wearable EEG BCI Acquisition Board thumbnail
Wearable 8-channel EEG/BCI acquisition board with ADS1299, STM32L152, ESP32 Wi-Fi/Bluetooth, LiPo charging, USB-UART, microSD logging, and 4-layer mixed-signal layout constraints.

Properties

Wearable

Bluetooth

8-channel EEG/BCI prototype using ADS1299, STM32L152RET6, ESP32-WROOM-32E, LiPo charging, USB-C, microSD, and 55x40mm 4-layer PCB target.

FCC

Battery

Pricing & Availability

Distributor

Qty 1

Arrow

$54.56–$98.79

Digi-Key

$70.28

HQonline

$60.36

LCSC

$80.27–$81.35

Mouser

$124.18

TME

$17.99

Verical

$54.42–$124.58

Controls