Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Tools/AP_Bootloader/board_types.txt
Original file line number Diff line number Diff line change
Expand Up @@ -339,6 +339,8 @@ AP_HW_KHA_ETH 1315

AP_HW_FlysparkF4 1361

AP_HW_CIPHERWINGF4 1362

AP_HW_CUBEORANGE_PERIPH 1400
AP_HW_CUBEBLACK_PERIPH 1401
AP_HW_PIXRACER_PERIPH 1402
Expand Down
Binary file added Tools/bootloaders/CIPHERWINGF4_bl.bin
Binary file not shown.
95 changes: 95 additions & 0 deletions libraries/AP_HAL_ChibiOS/hwdef/CIPHERWINGF4/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
# CipherWing F4 (STM32F405)

## Introduction
The **CipherWing F4** is a custom autopilot board designed around the STM32F405 MCU.
It is hardware-compatible with the OmnibusF4 family and supports multiple firmwares including **INAV**, **PX4**, and **ArduPilot** (tested with this PR).
This board is under early development and testing by **Jeevesh Vishwavijay**, for educational and prototype use.

## Features / Specifications
- **Processor:** STM32F405RGT6 (168 MHz ARM Cortex-M4F)
- **Flash:** 1MB internal flash
- **IMUs:** MPU6000 (SPI1), BMI270 (SPI1, shared bus)
- **Barometer:** BMP280 (SPI3)
- **OSD:** MAX7456-compatible (SPI3)
- **Power:** VBAT & RSSI analog inputs
- **USB:** Micro-USB (OTG1)
- **UARTs:** Up to 6 hardware serial ports
- **PWM outputs:** 8 motor/servo outputs (M1–M8)
- **No onboard SD card**
- **Supported firmware:** INAV, PX4, ArduPilot

## Pinout
Follows the OmnibusF4 layout with modifications for CipherWing:
- **RSSI input:** PC1
- **VBAT:** PC2
- **PWM1–8:** PB0, PB1, PC8, PC9, PB14, PA8, PB15, PB7
- **IMU:** SPI1
- **OSD & BARO:** SPI3

## UART Mapping
| Serial # | Function | Port | Notes |
|-----------|-----------|------|-------|
| SERIAL0 | USB | OTG1 | Default console |
| SERIAL1 | USART1 | PA9 / PA10 | Telemetry |
| SERIAL2 | USART2 | PA2 / PA3 | GPS1 |
| SERIAL3 | USART3 | PB10 / PB11 | GPS2 / Telem2 |
| SERIAL4 | UART4 | PA0 / PA1 | Optional |
| SERIAL5 | UART5 | PD2 (RX only) | Optional |
| SERIAL6 | USART6 | PC6 / PC7 | ESC telemetry |

## PWM Outputs
| PWM Channel | MCU Pin | Timer | Function |
|--------------|----------|--------|-----------|
| M1 | PB0 | TIM3_CH3 | Motor 1 |
| M2 | PB1 | TIM3_CH4 | Motor 2 |
| M3 | PC8 | TIM8_CH3 | Motor 3 |
| M4 | PC9 | TIM8_CH4 | Motor 4 |
| M5 | PB14 | TIM1_CH2N | Motor 5 |
| M6 | PA8 | TIM1_CH1 | Motor 6 |
| M7 | PB15 | TIM1_CH3N | Motor 7 |
| M8 | PB7 | TIM4_CH2 | Motor 8 |


### RC Input
- **SBUS (Inverted)** — connected to UART5_RX (PD2) via onboard BSS138 inverter.
- Compatible with FrSky SBUS, Futaba SBUS2, etc.
- **CRSF/ELRS** — supported on UART1 or UART6 (DMA-enabled).


## OSD Support
Onboard analog **MAX7456 OSD** supported (SPI3).
Set `OSD_TYPE=1` for analog OSD, or `OSD_TYPE=5` for DisplayPort.

## Battery Monitor
Default analog monitor configured:
- Voltage: `PC2`
- RSSI: `PC1`
- Parameters:
- `BATT_MONITOR = 4`
- `BATT_VOLT_PIN = 12`
- `BATT_VOLT_MULT = 11`
- `BATT_CURR_PIN = -1` (disabled, no current sense)
- `RSSI_ANA_PIN = PC1`

## Compass
No onboard compass.
Use external I²C compass via SDA (PB9) and SCL (PB8).

## Firmware
Firmware binaries will be available under:
`https://firmware.ardupilot.org/CipherWingF4/`

