Music Synth Controller Design

Worked for 10 mins 15 sec
Thought for 3 sec
1/3 Set compact rounded-rectangle board size and 4-layer stackup
Accessed knowledge for the next task.
Thought for 1 sec
Read layout.
Thought for 7 sec — Considering layout size
Editing board size.
Thought for 2 sec
2/3 Place components by functional block without routing traces

Set compact rounded-rectangle board size and 4-layer stackup

Place components by functional block without routing traces

Review placement for overlaps and airwires-only expected DRC

Accessed knowledge for the next task.
Thought for 9 sec
Baking PCB layout data.
Running placement agent.
Thought for 3 sec
Placing components.
Thought for 2 mins 28 sec — Considering tool usage
Placing components.
Thought for 1 min 24 sec — Evaluating LED arrangement
Placing components.
Thought for 39 sec
Placing components.
Thought for 33 sec — Fixing overlaps in layout
Placing components.
Thought for 14 sec — Adjusting layout overlaps
Placing components.
Thought for 8 sec
Placing components.
Thought for 9 sec
Placing components.
Thought for 1 min 5 sec — Evaluating J2 rotation and positioning
Placing components.
Thought for 44 sec
Placing components.
Thought for 16 sec — Checking for overlaps
Placing components.
Thought for 17 sec — Adjusting component placements
Placing components.
Thought for 12 sec — Reviewing net grouping issue
Component placement complete.
Applying placement changes.
it's okay for board to be double sided by the way
Understood — I’ll allow bottom-side placement for small passives if it improves spacing, while keeping knobs, LEDs, buttons, USB-C, audio jack, MCU, codec, and PSRAM on top for usability and assembly clarity.
Done — the board is now a compact 100 × 75 mm rounded rectangle with a 4-layer stackup.
Components are arranged logically without routing traces: pots in a neat row, LEDs in order below them, two buttons below/near the LED row, USB-C on the left edge, audio jack on the right edge, MCU/PSRAM central, codec near audio, and power near USB. I allowed small resistors/capacitors on the bottom side while keeping all user-facing parts and major ICs on top; placement checks are clean, and the remaining review items are expected unrouted airwires only.
Run focused DRC
Route critical nets
Add mechanical features
Export placement report
J1
R21 P2 - J2 TIP
L1 P2 - C22 P1
U2 VCC - C15 P1
U1 VCAP_1 - C9 P1
R7 P2 - LED7 A
J1 CC2 - R10 P1
U1 PD12 - U3 SO/SIO(1)
U1 VREF+ - U1 VBAT
R22 P2 - J2 RING
U1 VREF+ - U1 VBAT
U1 PB12 - SW1 1
U1 PB12 - SW1 1
U1 PD3 - U2 RST
R23 P2 - U1 PC0
R24 P2 - U1 PC1
U1 PE12 - R6 P1
U2 VR+OUT - R22 P1
U1 PE4 - U2 LRCK1
R7 P2 - LED7 A
U1 PE12 - R6 P1
L1 P2 - C22 P1
U1 VREF+ - U1 VBAT
U1 PE6 - U2 DIN
R4 P2 - LED4 ANODE_A
R3 P2 - LED3 A
U1 PB10 - U3 ~CE
RV2 WIPER - R24 P1
U1 PE4 - U2 LRCK1
U1 VREF+ - U1 VBAT
U1 VREF+ - U1 VBAT
U1 PB10 - U3 ~CE
U1 PE13 - R7 P1
U1 VREF+ - U1 VBAT
U1 VREF+ - U1 VBAT
U1 VCAP_2 - C10 P1
U1 PE5 - U2 BCK1
U1 PE6 - U2 DIN
U4 FB - R17 P2
U1 BOOT0 - R11 P1
U1 VREF+ - U1 VBAT
L1 P2 - C22 P1
U1 PE11 - R5 P1
U1 PE11 - R5 P1
J1 CC1 - R9 P1
RV3 WIPER - R25 P1
U2 VCC - C15 P1
U1 PE7 - R1 P1
U1 PB13 - SW2 1
U1 VCAP_2 - C10 P1
U2 VCC - C15 P1
U4 FB - R17 P2
U1 PA8 - U2 SCKI1
L1 P2 - C22 P1
U2 VCOM - C17 P1
U1 PE3 - U2 DOUT
U2 MODE - R16 P1
R2 P2 - LED2 A
U1 PA8 - U2 SCKI1
U2 VR+OUT - R22 P1
J1 DN1 - J1 DN2
U1 VREF+ - U1 VBAT
R8 P2 - LED8 A
R21 P2 - J2 TIP
R4 P2 - LED4 ANODE_A
R3 P2 - LED3 A
U1 VREF+ - U1 VBAT
U1 PB13 - SW2 1
J1 DP2 - R19 P1
U1 PD13 - U3 SIO(3)
U1 PE8 - R2 P1
R22 P2 - J2 RING
U2 VCOM - C17 P1
U1 PD11 - U3 SI/SIO(0)
U1 NRST - R12 P2
U1 VREF+ - U1 VBAT
R1 P2 - LED1 A
L1 P2 - C22 P1
J1 CC1 - R9 P1
R25 P2 - U1 PA0
U1 VREF+ - U1 VBAT
U1 PD13 - U3 SIO(3)
J1 DP2 - R19 P1
R23 P2 - U1 PC0
R5 P2 - LED5 ANODE_A
U1 PE5 - U2 BCK1
U1 VREF+ - U1 VBAT
U1 PB13 - SW2 1
R2 P2 - LED2 A
R19 P2 - U1 PA12
U1 PD11 - U3 SI/SIO(0)
U2 VL+OUT - R21 P1
U1 PE7 - R1 P1
U1 VREF+ - U1 VBAT
U1 PE2 - U3 SIO(2)
U1 PE8 - R2 P1
U1 VCAP_1 - C9 P1
U1 PB2 - U3 SCLK
U1 NRST - R12 P2
U1 VREF+ - U1 VBAT
U2 MODE - R16 P1
U1 PE14 - R8 P1
U1 PE10 - R4 P1
U1 PD3 - U2 RST
U2 VCC - C15 P1
RV1 WIPER - R23 P1
L1 P2 - C22 P1
U2 VL+OUT - R21 P1
U1 PB12 - SW1 1
J1 DN1 - J1 DN2
U1 PE3 - U2 DOUT
R6 P2 - LED6 A
U1 BOOT0 - R11 P1
R20 P2 - U1 PA11
U1 PE13 - R7 P1
R8 P2 - LED8 A
U4 INH - C21 P1
RV2 WIPER - R24 P1
U1 NRST - R12 P2
R1 P2 - LED1 A
J1 DN1 - J1 DN2
R24 P2 - U1 PC1
R20 P2 - U1 PA11
RV3 WIPER - R25 P1
U2 VCC - C15 P1
R23 P2 - U1 PC0
R6 P2 - LED6 A
U4 SW - L1 P1
U1 PE10 - R4 P1
U1 VREF+ - U1 VBAT
U1 PD12 - U3 SO/SIO(1)
R24 P2 - U1 PC1
U1 VREF+ - U1 VBAT
R25 P2 - U1 PA0
U1 VREF+ - U1 VBAT
U1 PE14 - R8 P1
U4 FB - R17 P2
U1 PB2 - U3 SCLK
U4 SW - L1 P1
U1 VREF+ - U1 VBAT
U4 INH - C21 P1
RV1 WIPER - R23 P1
J1 CC2 - R10 P1
U1 VREF+ - U1 VBAT
R19 P2 - U1 PA12
L1 P2 - C22 P1
U1 PE9 - R3 P1
U1 VREF+ - U1 VBAT
U1 PE5 - U2 BCK1
L1 P2 - C22 P1
U1 PE9 - R3 P1
U1 VREF+ - U1 VBAT
U1 PB10 - U3 ~CE
R25 P2 - U1 PA0
R5 P2 - LED5 ANODE_A
U1 PE2 - U3 SIO(2)
L1 P2 - C22 P1
R24 P2 - U1 PC1
U4
Not Recommended for New Designs
LED4
R5
Resistance
680 Ω
R3
Resistance
680 Ω
R11
Resistance
10000 Ω
R7
Resistance
680 Ω
LED5
R9
Resistance
5100 Ω
R17
Resistance
31600 Ω
R23
Resistance
1000 Ω
R21
Resistance
1000 Ω
R18
Resistance
10000 Ω
R14
Resistance
47000 Ω
R24
Resistance
1000 Ω
R8
Resistance
680 Ω
R1
Resistance
680 Ω
R15
Resistance
47000 Ω
R22
Resistance
1000 Ω
R10
Resistance
5100 Ω
R13
Resistance
47000 Ω
R25
Resistance
1000 Ω
R12
Resistance
10000 Ω
R16
Resistance
220000 Ω
R4
Resistance
680 Ω
R2
Resistance
680 Ω
R19
Resistance
22 Ω
R20
Resistance
22 Ω
R6
Resistance
680 Ω
U2 SGND - U3 VSS
U2 SGND - U3 VSS
GND
U2 SGND - U3 VSS
U2 SGND - U3 VSS
U2 SGND - U3 VSS
C18 P2 - C19 P2
U4 PADGND - U4 SYNC
U2 SGND - U3 VSS
U2 SGND - U3 VSS
U2 SGND - U3 VSS
J1 SHIELD - J1 SHIELD
U2 SGND - U3 VSS
C12 P2 - R11 P2
J1 SHIELD - J1 SHIELD
U4 PADGND - U4 SYNC
U2 SGND - U3 VSS
GND
C15 P2 - C16 P2
LED1 K - LED2 K
C12 P2 - R11 P2
LED5 CATHODE_A - LED6 K
U4 PADGND - U4 SYNC
C15 P2 - C16 P2
C18 P2 - C19 P2
C18 P2 - C19 P2
U4 PADGND - U4 SYNC
U2 SGND - U3 VSS
U2 SGND - U3 VSS
U2 SGND - U3 VSS
U4 PADGND - U4 SYNC
U2 SGND - U3 VSS
U4 PADGND - U4 SYNC
GND
U2 SGND - U3 VSS
SW1 2 - SW2 2
J1 SHIELD - J2 SLEEVE
U2 SGND - U3 VSS
U4 PADGND - U4 SYNC
U4 PADGND - U4 SYNC
U4 PADGND - U4 SYNC
C12 P2 - R11 P2
J1 SHIELD - J2 SLEEVE
U4 PADGND - U4 SYNC
U4 PADGND - U4 SYNC
C15 P2 - C16 P2
U2 SGND - U3 VSS
U2 SGND - U3 VSS
U2 MD/SDA/DEMP - U2 #MS/ADR/IFMD
LED1 K - LED2 K
SW1 2 - SW2 2
LED5 CATHODE_A - LED6 K
J1 SHIELD - J2 SLEEVE
LED1 K - LED2 K
U2 MD/SDA/DEMP - U2 #MS/ADR/IFMD
C15 P2 - C16 P2
U4 PADGND - U4 SYNC
J1 SHIELD - J2 SLEEVE
C12 P2 - R11 P2
U2 SGND - U3 VSS
LED5 CATHODE_A - LED6 K
U4 PADGND - U4 SYNC
U1
C2
Capacitance
100e-9 F
C20
Capacitance
100e-9 F
C11
Capacitance
100e-9 F
C22
Capacitance
22e-6 F
C3
Capacitance
100e-9 F
C14
Capacitance
100e-9 F
C7
Capacitance
100e-9 F
LED3
C6
Capacitance
10e-6 F
C15
Capacitance
100e-9 F
LED1
C17
Capacitance
100e-9 F
C19
Capacitance
100e-9 F
C18
Capacitance
100e-9 F
Hole3
C10
Capacitance
2.2e-6 F
C5
Capacitance
100e-9 F
SW2
U3
C4
Capacitance
100e-9 F
LED2
C21
Capacitance
22e-6 F
LED6
C13
Capacitance
100e-9 F
J2
LED7
C12
Capacitance
100e-9 F
LED8
SW1
C8
Capacitance
100e-9 F
C16
Capacitance
100e-9 F
Hole2
U2
Hole1
MH1
C1
Capacitance
100e-9 F
C9
Capacitance
2.2e-6 F
RV2
Resistance
10kΩ
L1
Inductance
4.7e-6 H
RV3
Resistance
10kΩ
RV1
Resistance
10kΩ

