From 7b0bd005adc7d2afaccbae5b630cb7ebcfd1b725 Mon Sep 17 00:00:00 2001 From: Ray Morris Date: Wed, 25 Feb 2026 21:18:11 -0600 Subject: [PATCH 1/2] New target: FRSKYF405 FrSky F405 flight controller based on STM32F405RGT6. Hardware: IIM-42688P gyro (SPI1), AT7456E OSD (SPI2), SD card (SPI3), SPL06 barometer (I2C1), 9 motor outputs, hardware SBUS inverter on UART2, LED strip on PA15. S7/S8 use TIM12 (PWM only, no DShot). --- src/main/target/FRSKYF405/CMakeLists.txt | 1 + src/main/target/FRSKYF405/config.c | 32 ++++ src/main/target/FRSKYF405/target.c | 70 ++++++++ src/main/target/FRSKYF405/target.h | 210 +++++++++++++++++++++++ 4 files changed, 313 insertions(+) create mode 100644 src/main/target/FRSKYF405/CMakeLists.txt create mode 100644 src/main/target/FRSKYF405/config.c create mode 100644 src/main/target/FRSKYF405/target.c create mode 100644 src/main/target/FRSKYF405/target.h diff --git a/src/main/target/FRSKYF405/CMakeLists.txt b/src/main/target/FRSKYF405/CMakeLists.txt new file mode 100644 index 00000000000..fc8eb478bcc --- /dev/null +++ b/src/main/target/FRSKYF405/CMakeLists.txt @@ -0,0 +1 @@ +target_stm32f405xg(FRSKYF405) diff --git a/src/main/target/FRSKYF405/config.c b/src/main/target/FRSKYF405/config.c new file mode 100644 index 00000000000..0aed59803e0 --- /dev/null +++ b/src/main/target/FRSKYF405/config.c @@ -0,0 +1,32 @@ +/* + * This file is part of INAV. + * + * INAV is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * INAV is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with INAV. If not, see . + */ + +#include +#include + +#include + +#include "rx/rx.h" +#include "fc/config.h" + +void targetConfiguration(void) +{ + // SBUS is received via a hardware inverter (2N7002E MOSFET, Q1). + // The signal arrives at UART2 RX already de-inverted (active high), + // so the UART must NOT apply additional software inversion. + rxConfigMutable()->serialrx_inverted = 1; +} diff --git a/src/main/target/FRSKYF405/target.c b/src/main/target/FRSKYF405/target.c new file mode 100644 index 00000000000..89f3ee73a0e --- /dev/null +++ b/src/main/target/FRSKYF405/target.c @@ -0,0 +1,70 @@ +/* + * This file is part of INAV. + * + * INAV is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * INAV is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with INAV. If not, see . + */ + +#include + +#include "platform.h" +#include "drivers/io.h" +#include "drivers/pwm_mapping.h" +#include "drivers/timer.h" + +/* + * Timer Allocation for FrSky F405 + * + * Connector mapping from schematic (CONN.SchDoc): + * - CON1 (S1): T4_2 = TIM4_CH2 = PB7 + * - CON2 (S2): T4_1 = TIM4_CH1 = PB6 + * - CON3 (S3): T3_3 = TIM3_CH3 = PB0 + * - CON4 (S4): T3_4 = TIM3_CH4 = PB1 + * - CON5 (S5): T8_3 = TIM8_CH3 = PC8 + * - CON6 (S6): T8_4 = TIM8_CH4 = PC9 + * - CON7 (S7): T12_1 = TIM12_CH1 = PB14 (no DMA - no DShot) + * - CON8 (S8): T12_2 = TIM12_CH2 = PB15 (no DMA - no DShot) + * - CON9 (S9): T1_1 = TIM1_CH1 = PA8 + * - CON23 (LED): T2_1 = TIM2_CH1 = PA15 + */ + +timerHardware_t timerHardware[] = { + // Motor outputs S1-S9 (in physical connector order from schematic) + DEF_TIM(TIM4, CH2, PB7, TIM_USE_OUTPUT_AUTO, 0, 0), // S1 (CON1) - Motor 1 + DEF_TIM(TIM4, CH1, PB6, TIM_USE_OUTPUT_AUTO, 0, 0), // S2 (CON2) - Motor 2 + DEF_TIM(TIM3, CH3, PB0, TIM_USE_OUTPUT_AUTO, 0, 0), // S3 (CON3) - Motor 3 + DEF_TIM(TIM3, CH4, PB1, TIM_USE_OUTPUT_AUTO, 0, 0), // S4 (CON4) - Motor 4 + DEF_TIM(TIM8, CH3, PC8, TIM_USE_OUTPUT_AUTO, 0, 1), // S5 (CON5) - Motor 5 UP(2,1) + DEF_TIM(TIM8, CH4, PC9, TIM_USE_OUTPUT_AUTO, 0, 0), // S6 (CON6) - Motor 6 + DEF_TIM(TIM12, CH1, PB14, TIM_USE_OUTPUT_AUTO, 0, 0), // S7 (CON7) - Motor 7 NOTE: TIM12 has no DMA - DShot not supported + DEF_TIM(TIM12, CH2, PB15, TIM_USE_OUTPUT_AUTO, 0, 0), // S8 (CON8) - Motor 8 NOTE: TIM12 has no DMA - DShot not supported + DEF_TIM(TIM1, CH1, PA8, TIM_USE_OUTPUT_AUTO, 0, 0), // S9 (CON9) - Motor 9 UP(2,5) + + // LED Strip on CON23 - PA15 (T2_1 signal on schematic) + DEF_TIM(TIM2, CH1, PA15, TIM_USE_LED, 0, 0), // LED strip (CON23) +}; + +const int timerHardwareCount = sizeof(timerHardware) / sizeof(timerHardware[0]); + +/* + * IMPLEMENTATION NOTES: + * + * 1. S1/S2 order matches physical board labels (CON1=S1, CON2=S2 from schematic) + * + * 2. TIM12 (S7, S8): No DMA support on STM32F405. + * Works: Standard PWM, OneShot125, OneShot42, MultiShot + * Does NOT work: DShot (all variants), ProShot + * Use S7/S8 for non-DShot ESCs or servos + * + * 3. LED strip output: PA15 (T2_1) on CON23 with TIM2_CH1 + */ diff --git a/src/main/target/FRSKYF405/target.h b/src/main/target/FRSKYF405/target.h new file mode 100644 index 00000000000..e3eafdb51da --- /dev/null +++ b/src/main/target/FRSKYF405/target.h @@ -0,0 +1,210 @@ +/* + * This file is part of INAV. + * + * INAV is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * INAV is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with INAV. If not, see . + */ + +#pragma once + +#define TARGET_BOARD_IDENTIFIER "FRF4" + +#define USBD_PRODUCT_STRING "FrSkyF405" + +// *************** LED & BEEPER ********************** +// Status LEDs share SWD debug pins - only available in release builds +// In debug builds, these pins must remain in SWD mode for debugging +// Red LED is likely a power indicator (always-on, no GPIO control) +#ifndef DEBUG_BUILD + #define LED0 PA14 // Blue LED (shares SWCLK) via R34 1K + #define LED1 PA13 // Green LED (shares SWDIO) via R35 1K +#endif +// Red LED appears to be power indicator (connected to VCC, not GPIO) + +#define BEEPER PC15 +#define BEEPER_INVERTED // INAV beeper driver writes !onoff; BEEPER_INVERTED makes it write HIGH to activate the N-channel MOSFET (Q2) + +// *************** Gyro & ACC ********************** +#define USE_SPI +#define USE_SPI_DEVICE_1 + +#define SPI1_SCK_PIN PA5 +#define SPI1_MISO_PIN PA6 +#define SPI1_MOSI_PIN PA7 + +// IIM-42688P Gyro on SPI1 +#define USE_IMU_ICM42605 // IIM-42688P is compatible with ICM42605 driver +#define ICM42605_CS_PIN PA4 +#define ICM42605_SPI_BUS BUS_SPI1 +#define IMU_ICM42605_ALIGN CW0_DEG // TODO: Verify orientation from board layout + + +// *************** OSD ***************************** +#define USE_SPI_DEVICE_2 +#define SPI2_SCK_PIN PB13 +#define SPI2_MISO_PIN PC2 +#define SPI2_MOSI_PIN PC3 + +// AT7456E OSD on SPI2 +#define USE_MAX7456 +#define MAX7456_SPI_BUS BUS_SPI2 +#define MAX7456_CS_PIN PB12 + +// *************** SD Card ************************* +#define USE_SPI_DEVICE_3 +#define SPI3_SCK_PIN PC10 +#define SPI3_MISO_PIN PC11 +#define SPI3_MOSI_PIN PC12 + +// SD Card on SPI3 +// NOTE: PC14 used for CS (Chip Select) - OSC32_IN pin used as GPIO for slow CS signal +#define USE_SDCARD +#define USE_SDCARD_SPI +#define SDCARD_SPI_BUS BUS_SPI3 +#define SDCARD_CS_PIN PC14 + +#define ENABLE_BLACKBOX_LOGGING_ON_SDCARD_BY_DEFAULT + +// *************** UART ***************************** +#define USE_VCP +// Note: USB VBUS sensing not clearly defined in schematic + +#define USE_UART1 +#define UART1_TX_PIN PA9 +#define UART1_RX_PIN PA10 + +#define USE_UART2 +#define UART2_TX_PIN PA2 +#define UART2_RX_PIN PA3 + +// USART2 has SBUS inverter circuit +#define SERIALRX_UART SERIAL_PORT_USART2 +#define SERIALRX_PROVIDER SERIALRX_SBUS +#define DEFAULT_RX_TYPE RX_TYPE_SERIAL + +// UART3 conflicts with I2C2 (shares PB10/PB11) +// User must choose: enable UART3 OR I2C2, not both +#define USE_UART3 +#define UART3_TX_PIN PB10 // Conflicts with I2C2_SCL +#define UART3_RX_PIN PB11 // Conflicts with I2C2_SDA + +#define USE_UART4 +#define UART4_TX_PIN PA0 +#define UART4_RX_PIN PC5 // Shared with RSSI_ADC + +// UART5 TX conflicts with SPI3_MOSI (PC12) +// User must choose: enable UART5 OR SD card, not both +#define USE_UART5 +#define UART5_TX_PIN PC12 // Conflicts with SPI3_MOSI +#define UART5_RX_PIN PD2 + +#define USE_UART6 +#define UART6_TX_PIN PC6 +#define UART6_RX_PIN PC7 + +#define SERIAL_PORT_COUNT 7 // VCP + UART1-6 + +// *************** I2C **************************** +#define USE_I2C + +// I2C1 for barometer (SPL06) +#define USE_I2C_DEVICE_1 +#define I2C1_SCL PB8 +#define I2C1_SDA PB9 + +// I2C2 conflicts with UART3 (shares PB10/PB11) +// Enable one or the other, not both +// #define USE_I2C_DEVICE_2 +// #define I2C2_SCL PB10 // Conflicts with UART3_TX +// #define I2C2_SDA PB11 // Conflicts with UART3_RX + +#define DEFAULT_I2C_BUS BUS_I2C1 + +// SPL06 Barometer on I2C1 @ address 0x76 +#define USE_BARO +#define BARO_I2C_BUS BUS_I2C1 +#define USE_BARO_SPL06 + +// Magnetometer on I2C (external via connector) +#define USE_MAG +#define MAG_I2C_BUS DEFAULT_I2C_BUS +#define USE_MAG_ALL + +#define PITOT_I2C_BUS DEFAULT_I2C_BUS +#define TEMPERATURE_I2C_BUS DEFAULT_I2C_BUS +#define USE_RANGEFINDER +#define RANGEFINDER_I2C_BUS DEFAULT_I2C_BUS + +// *************** ADC ***************************** +#define USE_ADC +#define ADC_INSTANCE ADC1 +#define ADC1_DMA_STREAM DMA2_Stream0 + +#define ADC_CHANNEL_1_PIN PC0 // VBAT_ADC +#define ADC_CHANNEL_2_PIN PC1 // CURR_ADC +#define ADC_CHANNEL_3_PIN PC5 // RSSI_IN (shared with UART4_RX) + +#define VBAT_ADC_CHANNEL ADC_CHN_1 +#define CURRENT_METER_ADC_CHANNEL ADC_CHN_2 +#define RSSI_ADC_CHANNEL ADC_CHN_3 + +// Current sensor: INA139 with 0.25mΩ shunt +#define CURRENT_METER_SCALE 250 // TODO: Calibrate based on INA139 + shunt values + +#define DEFAULT_FEATURES (FEATURE_OSD | FEATURE_CURRENT_METER | FEATURE_VBAT | FEATURE_TELEMETRY | FEATURE_BLACKBOX) + +// *************** LED STRIP *********************** +// CON23 LED output - PA15 (T2_1 signal on schematic) +#define USE_LED_STRIP +#define WS2811_PIN PA15 // TIM2_CH1, labeled as T2_1 on schematic + +// *************** PWM OUTPUTS ********************* +// 9 motor outputs (S1-S9) +// Note: S7/S8 on TIM12 do not support DShot (no DMA on TIM12 for STM32F405) +#define MAX_PWM_OUTPUT_PORTS 9 + +// *************** Other *************************** +#define USE_DSHOT +#define USE_ESC_SENSOR +#define USE_SERIAL_4WAY_BLHELI_INTERFACE + +#define TARGET_IO_PORTA 0xffff +#define TARGET_IO_PORTB 0xffff +#define TARGET_IO_PORTC 0xffff +#define TARGET_IO_PORTD (BIT(2)) // PD2 used for UART5_RX + +// *************** NOTES & ISSUES ******************* +// +// DESIGN NOTES: +// 1. PC14 used for SPI3_NSS (SD card CS) - RTC clock domain, should be fine for slow CS signal +// +// 2. Status LEDs share SWD debug pins (PA13/PA14) - HANDLED WITH #ifndef DEBUG_BUILD +// Release builds: Pins configured as GPIO outputs for status LEDs +// Debug builds: Pins remain in SWD mode for debugging (LEDs disabled) +// Red LED appears to be power indicator (always-on, no GPIO control needed) +// +// PIN CONFLICTS (target or user must choose): +// 3. UART3 vs I2C2: PB10/PB11 shared +// - Enable UART3 for telemetry/GPS, OR +// - Enable I2C2 for additional sensors +// +// 4. UART5 TX vs SD Card: PC12 shared (SPI3_MOSI) +// - Enable UART5 for telemetry, OR +// - Enable SD card for blackbox logging +// +// 5. UART4_RX vs RSSI ADC: PC5 shared +// - May be intentional if RSSI comes via UART protocol +// +// MISSING INFORMATION: +// 6. Gyro orientation (IMU_ALIGN) unknown - needs physical board inspection +// 7. USB VBUS sensing pin not clearly defined in schematic (PC13 may be used) From 623fe7ae38a7b1c7ee7723f12a0e1af0a1996eb6 Mon Sep 17 00:00:00 2001 From: Ray Morris Date: Sun, 1 Mar 2026 12:08:06 -0600 Subject: [PATCH 2/2] FRSKYF405: fix pin assignments and clean up target MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix UART5_RX: PD12 → PD2 (only valid pin for UART5_RX on STM32F405) - Move SPI3 to PB3/PB4/PB5, freeing PC10/PC11/PC12 for UART3 and UART5_TX - Move UART3 to PC10/PC11 (was conflicting with I2C2 on PB10/PB11) - Fix UART4_RX: PC5 → PA1 (PC5 is shared with RSSI ADC) - Re-enable I2C2 on PB10/PB11 (now free after UART3 move) - Add TARGET_IO_PORTD for PD2 (UART5_RX) - Update SERIAL_PORT_COUNT to 7 (includes UART5) - Remove config.c: UART2 has both standard and hardware-inverted SBUS pads --- src/main/target/FRSKYF405/config.c | 32 ---------- src/main/target/FRSKYF405/target.c | 51 +++------------ src/main/target/FRSKYF405/target.h | 99 ++++++++---------------------- 3 files changed, 36 insertions(+), 146 deletions(-) delete mode 100644 src/main/target/FRSKYF405/config.c diff --git a/src/main/target/FRSKYF405/config.c b/src/main/target/FRSKYF405/config.c deleted file mode 100644 index 0aed59803e0..00000000000 --- a/src/main/target/FRSKYF405/config.c +++ /dev/null @@ -1,32 +0,0 @@ -/* - * This file is part of INAV. - * - * INAV is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * INAV is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with INAV. If not, see . - */ - -#include -#include - -#include - -#include "rx/rx.h" -#include "fc/config.h" - -void targetConfiguration(void) -{ - // SBUS is received via a hardware inverter (2N7002E MOSFET, Q1). - // The signal arrives at UART2 RX already de-inverted (active high), - // so the UART must NOT apply additional software inversion. - rxConfigMutable()->serialrx_inverted = 1; -} diff --git a/src/main/target/FRSKYF405/target.c b/src/main/target/FRSKYF405/target.c index 89f3ee73a0e..0708a3981e4 100644 --- a/src/main/target/FRSKYF405/target.c +++ b/src/main/target/FRSKYF405/target.c @@ -22,49 +22,18 @@ #include "drivers/pwm_mapping.h" #include "drivers/timer.h" -/* - * Timer Allocation for FrSky F405 - * - * Connector mapping from schematic (CONN.SchDoc): - * - CON1 (S1): T4_2 = TIM4_CH2 = PB7 - * - CON2 (S2): T4_1 = TIM4_CH1 = PB6 - * - CON3 (S3): T3_3 = TIM3_CH3 = PB0 - * - CON4 (S4): T3_4 = TIM3_CH4 = PB1 - * - CON5 (S5): T8_3 = TIM8_CH3 = PC8 - * - CON6 (S6): T8_4 = TIM8_CH4 = PC9 - * - CON7 (S7): T12_1 = TIM12_CH1 = PB14 (no DMA - no DShot) - * - CON8 (S8): T12_2 = TIM12_CH2 = PB15 (no DMA - no DShot) - * - CON9 (S9): T1_1 = TIM1_CH1 = PA8 - * - CON23 (LED): T2_1 = TIM2_CH1 = PA15 - */ - timerHardware_t timerHardware[] = { - // Motor outputs S1-S9 (in physical connector order from schematic) - DEF_TIM(TIM4, CH2, PB7, TIM_USE_OUTPUT_AUTO, 0, 0), // S1 (CON1) - Motor 1 - DEF_TIM(TIM4, CH1, PB6, TIM_USE_OUTPUT_AUTO, 0, 0), // S2 (CON2) - Motor 2 - DEF_TIM(TIM3, CH3, PB0, TIM_USE_OUTPUT_AUTO, 0, 0), // S3 (CON3) - Motor 3 - DEF_TIM(TIM3, CH4, PB1, TIM_USE_OUTPUT_AUTO, 0, 0), // S4 (CON4) - Motor 4 - DEF_TIM(TIM8, CH3, PC8, TIM_USE_OUTPUT_AUTO, 0, 1), // S5 (CON5) - Motor 5 UP(2,1) - DEF_TIM(TIM8, CH4, PC9, TIM_USE_OUTPUT_AUTO, 0, 0), // S6 (CON6) - Motor 6 - DEF_TIM(TIM12, CH1, PB14, TIM_USE_OUTPUT_AUTO, 0, 0), // S7 (CON7) - Motor 7 NOTE: TIM12 has no DMA - DShot not supported - DEF_TIM(TIM12, CH2, PB15, TIM_USE_OUTPUT_AUTO, 0, 0), // S8 (CON8) - Motor 8 NOTE: TIM12 has no DMA - DShot not supported - DEF_TIM(TIM1, CH1, PA8, TIM_USE_OUTPUT_AUTO, 0, 0), // S9 (CON9) - Motor 9 UP(2,5) + DEF_TIM(TIM4, CH2, PB7, TIM_USE_OUTPUT_AUTO, 0, 0), // S1 + DEF_TIM(TIM4, CH1, PB6, TIM_USE_OUTPUT_AUTO, 0, 0), // S2 + DEF_TIM(TIM3, CH3, PB0, TIM_USE_OUTPUT_AUTO, 0, 0), // S3 + DEF_TIM(TIM3, CH4, PB1, TIM_USE_OUTPUT_AUTO, 0, 0), // S4 + DEF_TIM(TIM8, CH3, PC8, TIM_USE_OUTPUT_AUTO, 0, 1), // S5 + DEF_TIM(TIM8, CH4, PC9, TIM_USE_OUTPUT_AUTO, 0, 0), // S6 + DEF_TIM(TIM12, CH1, PB14, TIM_USE_OUTPUT_AUTO, 0, 0), // S7 - no DShot (TIM12 has no DMA) + DEF_TIM(TIM12, CH2, PB15, TIM_USE_OUTPUT_AUTO, 0, 0), // S8 - no DShot (TIM12 has no DMA) + DEF_TIM(TIM1, CH1, PA8, TIM_USE_OUTPUT_AUTO, 0, 0), // S9 - // LED Strip on CON23 - PA15 (T2_1 signal on schematic) - DEF_TIM(TIM2, CH1, PA15, TIM_USE_LED, 0, 0), // LED strip (CON23) + DEF_TIM(TIM2, CH1, PA15, TIM_USE_LED, 0, 0), // LED strip }; const int timerHardwareCount = sizeof(timerHardware) / sizeof(timerHardware[0]); - -/* - * IMPLEMENTATION NOTES: - * - * 1. S1/S2 order matches physical board labels (CON1=S1, CON2=S2 from schematic) - * - * 2. TIM12 (S7, S8): No DMA support on STM32F405. - * Works: Standard PWM, OneShot125, OneShot42, MultiShot - * Does NOT work: DShot (all variants), ProShot - * Use S7/S8 for non-DShot ESCs or servos - * - * 3. LED strip output: PA15 (T2_1) on CON23 with TIM2_CH1 - */ diff --git a/src/main/target/FRSKYF405/target.h b/src/main/target/FRSKYF405/target.h index e3eafdb51da..146519a99b8 100644 --- a/src/main/target/FRSKYF405/target.h +++ b/src/main/target/FRSKYF405/target.h @@ -22,17 +22,11 @@ #define USBD_PRODUCT_STRING "FrSkyF405" // *************** LED & BEEPER ********************** -// Status LEDs share SWD debug pins - only available in release builds -// In debug builds, these pins must remain in SWD mode for debugging -// Red LED is likely a power indicator (always-on, no GPIO control) -#ifndef DEBUG_BUILD - #define LED0 PA14 // Blue LED (shares SWCLK) via R34 1K - #define LED1 PA13 // Green LED (shares SWDIO) via R35 1K -#endif -// Red LED appears to be power indicator (connected to VCC, not GPIO) +#define LED0 PA14 // shares SWCLK +#define LED1 PA13 // shares SWDIO #define BEEPER PC15 -#define BEEPER_INVERTED // INAV beeper driver writes !onoff; BEEPER_INVERTED makes it write HIGH to activate the N-channel MOSFET (Q2) +#define BEEPER_INVERTED // *************** Gyro & ACC ********************** #define USE_SPI @@ -42,11 +36,11 @@ #define SPI1_MISO_PIN PA6 #define SPI1_MOSI_PIN PA7 -// IIM-42688P Gyro on SPI1 -#define USE_IMU_ICM42605 // IIM-42688P is compatible with ICM42605 driver +// IIM-42688P is compatible with ICM42605 driver +#define USE_IMU_ICM42605 #define ICM42605_CS_PIN PA4 #define ICM42605_SPI_BUS BUS_SPI1 -#define IMU_ICM42605_ALIGN CW0_DEG // TODO: Verify orientation from board layout +#define IMU_ICM42605_ALIGN CW0_DEG // *************** OSD ***************************** @@ -55,19 +49,16 @@ #define SPI2_MISO_PIN PC2 #define SPI2_MOSI_PIN PC3 -// AT7456E OSD on SPI2 #define USE_MAX7456 #define MAX7456_SPI_BUS BUS_SPI2 #define MAX7456_CS_PIN PB12 // *************** SD Card ************************* #define USE_SPI_DEVICE_3 -#define SPI3_SCK_PIN PC10 -#define SPI3_MISO_PIN PC11 -#define SPI3_MOSI_PIN PC12 +#define SPI3_SCK_PIN PB3 +#define SPI3_MISO_PIN PB4 +#define SPI3_MOSI_PIN PB5 -// SD Card on SPI3 -// NOTE: PC14 used for CS (Chip Select) - OSC32_IN pin used as GPIO for slow CS signal #define USE_SDCARD #define USE_SDCARD_SPI #define SDCARD_SPI_BUS BUS_SPI3 @@ -77,7 +68,6 @@ // *************** UART ***************************** #define USE_VCP -// Note: USB VBUS sensing not clearly defined in schematic #define USE_UART1 #define UART1_TX_PIN PA9 @@ -87,55 +77,47 @@ #define UART2_TX_PIN PA2 #define UART2_RX_PIN PA3 -// USART2 has SBUS inverter circuit +// UART2 has two pads: standard (for CRSF etc) and hardware-inverted SBUS #define SERIALRX_UART SERIAL_PORT_USART2 #define SERIALRX_PROVIDER SERIALRX_SBUS #define DEFAULT_RX_TYPE RX_TYPE_SERIAL -// UART3 conflicts with I2C2 (shares PB10/PB11) -// User must choose: enable UART3 OR I2C2, not both #define USE_UART3 -#define UART3_TX_PIN PB10 // Conflicts with I2C2_SCL -#define UART3_RX_PIN PB11 // Conflicts with I2C2_SDA +#define UART3_TX_PIN PC10 +#define UART3_RX_PIN PC11 #define USE_UART4 #define UART4_TX_PIN PA0 -#define UART4_RX_PIN PC5 // Shared with RSSI_ADC +#define UART4_RX_PIN PA1 + -// UART5 TX conflicts with SPI3_MOSI (PC12) -// User must choose: enable UART5 OR SD card, not both #define USE_UART5 -#define UART5_TX_PIN PC12 // Conflicts with SPI3_MOSI +#define UART5_TX_PIN PC12 #define UART5_RX_PIN PD2 #define USE_UART6 #define UART6_TX_PIN PC6 #define UART6_RX_PIN PC7 -#define SERIAL_PORT_COUNT 7 // VCP + UART1-6 +#define SERIAL_PORT_COUNT 7 // VCP + UART1-5, UART6 // *************** I2C **************************** #define USE_I2C -// I2C1 for barometer (SPL06) #define USE_I2C_DEVICE_1 #define I2C1_SCL PB8 #define I2C1_SDA PB9 -// I2C2 conflicts with UART3 (shares PB10/PB11) -// Enable one or the other, not both -// #define USE_I2C_DEVICE_2 -// #define I2C2_SCL PB10 // Conflicts with UART3_TX -// #define I2C2_SDA PB11 // Conflicts with UART3_RX +#define USE_I2C_DEVICE_2 +#define I2C2_SCL PB10 +#define I2C2_SDA PB11 #define DEFAULT_I2C_BUS BUS_I2C1 -// SPL06 Barometer on I2C1 @ address 0x76 #define USE_BARO #define BARO_I2C_BUS BUS_I2C1 #define USE_BARO_SPL06 -// Magnetometer on I2C (external via connector) #define USE_MAG #define MAG_I2C_BUS DEFAULT_I2C_BUS #define USE_MAG_ALL @@ -150,27 +132,24 @@ #define ADC_INSTANCE ADC1 #define ADC1_DMA_STREAM DMA2_Stream0 -#define ADC_CHANNEL_1_PIN PC0 // VBAT_ADC -#define ADC_CHANNEL_2_PIN PC1 // CURR_ADC -#define ADC_CHANNEL_3_PIN PC5 // RSSI_IN (shared with UART4_RX) +#define ADC_CHANNEL_1_PIN PC0 +#define ADC_CHANNEL_2_PIN PC1 +#define ADC_CHANNEL_3_PIN PC5 #define VBAT_ADC_CHANNEL ADC_CHN_1 #define CURRENT_METER_ADC_CHANNEL ADC_CHN_2 #define RSSI_ADC_CHANNEL ADC_CHN_3 -// Current sensor: INA139 with 0.25mΩ shunt -#define CURRENT_METER_SCALE 250 // TODO: Calibrate based on INA139 + shunt values +#define CURRENT_METER_SCALE 250 #define DEFAULT_FEATURES (FEATURE_OSD | FEATURE_CURRENT_METER | FEATURE_VBAT | FEATURE_TELEMETRY | FEATURE_BLACKBOX) // *************** LED STRIP *********************** -// CON23 LED output - PA15 (T2_1 signal on schematic) #define USE_LED_STRIP -#define WS2811_PIN PA15 // TIM2_CH1, labeled as T2_1 on schematic +#define WS2811_PIN PA15 // *************** PWM OUTPUTS ********************* -// 9 motor outputs (S1-S9) -// Note: S7/S8 on TIM12 do not support DShot (no DMA on TIM12 for STM32F405) +// S7/S8 on TIM12 do not support DShot #define MAX_PWM_OUTPUT_PORTS 9 // *************** Other *************************** @@ -181,30 +160,4 @@ #define TARGET_IO_PORTA 0xffff #define TARGET_IO_PORTB 0xffff #define TARGET_IO_PORTC 0xffff -#define TARGET_IO_PORTD (BIT(2)) // PD2 used for UART5_RX - -// *************** NOTES & ISSUES ******************* -// -// DESIGN NOTES: -// 1. PC14 used for SPI3_NSS (SD card CS) - RTC clock domain, should be fine for slow CS signal -// -// 2. Status LEDs share SWD debug pins (PA13/PA14) - HANDLED WITH #ifndef DEBUG_BUILD -// Release builds: Pins configured as GPIO outputs for status LEDs -// Debug builds: Pins remain in SWD mode for debugging (LEDs disabled) -// Red LED appears to be power indicator (always-on, no GPIO control needed) -// -// PIN CONFLICTS (target or user must choose): -// 3. UART3 vs I2C2: PB10/PB11 shared -// - Enable UART3 for telemetry/GPS, OR -// - Enable I2C2 for additional sensors -// -// 4. UART5 TX vs SD Card: PC12 shared (SPI3_MOSI) -// - Enable UART5 for telemetry, OR -// - Enable SD card for blackbox logging -// -// 5. UART4_RX vs RSSI ADC: PC5 shared -// - May be intentional if RSSI comes via UART protocol -// -// MISSING INFORMATION: -// 6. Gyro orientation (IMU_ALIGN) unknown - needs physical board inspection -// 7. USB VBUS sensing pin not clearly defined in schematic (PC13 may be used) +#define TARGET_IO_PORTD (BIT(2)) // PD2 - UART5_RX