## Loading Firmware
This board supports ArduPilot `.apj` firmware upload via **Mission Planner** or **QGroundControl** once bootloader is flashed.
To flash bootloader manually:
```bash
Tools/scripts/build_bootloaders.py CIPHERWINGF4
Notes
Designed for development and educational purposes.

Future versions may include SD card and CAN.

Board tested for compatibility with ArduCopter and ArduPlane builds.

Author: Jeevesh Vishwavijay
Project: CipherWing F4
48 changes: 48 additions & 0 deletions libraries/AP_HAL_ChibiOS/hwdef/CIPHERWINGF4/hwdef-bl.dat
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# hw definition file for processing by chibios_pins.py
# for CIPHERWINGF4 bootloader (derived from omnibusf4pro)

BOARD_NAME CIPHERWINGF4

# MCU class and specific type
MCU STM32F4xx STM32F405xx

# board ID. See Tools/AP_Bootloader/board_types.txt
APJ_BOARD_ID AP_HW_CIPHERWINGF4


# crystal frequency
OSCILLATOR_HZ 8000000

FLASH_SIZE_KB 1024

# don't allow bootloader to use more than 16k
FLASH_USE_MAX_KB 16

# bootloader is installed at zero offset
FLASH_RESERVE_START_KB 0

# LEDs
PB5 LED_BOOTLOADER OUTPUT LOW
define HAL_LED_ON 0

# the location where the bootloader will put the firmware
FLASH_BOOTLOADER_LOAD_KB 64

PB4 BUZZER OUTPUT LOW PULLDOWN

# order of UARTs
SERIAL_ORDER OTG1

PA11 OTG_FS_DM OTG1
PA12 OTG_FS_DP OTG1

# Ensure active SPI peripherals are deasserted (CS high) in bootloader
PA4 MPU6000_CS CS # IMU CS (also used by ICM20689/BMI270 via same CS)
PA15 OSD_CS CS # MAX7456 OSD CS
PB3 BMP280_CS CS # BMP280 baro CS

# NOTE:
# - SD card was removed from the main hwdef.dat, so PB12 SDCARD_CS is omitted here.
# - No bootloader changes are needed for I2C1 on PB8/PB9 or for PWM/UART remaps.
# The application firmware will configure those after boot.

181 changes: 181 additions & 0 deletions libraries/AP_HAL_ChibiOS/hwdef/CIPHERWINGF4/hwdef.dat
Original file line number Diff line number Diff line change
@@ -0,0 +1,181 @@
# hw definition file for processing by chibios_pins.py
# Cipherwing F4 with STM32F405
# mpu6000 / bmi270 / icm20689 IMU options, bmp280 barometer,
# 7456 series OSD and NO sdcard

BOARD_NAME CIPHERWINGF4

MCU STM32F4xx STM32F405xx

# board ID. See Tools/AP_Bootloader/board_types.txt
APJ_BOARD_ID AP_HW_CIPHERWINGF4


# crystal frequency
OSCILLATOR_HZ 8000000

STM32_ST_USE_TIMER 5

# flash size
FLASH_SIZE_KB 1024
FLASH_RESERVE_START_KB 64

# order of I2C buses (moved to I2C1)
I2C_ORDER I2C1

# order of UARTs (include USART2 and UART5)
SERIAL_ORDER OTG1 USART1 USART2 USART3 USART6 UART4 UART5

# ---------- ADC ----------
# VBAT stays on PC2
PC2 BAT_VOLT_SENS ADC1 SCALE(1)

# RSSI moved to PC1 (per request)
PC1 RSSI_IN ADC1
define BOARD_RSSI_ANA_PIN 1

# (REMOVED to avoid conflict) Current sensor on PC1:
# PC1 BAT_CURR_SENS ADC1 SCALE(1)

# ---------- PWM outputs remapped to match requested INAV-style layout ----------
# M1 PB0 TIM3_CH3
# M2 PB1 TIM3_CH4
# M3 PC8 TIM8_CH3
# M4 PC9 TIM8_CH4
# M5 PB14 TIM1_CH2N (F405-valid replacement for TIM12_CH1)
# M6 PA8 TIM1_CH1
# M7 PB15 TIM1_CH3N (F405-valid replacement for TIM12_CH2)
# M8 PB7 TIM4_CH2
PB0 TIM3_CH3 TIM3 PWM(1) GPIO(50)
PB1 TIM3_CH4 TIM3 PWM(2) GPIO(51)
PC8 TIM8_CH3 TIM8 PWM(3) GPIO(52)
PC9 TIM8_CH4 TIM8 PWM(4) GPIO(53)
PB14 TIM1_CH2N TIM1 PWM(5) GPIO(54)
PA8 TIM1_CH1 TIM1 PWM(6) GPIO(55)
PB15 TIM1_CH3N TIM1 PWM(7) GPIO(56)
PB7 TIM4_CH2 TIM4 PWM(8) GPIO(57)

# ---------- IMU on SPI1 with CS=PA4 ----------
PA4 MPU6000_CS CS
PA5 SPI1_SCK SPI1
PA6 SPI1_MISO SPI1
PA7 SPI1_MOSI SPI1

# ---------- I2C1 on PB8/PB9 (pullups). (Freed PB10/PB11 for USART3 ALTs) ----------
PB8 I2C1_SCL I2C1 PULLUP
PB9 I2C1_SDA I2C1 PULLUP

# Keep USART3 available on PB10/PB11 via ALTs if needed
PB10 USART3_TX USART3 ALT(1)
PB11 USART3_RX USART3 ALT(1)
PB10 USART3_TX USART3 ALT(4)
PB11 USART3_RX USART3 ALT(4)

# ---------- SPI2 / SD card REMOVED (per request) ----------
# (PB15 SPI2_MOSI SPI2)
# (PB14 SPI2_MISO SPI2)
# (PB13 SPI2_SCK SPI2)
# (PB12 SDCARD_CS CS)

# ---------- UARTs ----------
PA10 USART1_RX USART1
PA9 USART1_TX USART1

PA3 USART2_RX USART2
PA2 USART2_TX USART2

PC6 USART6_TX USART6
PC7 USART6_RX USART6

# UART4 on PA0/PA1 via ALT configs
PA0 UART4_TX UART4 ALT(2)
PA0 UART4_TX UART4 ALT(3)
PA1 UART4_RX UART4 ALT(3)
PA0 UART4_TX UART4 ALT(4)
PA1 UART4_RX UART4 ALT(4)

# ---------- UART5 for SBUS (via BSS138 inverter) ----------
PD2 UART5_RX UART5 INVERTED
# TX intentionally unassigned
define HAL_RCIN_UART 5
define SERIAL_PORTS_RCIN_DEFAULT SERIAL5
# ---------- SWD ----------
PA13 JTMS-SWDIO SWD
PA14 JTCK-SWCLK SWD

# ---------- OSD + BMP on SPI3 ----------
PA15 OSD_CS CS
PB3 BMP280_CS CS
PC12 SPI3_MOSI SPI3
PC11 SPI3_MISO SPI3
PC10 SPI3_SCK SPI3

# ---------- LEDs / Beeper ----------
define AP_NOTIFY_GPIO_LED_2_ENABLED 1
PB5 LED_BLUE OUTPUT LOW GPIO(1)
define HAL_GPIO_A_LED_PIN 1

# dummy assignment required to allow AP_NOTIFY to use board led
define HAL_GPIO_B_LED_PIN 2

PB4 TIM3_CH1 TIM3 GPIO(58) ALARM LOW

# use LED-STRIP output as general purpose GPIO (PB6 kept for LED strip)
PB6 GP_GPIO OUTPUT LOW GPIO(70)

# ---------- USB ----------
PA11 OTG_FS_DM OTG1
PA12 OTG_FS_DP OTG1
PC5 VBUS INPUT OPENDRAIN

# RCIN on PB8 removed because PB8 is now I2C1_SCL. Use a UART-based RC input (e.g., SBUS on USART1/USART6).
# PB8 TIM4_CH3 TIM4 RCININT PULLDOWN LOW (REMOVED)

# ---------- SPI Device table (sdcard removed, ICM20689 added) ----------
SPIDEV bmi270 SPI1 DEVID1 MPU6000_CS MODE3 1*MHZ 10*MHZ
SPIDEV mpu6000 SPI1 DEVID1 MPU6000_CS MODE3 1*MHZ 8*MHZ
SPIDEV icm20689 SPI1 DEVID1 MPU6000_CS MODE3 1*MHZ 8*MHZ
SPIDEV bmp280 SPI3 DEVID3 BMP280_CS MODE3 1*MHZ 8*MHZ
SPIDEV osd SPI3 DEVID4 OSD_CS MODE0 10*MHZ 10*MHZ

# one IMU present on board. Allow MPU6000, BMI270, or ICM20689
IMU Invensense SPI:mpu6000 ROTATION_YAW_180
IMU BMI270 SPI:bmi270 ROTATION_ROLL_180
IMU Invensense SPI:icm20689 ROTATION_YAW_180

# one baro
BARO BMP280 SPI:bmp280
define AP_BARO_BACKEND_DEFAULT_ENABLED 0
define AP_BARO_BMP280_ENABLED 1

# no built-in compass, but probe the i2c bus for all possible external compass types
define ALLOW_ARM_NO_COMPASS
define AP_COMPASS_PROBING_ENABLED 1
define HAL_I2C_INTERNAL_MASK 0
define HAL_COMPASS_AUTO_ROT_DEFAULT 2

STORAGE_FLASH_PAGE 1
define HAL_STORAGE_SIZE 15360

define HAL_OS_FATFS_IO 0

# ---------- default battery setup ----------
# VBAT pin index unchanged
define HAL_BATT_VOLT_PIN 12
define HAL_BATT_VOLT_SCALE 11

# Current sensor disabled (per request / to avoid conflict)
define HAL_BATT_CURR_PIN -1
define HAL_BATT_CURR_SCALE 0

define OSD_ENABLED 1
define HAL_OSD_TYPE_DEFAULT 1

# font for the osd
ROMFS_WILDCARD libraries/AP_OSD/fonts/font0.bin

# disable parachute and sprayer to save flash
define HAL_PARACHUTE_ENABLED 0

include ../include/minimize_fpv_osd.inc

Loading