Refine this doc
Ask about this doc
Firmware Starter — STM32H750VBT6 Synth Controller
Platform and Toolchain
  • MCU: STM32H750VBT6, ARM Cortex-M7
  • Framework: STM32 HAL
  • Build system: STM32CubeIDE or PlatformIO with STM32 HAL
  • Audio target: 48 kHz, 24-bit I2S-style serial audio to PCM3060
Pin Mapping

Table


FunctionSTM32 pinDirectionNotes
QSPI NCSPB10AF outputAPS6404L CE#
QSPI CLKPB2AF outputAPS6404L SCLK
QSPI IO0PD11AF bidirAPS6404L SI/SIO0
QSPI IO1PD12AF bidirAPS6404L SO/SIO1
QSPI IO2PE2AF bidirAPS6404L SIO2
QSPI IO3PD13AF bidirAPS6404L SIO3
Audio MCLKPA8AF outputPCM3060 SCKI1/SCKI2
Audio BCLKPE5AF outputPCM3060 BCK1/BCK2
Audio LRCLKPE4AF outputPCM3060 LRCK1/LRCK2
Audio DAC DINPE6AF outputPCM3060 DIN
Audio ADC DOUTPE3AF inputPCM3060 DOUT
Codec resetPD3GPIO outputActive-low reset
Pot 1 ADCPC0ADC input1 kΩ + 100 nF filter
Pot 2 ADCPC1ADC input1 kΩ + 100 nF filter
Pot 3 ADCPA0ADC input1 kΩ + 100 nF filter
Button 1PB12GPIO inputExternal pull-up, active-low
Button 2PB13GPIO inputExternal pull-up, active-low
LEDs greenPE7, PE8, PE9GPIO outputActive-high through 680 Ω
LEDs yellowPE10, PE11GPIO outputActive-high through 680 Ω
LEDs redPE12, PE13, PE14GPIO outputActive-high through 680 Ω
USB FS D-PA11AFUSB connector through 22 Ω
USB FS D+PA12AFUSB connector through 22 Ω
Complete Starter Source

C


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

ADC_HandleTypeDef hadc1;
SAI_HandleTypeDef hsai_BlockA1;
QSPI_HandleTypeDef hqspi;

#define LED_G1_Pin GPIO_PIN_7
#define LED_G2_Pin GPIO_PIN_8
#define LED_G3_Pin GPIO_PIN_9
#define LED_Y1_Pin GPIO_PIN_10
#define LED_Y2_Pin GPIO_PIN_11
#define LED_R1_Pin GPIO_PIN_12
#define LED_R2_Pin GPIO_PIN_13
#define LED_R3_Pin GPIO_PIN_14
#define LED_GPIO_Port GPIOE
#define BTN1_Pin GPIO_PIN_12
#define BTN2_Pin GPIO_PIN_13
#define BTN_GPIO_Port GPIOB
#define CODEC_RST_Pin GPIO_PIN_3
#define CODEC_RST_Port GPIOD

static void MX_GPIO_Init(void) {
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOB_CLK_ENABLE();
    __HAL_RCC_GPIOC_CLK_ENABLE();
    __HAL_RCC_GPIOD_CLK_ENABLE();
    __HAL_RCC_GPIOE_CLK_ENABLE();

    HAL_GPIO_WritePin(CODEC_RST_Port, CODEC_RST_Pin, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(LED_GPIO_Port, LED_G1_Pin|LED_G2_Pin|LED_G3_Pin|LED_Y1_Pin|LED_Y2_Pin|LED_R1_Pin|LED_R2_Pin|LED_R3_Pin, GPIO_PIN_RESET);

    GPIO_InitStruct.Pin = LED_G1_Pin|LED_G2_Pin|LED_G3_Pin|LED_Y1_Pin|LED_Y2_Pin|LED_R1_Pin|LED_R2_Pin|LED_R3_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(LED_GPIO_Port, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = BTN1_Pin|BTN2_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_NOPULL; // external pull-ups are fitted
    HAL_GPIO_Init(BTN_GPIO_Port, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = CODEC_RST_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(CODEC_RST_Port, &GPIO_InitStruct);
}

static void codec_reset_release(void) {
    HAL_GPIO_WritePin(CODEC_RST_Port, CODEC_RST_Pin, GPIO_PIN_RESET);
    HAL_Delay(10);
    HAL_GPIO_WritePin(CODEC_RST_Port, CODEC_RST_Pin, GPIO_PIN_SET);
    HAL_Delay(10);
}

uint16_t read_adc_channel(uint32_t channel) {
    ADC_ChannelConfTypeDef sConfig = {0};
    sConfig.Channel = channel;
    sConfig.Rank = ADC_REGULAR_RANK_1;
    sConfig.SamplingTime = ADC_SAMPLETIME_64CYCLES_5;
    HAL_ADC_ConfigChannel(&hadc1, &sConfig);
    HAL_ADC_Start(&hadc1);
    HAL_ADC_PollForConversion(&hadc1, 10);
    uint16_t value = (uint16_t)HAL_ADC_GetValue(&hadc1);
    HAL_ADC_Stop(&hadc1);
    return value;
}

void update_leds(uint16_t pot1, uint16_t pot2, uint16_t pot3) {
    HAL_GPIO_WritePin(LED_GPIO_Port, LED_G1_Pin, pot1 > 512 ? GPIO_PIN_SET : GPIO_PIN_RESET);
    HAL_GPIO_WritePin(LED_GPIO_Port, LED_G2_Pin, pot1 > 2048 ? GPIO_PIN_SET : GPIO_PIN_RESET);
    HAL_GPIO_WritePin(LED_GPIO_Port, LED_G3_Pin, pot1 > 3584 ? GPIO_PIN_SET : GPIO_PIN_RESET);
    HAL_GPIO_WritePin(LED_GPIO_Port, LED_Y1_Pin, pot2 > 1024 ? GPIO_PIN_SET : GPIO_PIN_RESET);
    HAL_GPIO_WritePin(LED_GPIO_Port, LED_Y2_Pin, pot2 > 3072 ? GPIO_PIN_SET : GPIO_PIN_RESET);
    HAL_GPIO_WritePin(LED_GPIO_Port, LED_R1_Pin, pot3 > 1024 ? GPIO_PIN_SET : GPIO_PIN_RESET);
    HAL_GPIO_WritePin(LED_GPIO_Port, LED_R2_Pin, pot3 > 2048 ? GPIO_PIN_SET : GPIO_PIN_RESET);
    HAL_GPIO_WritePin(LED_GPIO_Port, LED_R3_Pin, pot3 > 3072 ? GPIO_PIN_SET : GPIO_PIN_RESET);
}

int main(void) {
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_ADC1_Init();
    MX_QUADSPI_Init();
    MX_SAI1_Init();
    codec_reset_release();

    while (1) {
        uint16_t pot1 = read_adc_channel(ADC_CHANNEL_10); // PC0
        uint16_t pot2 = read_adc_channel(ADC_CHANNEL_11); // PC1
        uint16_t pot3 = read_adc_channel(ADC_CHANNEL_16); // PA0
        update_leds(pot1, pot2, pot3);

        GPIO_PinState b1 = HAL_GPIO_ReadPin(BTN_GPIO_Port, BTN1_Pin);
        GPIO_PinState b2 = HAL_GPIO_ReadPin(BTN_GPIO_Port, BTN2_Pin);
        (void)b1;
        (void)b2;
        HAL_Delay(5);
    }
}
Bring-Up Notes
  • Configure PLLs so PA8 MCO/audio clock can provide the PCM3060 system clock family (for example 12.288 MHz for 48 kHz audio).
  • Configure PCM3060 in hardware mode: I2S format, de-emphasis off, slave mode, single-ended DAC output.
  • Configure QSPI for APS6404L command set; enter Quad mode using command 0x35 before high-bandwidth transfers.
  • Use USB DFU or SWD for programming depending on bootloader/debug setup.
  • Platform and Toolchain

  • Pin Mapping

  • Complete Starter Source

  • Bring-Up Notes

STM32 PSRAM Audio Synth Controller thumbnail
Compact ARM Cortex STM32 music synth controller modeled after Daisy Seed, with external PSRAM, PCM3060 audio codec, three potentiometers, eight LEDs with resistors, two buttons, audio jack, rounded-rectangle PCB, mounting holes, and row-aligned controls.

Properties

Properties describe core aspects of the project.

Pricing & Availability

Distributor

Qty 1

Arrow

$11.79–$12.30

Digi-Key

$23.39–$25.00

HQonline

$6.39

LCSC

$27.94–$30.51

Mouser

$31.60

TME

$8.57

Verical

$10.11–$19.08

Controls