docs(script): fix up generator PWM outputs

This commit is contained in:
Hamish Willee
2026-04-02 10:36:01 +11:00
parent 35a734d49a
commit f54a170361
28 changed files with 716 additions and 108 deletions
+8 -1
View File
@@ -28,10 +28,11 @@ fc_doc_generator/
│ └── <vendor>_<board>_wizard.json # User-supplied wizard overrides
└── tests/
├── conftest.py # snapshot fixture + board_* path fixtures
├── fixtures/ # Minimal fake board trees (5 boards)
├── fixtures/ # Minimal fake board trees
│ ├── stm32h7_all_dshot/
│ ├── stm32h7_mixed_io/
│ ├── stm32h7_ppm_shared/
│ ├── stm32h7_capture_channels/ # 8 regular + 8 initIOTimerChannelCapture outputs
│ ├── stm32f4_no_dshot/
│ └── imxrt_all_dshot/
├── snapshots/ # Expected markdown output (.md files)
@@ -56,6 +57,12 @@ python docs/scripts/fc_doc_generator/fc_doc_generator.py --apply
# Apply a single section only:
python docs/scripts/fc_doc_generator/fc_doc_generator.py --apply --section pwm_outputs
# Apply all sections to a single doc only (stem or filename, implies --apply):
python docs/scripts/fc_doc_generator/fc_doc_generator.py --doc cuav_x25-evo.md
# Apply a single section to a single doc:
python docs/scripts/fc_doc_generator/fc_doc_generator.py --doc cuav_x25-evo.md --section pwm_outputs
# Create a new stub FC doc (interactive wizard):
python docs/scripts/fc_doc_generator/fc_doc_generator.py --new-doc
@@ -279,6 +279,7 @@ def parse_timer_config(board_path: Path) -> dict:
initIOTimerChannel(io_timers, {Timer::Timer5, Timer::Channel1}, …)
initIOTimerChannelOutputClear(…) — same semantics, clears on disable
initIOTimerChannelDshot(…) — iMXRT only: marks channel as DShot
initIOTimerChannelCapture(…) — dual-purpose capture/output channel
The channel index (Channel1 = index 0, Channel2 = index 1, …) is extracted
and stored for use by compute_bdshot() when determining per-channel BDShot
@@ -331,6 +332,7 @@ def parse_timer_config(board_path: Path) -> dict:
# Parse timer_io_channels[] array entries
# Handle: initIOTimerChannel(io_timers, {Timer::Timer5, Timer::Channel1}, ...)
# Handle: initIOTimerChannelOutputClear(...), initIOTimerChannelDshot(...)
# Handle: initIOTimerChannelCapture(...) -- dual-purpose capture/output channels
channels = []
io_channels_match = re.search(
r'constexpr\s+timer_io_channels_t\s+timer_io_channels\[.*?\]\s*=\s*\{(.*?)\};',
@@ -341,7 +343,7 @@ def parse_timer_config(board_path: Path) -> dict:
block = re.sub(r'//[^\n]*', '', io_channels_match.group(1))
output_idx = 1
for entry in re.finditer(
r'(initIOTimerChannel(?:OutputClear|Dshot)?)\s*\(\s*io_timers\s*,\s*\{(?:Timer|PWM)::(\w+)\s*,\s*(?:Timer::|PWM::)?(\w+)\}',
r'(initIOTimerChannel(?:OutputClear|Dshot|Capture)?)\s*\(\s*io_timers\s*,\s*\{(?:Timer|PWM)::(\w+)\s*,\s*(?:Timer::|PWM::)?(\w+)\}',
block
):
func_name = entry.group(1)
@@ -2485,8 +2487,8 @@ def generate_specifications_section(board_key: str, entry: dict) -> str:
lines.append('### Interfaces')
lines.append('')
# Use group-derived count — DIRECT_PWM_OUTPUT_CHANNELS in board_config.h
# counts all FMU timer channels including capture inputs; groups only count
# initIOTimerChannel entries (actual servo outputs, not capture channels).
# counts all FMU timer channels, which matches groups since
# initIOTimerChannelCapture entries are also counted as outputs.
groups = entry.get('groups') or []
fmu_out = sum(len(g.get('outputs', [])) for g in groups)
io_out = entry.get('io_outputs', 0) or 0
@@ -2839,16 +2841,28 @@ def _has_no_rc_data(entry: dict) -> bool:
)
def apply_sections_to_docs(data: dict, sections: list = None) -> tuple:
"""Apply generated sections to FC doc files. Returns (updated, skipped) lists."""
def apply_sections_to_docs(data: dict, sections: list = None, doc_filter: str = None) -> tuple:
"""Apply generated sections to FC doc files. Returns (updated, skipped) lists.
doc_filter: if given, only process the board whose doc_file matches this
filename (e.g. 'cuav_x25-evo.md'). Stem-only ('cuav_x25-evo') also accepted.
"""
sections_to_apply = sections or APPLY_SECTIONS
updated, skipped = [], []
# Normalise filter to bare filename with extension
if doc_filter:
p = Path(doc_filter)
doc_filter_name = p.name if p.suffix else p.name + ".md"
for key, entry in data.items():
doc_filename = entry.get('doc_file')
if not doc_filename:
skipped.append((key, 'no doc mapping'))
continue
if doc_filter and doc_filename != doc_filter_name:
skipped.append((key, f'filtered (not {doc_filter_name})'))
continue
doc_path = FC_DOCS / doc_filename
if not doc_path.exists():
skipped.append((key, f'doc not found: {doc_filename}'))
@@ -4355,6 +4369,12 @@ if __name__ == "__main__":
"--section", choices=list(SECTION_GENERATORS.keys()), default=None,
help="Apply only this section key (implies --apply).",
)
parser.add_argument(
"--doc", default=None,
metavar="FILENAME",
help="Apply only to this doc file, e.g. cuav_x25-evo.md (implies --apply). "
"Stem without extension is also accepted.",
)
parser.add_argument(
"--output-dir", type=Path, default=None,
metavar="DIR",
@@ -4454,8 +4474,8 @@ if __name__ == "__main__":
print(f"Boards with existing PWM section: {documented}")
print(f"Boards with any DShot: {dshot_boards}")
if args.apply or args.section:
if args.apply or args.section or args.doc:
sections = [args.section] if args.section else None
print()
updated, skipped = apply_sections_to_docs(data, sections)
updated, skipped = apply_sections_to_docs(data, sections, doc_filter=args.doc)
print(f"\nApply done. Updated: {len(updated)}, Skipped: {len(skipped)}")
@@ -65,6 +65,20 @@
],
"bdshot_outputs": [],
"bdshot_output_only": []
},
{
"group": 4,
"timer": "Timer1",
"outputs": [
9
],
"dshot": false,
"dshot_outputs": [],
"non_dshot_outputs": [
9
],
"bdshot_outputs": [],
"bdshot_output_only": []
}
],
"serial_ports": [
@@ -65,6 +65,20 @@
],
"bdshot_outputs": [],
"bdshot_output_only": []
},
{
"group": 4,
"timer": "Timer1",
"outputs": [
9
],
"dshot": false,
"dshot_outputs": [],
"non_dshot_outputs": [
9
],
"bdshot_outputs": [],
"bdshot_output_only": []
}
],
"serial_ports": [
@@ -69,6 +69,20 @@
],
"bdshot_outputs": [],
"bdshot_output_only": []
},
{
"group": 4,
"timer": "Timer8",
"outputs": [
10
],
"dshot": false,
"dshot_outputs": [],
"non_dshot_outputs": [
10
],
"bdshot_outputs": [],
"bdshot_output_only": []
}
],
"serial_ports": [
@@ -65,6 +65,20 @@
],
"bdshot_outputs": [],
"bdshot_output_only": []
},
{
"group": 4,
"timer": "Timer1",
"outputs": [
9
],
"dshot": false,
"dshot_outputs": [],
"non_dshot_outputs": [
9
],
"bdshot_outputs": [],
"bdshot_output_only": []
}
],
"serial_ports": [
@@ -65,6 +65,54 @@
],
"bdshot_outputs": [],
"bdshot_output_only": []
},
{
"group": 4,
"timer": "Timer8",
"outputs": [
9,
10,
11
],
"dshot": false,
"dshot_outputs": [],
"non_dshot_outputs": [
9,
10,
11
],
"bdshot_outputs": [],
"bdshot_output_only": []
},
{
"group": 5,
"timer": "Timer15",
"outputs": [
12
],
"dshot": false,
"dshot_outputs": [],
"non_dshot_outputs": [
12
],
"bdshot_outputs": [],
"bdshot_output_only": []
},
{
"group": 6,
"timer": "Timer12",
"outputs": [
13,
14
],
"dshot": false,
"dshot_outputs": [],
"non_dshot_outputs": [
13,
14
],
"bdshot_outputs": [],
"bdshot_output_only": []
}
],
"serial_ports": [
@@ -65,6 +65,20 @@
],
"bdshot_outputs": [],
"bdshot_output_only": []
},
{
"group": 4,
"timer": "Timer1",
"outputs": [
9
],
"dshot": false,
"dshot_outputs": [],
"non_dshot_outputs": [
9
],
"bdshot_outputs": [],
"bdshot_output_only": []
}
],
"serial_ports": [
@@ -56,6 +56,58 @@
"bdshot_output_only": [
8
]
},
{
"group": 3,
"timer": "Timer1",
"outputs": [
9,
10,
11
],
"dshot": false,
"dshot_outputs": [],
"non_dshot_outputs": [
9,
10,
11
],
"bdshot_outputs": [],
"bdshot_output_only": []
},
{
"group": 4,
"timer": "Timer8",
"outputs": [
12,
13,
14
],
"dshot": false,
"dshot_outputs": [],
"non_dshot_outputs": [
12,
13,
14
],
"bdshot_outputs": [],
"bdshot_output_only": []
},
{
"group": 5,
"timer": "Timer12",
"outputs": [
15,
16
],
"dshot": false,
"dshot_outputs": [],
"non_dshot_outputs": [
15,
16
],
"bdshot_outputs": [],
"bdshot_output_only": []
}
],
"serial_ports": [
@@ -56,6 +56,58 @@
"bdshot_output_only": [
8
]
},
{
"group": 3,
"timer": "Timer1",
"outputs": [
9,
10,
11
],
"dshot": false,
"dshot_outputs": [],
"non_dshot_outputs": [
9,
10,
11
],
"bdshot_outputs": [],
"bdshot_output_only": []
},
{
"group": 4,
"timer": "Timer8",
"outputs": [
12,
13,
14
],
"dshot": false,
"dshot_outputs": [],
"non_dshot_outputs": [
12,
13,
14
],
"bdshot_outputs": [],
"bdshot_output_only": []
},
{
"group": 5,
"timer": "Timer12",
"outputs": [
15,
16
],
"dshot": false,
"dshot_outputs": [],
"non_dshot_outputs": [
15,
16
],
"bdshot_outputs": [],
"bdshot_output_only": []
}
],
"serial_ports": [
@@ -46,6 +46,40 @@
5
],
"bdshot_output_only": []
},
{
"group": 3,
"timer": "Timer2",
"outputs": [
6,
7,
8
],
"dshot": false,
"dshot_outputs": [],
"non_dshot_outputs": [
6,
7,
8
],
"bdshot_outputs": [],
"bdshot_output_only": []
},
{
"group": 4,
"timer": "Timer12",
"outputs": [
9,
10
],
"dshot": false,
"dshot_outputs": [],
"non_dshot_outputs": [
9,
10
],
"bdshot_outputs": [],
"bdshot_output_only": []
}
],
"serial_ports": [
@@ -62,6 +62,24 @@
],
"bdshot_outputs": [],
"bdshot_output_only": []
},
{
"group": 4,
"timer": "Timer2",
"outputs": [
9,
10,
11
],
"dshot": false,
"dshot_outputs": [],
"non_dshot_outputs": [
9,
10,
11
],
"bdshot_outputs": [],
"bdshot_output_only": []
}
],
"serial_ports": [
@@ -62,6 +62,24 @@
],
"bdshot_outputs": [],
"bdshot_output_only": []
},
{
"group": 4,
"timer": "Timer2",
"outputs": [
9,
10,
11
],
"dshot": false,
"dshot_outputs": [],
"non_dshot_outputs": [
9,
10,
11
],
"bdshot_outputs": [],
"bdshot_output_only": []
}
],
"serial_ports": [
@@ -65,6 +65,20 @@
],
"bdshot_outputs": [],
"bdshot_output_only": []
},
{
"group": 4,
"timer": "Timer5",
"outputs": [
9
],
"dshot": false,
"dshot_outputs": [],
"non_dshot_outputs": [
9
],
"bdshot_outputs": [],
"bdshot_output_only": []
}
],
"serial_ports": [
@@ -65,6 +65,20 @@
],
"bdshot_outputs": [],
"bdshot_output_only": []
},
{
"group": 4,
"timer": "Timer1",
"outputs": [
9
],
"dshot": false,
"dshot_outputs": [],
"non_dshot_outputs": [
9
],
"bdshot_outputs": [],
"bdshot_output_only": []
}
],
"serial_ports": [
@@ -65,6 +65,20 @@
],
"bdshot_outputs": [],
"bdshot_output_only": []
},
{
"group": 4,
"timer": "Timer1",
"outputs": [
9
],
"dshot": false,
"dshot_outputs": [],
"non_dshot_outputs": [
9
],
"bdshot_outputs": [],
"bdshot_output_only": []
}
],
"serial_ports": [
@@ -65,6 +65,20 @@
],
"bdshot_outputs": [],
"bdshot_output_only": []
},
{
"group": 4,
"timer": "Timer1",
"outputs": [
9
],
"dshot": false,
"dshot_outputs": [],
"non_dshot_outputs": [
9
],
"bdshot_outputs": [],
"bdshot_output_only": []
}
],
"serial_ports": [
@@ -65,6 +65,20 @@
],
"bdshot_outputs": [],
"bdshot_output_only": []
},
{
"group": 4,
"timer": "Timer1",
"outputs": [
9
],
"dshot": false,
"dshot_outputs": [],
"non_dshot_outputs": [
9
],
"bdshot_outputs": [],
"bdshot_output_only": []
}
],
"serial_ports": [
@@ -120,3 +120,9 @@ def board_stm32h7_variant():
def board_stm32h7_graceful_fail():
"""STM32H7, graceful-fail pattern: BMI088 starts unconditionally AND in VD000000 block."""
return FIXTURES_DIR / "stm32h7_graceful_fail"
@pytest.fixture(scope="session")
def board_stm32h7_capture_channels():
"""STM32H7, 16 outputs: 8 regular (DShot) + 8 initIOTimerChannelCapture (no DShot)."""
return FIXTURES_DIR / "stm32h7_capture_channels"
@@ -0,0 +1 @@
# minimal fixture for capture-channel parser test
@@ -0,0 +1,3 @@
CONFIG_ARCH_CHIP_STM32H7=y
CONFIG_MMCSD=y
CONFIG_MMCSD_SDIO=y
@@ -0,0 +1,2 @@
#define DIRECT_PWM_OUTPUT_CHANNELS 16
#define BOARD_NUM_IO_TIMERS 5
@@ -0,0 +1,36 @@
#include <px4_arch/io_timer_hw_description.h>
/* Fixture modelling boards like cuav/x25-evo that use initIOTimerChannelCapture
* for their higher-numbered outputs. Timer5 and Timer4 have DMA (DShot); the
* remaining three timers do not.
*/
constexpr io_timers_t io_timers[MAX_IO_TIMERS] = {
initIOTimer(Timer::Timer5, DMA{DMA::Index1}),
initIOTimer(Timer::Timer4, DMA{DMA::Index1}),
initIOTimer(Timer::Timer1),
initIOTimer(Timer::Timer8),
initIOTimer(Timer::Timer12),
};
constexpr timer_io_channels_t timer_io_channels[MAX_TIMER_IO_CHANNELS] = {
initIOTimerChannel(io_timers, {Timer::Timer5, Timer::Channel4}, {}),
initIOTimerChannel(io_timers, {Timer::Timer5, Timer::Channel3}, {}),
initIOTimerChannel(io_timers, {Timer::Timer5, Timer::Channel2}, {}),
initIOTimerChannel(io_timers, {Timer::Timer5, Timer::Channel1}, {}),
initIOTimerChannel(io_timers, {Timer::Timer4, Timer::Channel2}, {}),
initIOTimerChannel(io_timers, {Timer::Timer4, Timer::Channel3}, {}),
initIOTimerChannel(io_timers, {Timer::Timer4, Timer::Channel1}, {}),
initIOTimerChannel(io_timers, {Timer::Timer4, Timer::Channel4}, {}),
initIOTimerChannelCapture(io_timers, {Timer::Timer1, Timer::Channel2}, {}),
initIOTimerChannelCapture(io_timers, {Timer::Timer1, Timer::Channel1}, {}),
initIOTimerChannelCapture(io_timers, {Timer::Timer1, Timer::Channel3}, {}),
initIOTimerChannelCapture(io_timers, {Timer::Timer8, Timer::Channel2}, {}),
initIOTimerChannelCapture(io_timers, {Timer::Timer8, Timer::Channel3}, {}),
initIOTimerChannelCapture(io_timers, {Timer::Timer8, Timer::Channel1}, {}),
initIOTimerChannelCapture(io_timers, {Timer::Timer12, Timer::Channel1}, {}),
initIOTimerChannelCapture(io_timers, {Timer::Timer12, Timer::Channel2}, {}),
};
constexpr io_timers_channel_mapping_t io_timers_channel_mapping =
initIOTimerChannelMapping(io_timers, timer_io_channels);
@@ -337,7 +337,7 @@ For more information see [Basic Concepts > SD Cards (Removable Memory)](../getti
### Interfaces
- **PWM outputs**: 16 (8 FMU + 8 IO)
- **PWM outputs**: 17 (9 FMU + 8 IO)
- **Serial ports**: 8
- **I2C ports**: 4
- ICP-20100 (barometer, internal)
@@ -350,7 +350,7 @@ For more information see [Basic Concepts > SD Cards (Removable Memory)](../getti
- ICM-42688P (IMU)
- **CAN buses**: 2
- **USB**: Yes
- **RC input**: PPM
- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST, PPM (via IO)
- **Analog battery inputs**: 2
- **Additional analog inputs**: TODO: number of additional analog inputs
- **Ethernet**: Yes
@@ -375,7 +375,7 @@ For more information see [Basic Concepts > SD Cards (Removable Memory)](../getti
"chip_model": "STM32H753",
"has_io_board": true,
"total_outputs": 9,
"fmu_servo_outputs": 8,
"fmu_servo_outputs": 9,
"io_outputs": 8,
"has_sd_card": true,
"has_ethernet": true,
@@ -465,14 +465,15 @@ This flight controller supports up to 9 FMU PWM outputs (AUX) and 8 IO PWM outpu
FMU Outputs:
- Outputs 1-6 support [DShot](../peripherals/dshot.md).
- Outputs 7-8 do not support DShot.
- Outputs 7-9 do not support DShot.
- Outputs 1-6 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry).
The 9 outputs are in 3 groups:
The 9 outputs are in 4 groups:
- Outputs 1-4 in group1 (Timer5)
- Outputs 5-6 in group2 (Timer4)
- Outputs 7-8 in group3 (Timer12)
- Output 9 in group4 (Timer1)
All outputs within the same group must use the same output protocol and rate.
```
@@ -663,14 +664,15 @@ This flight controller supports up to 9 FMU PWM outputs (AUX) and 8 IO PWM outpu
FMU Outputs:
- Outputs 1-6 support [DShot](../peripherals/dshot.md).
- Outputs 7-8 do not support DShot.
- Outputs 7-9 do not support DShot.
- Outputs 1-6 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry).
The 9 outputs are in 3 groups:
The 9 outputs are in 4 groups:
- Outputs 1-4 in group1 (Timer5)
- Outputs 5-6 in group2 (Timer4)
- Outputs 7-8 in group3 (Timer12)
- Output 9 in group4 (Timer1)
All outputs within the same group must use the same output protocol and rate.
-->
@@ -1291,7 +1293,7 @@ Serial port mapping could not be determined from source.
### Interfaces
- **PWM outputs**: 16 (8 FMU + 8 IO)
- **PWM outputs**: 17 (9 FMU + 8 IO)
- **Serial ports**: 8
- **I2C ports**: 4
- BMP388 (barometer, internal)
@@ -1299,7 +1301,7 @@ Serial port mapping could not be determined from source.
- **SPI buses**: 5
- **CAN buses**: 2
- **USB**: Yes
- **RC input**: DSM/SRXL2, S.Bus/CPPM
- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST, PPM (via IO)
- **Analog battery inputs**: 2
- **Additional analog inputs**: TODO: number of additional analog inputs
- **Ethernet**: Yes
@@ -1324,7 +1326,7 @@ Serial port mapping could not be determined from source.
"chip_model": "STM32H753",
"has_io_board": true,
"total_outputs": 9,
"fmu_servo_outputs": 8,
"fmu_servo_outputs": 9,
"io_outputs": 8,
"has_sd_card": true,
"has_ethernet": true,
@@ -1413,14 +1415,15 @@ This flight controller supports up to 9 FMU PWM outputs (AUX) and 8 IO PWM outpu
FMU Outputs:
- Outputs 1-6 support [DShot](../peripherals/dshot.md).
- Outputs 7-8 do not support DShot.
- Outputs 7-9 do not support DShot.
- Outputs 1-6 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry).
The 9 outputs are in 3 groups:
The 9 outputs are in 4 groups:
- Outputs 1-4 in group1 (Timer5)
- Outputs 5-6 in group2 (Timer4)
- Outputs 7-8 in group3 (Timer12)
- Output 9 in group4 (Timer1)
All outputs within the same group must use the same output protocol and rate.
```
@@ -1617,14 +1620,15 @@ This flight controller supports up to 9 FMU PWM outputs (AUX) and 8 IO PWM outpu
FMU Outputs:
- Outputs 1-6 support [DShot](../peripherals/dshot.md).
- Outputs 7-8 do not support DShot.
- Outputs 7-9 do not support DShot.
- Outputs 1-6 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry).
The 9 outputs are in 3 groups:
The 9 outputs are in 4 groups:
- Outputs 1-4 in group1 (Timer5)
- Outputs 5-6 in group2 (Timer4)
- Outputs 7-8 in group3 (Timer12)
- Output 9 in group4 (Timer1)
All outputs within the same group must use the same output protocol and rate.
-->
@@ -2616,7 +2620,7 @@ For more information see [Basic Concepts > SD Cards (Removable Memory)](../getti
### Interfaces
- **PWM outputs**: 9 (FMU)
- **PWM outputs**: 10 (FMU)
- **Serial ports**: 7
- **I2C ports**: 2
- BMP388 (barometer, internal, bus 4)
@@ -2649,7 +2653,7 @@ For more information see [Basic Concepts > SD Cards (Removable Memory)](../getti
"chip_model": "STM32H743",
"has_io_board": false,
"total_outputs": 10,
"fmu_servo_outputs": 9,
"fmu_servo_outputs": 10,
"io_outputs": 0,
"has_sd_card": true,
"has_ethernet": true,
@@ -2732,14 +2736,15 @@ This flight controller supports up to 10 FMU PWM outputs (MAIN).
Outputs:
- Outputs 1-8 support [DShot](../peripherals/dshot.md).
- Output 9 does not support DShot.
- Outputs 9-10 do not support DShot.
- Outputs 1-8 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry).
The 10 outputs are in 3 groups:
The 10 outputs are in 4 groups:
- Outputs 1-4 in group1 (Timer1)
- Outputs 5-8 in group2 (Timer3)
- Output 9 in group3 (Timer5)
- Output 10 in group4 (Timer8)
All outputs within the same group must use the same output protocol and rate.
```
@@ -2933,7 +2938,7 @@ For more information see [Basic Concepts > SD Cards (Removable Memory)](../getti
### Interfaces
- **PWM outputs**: 16 (8 FMU + 8 IO)
- **PWM outputs**: 17 (9 FMU + 8 IO)
- **Serial ports**: 8
- **I2C ports**: 4
- BMP388 (barometer, internal)
@@ -2946,7 +2951,7 @@ For more information see [Basic Concepts > SD Cards (Removable Memory)](../getti
- ICM-20602 (IMU)
- **CAN buses**: 2
- **USB**: Yes
- **RC input**: DSM/SRXL2, S.Bus/CPPM
- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST, PPM (via IO)
- **Analog battery inputs**: 2
- **Additional analog inputs**: TODO: number of additional analog inputs
- **Ethernet**: Yes
@@ -2970,7 +2975,7 @@ For more information see [Basic Concepts > SD Cards (Removable Memory)](../getti
"chip_model": "STM32H753",
"has_io_board": true,
"total_outputs": 9,
"fmu_servo_outputs": 8,
"fmu_servo_outputs": 9,
"io_outputs": 8,
"has_sd_card": true,
"has_ethernet": true,
@@ -3056,14 +3061,15 @@ This flight controller supports up to 9 FMU PWM outputs (AUX) and 8 IO PWM outpu
FMU Outputs:
- Outputs 1-6 support [DShot](../peripherals/dshot.md).
- Outputs 7-8 do not support DShot.
- Outputs 7-9 do not support DShot.
- Outputs 1-6 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry).
The 9 outputs are in 3 groups:
The 9 outputs are in 4 groups:
- Outputs 1-4 in group1 (Timer5)
- Outputs 5-6 in group2 (Timer4)
- Outputs 7-8 in group3 (Timer12)
- Output 9 in group4 (Timer1)
All outputs within the same group must use the same output protocol and rate.
```
@@ -4478,7 +4484,7 @@ All outputs within the same group must use the same output protocol and rate.
### Interfaces
- **PWM outputs**: 8 (FMU)
- **PWM outputs**: 14 (FMU)
- **Serial ports**: 7
- **I2C ports**: 4
- ICP-20100 (barometer, internal)
@@ -4514,7 +4520,7 @@ All outputs within the same group must use the same output protocol and rate.
"chip_model": "STM32H753",
"has_io_board": false,
"total_outputs": 14,
"fmu_servo_outputs": 8,
"fmu_servo_outputs": 14,
"io_outputs": 0,
"has_sd_card": true,
"has_ethernet": true,
@@ -4599,14 +4605,17 @@ This flight controller supports up to 14 FMU PWM outputs (MAIN).
Outputs:
- Outputs 1-6 support [DShot](../peripherals/dshot.md).
- Outputs 7-8 do not support DShot.
- Outputs 7-14 do not support DShot.
- Outputs 1-6 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry).
The 14 outputs are in 3 groups:
The 14 outputs are in 6 groups:
- Outputs 1-4 in group1 (Timer5)
- Outputs 5-6 in group2 (Timer4)
- Outputs 7-8 in group3 (Timer1)
- Outputs 9-11 in group4 (Timer8)
- Output 12 in group5 (Timer15)
- Outputs 13-14 in group6 (Timer12)
All outputs within the same group must use the same output protocol and rate.
```
@@ -4808,7 +4817,7 @@ For more information see [Basic Concepts > SD Cards (Removable Memory)](../getti
### Interfaces
- **PWM outputs**: 16 (8 FMU + 8 IO)
- **PWM outputs**: 17 (9 FMU + 8 IO)
- **Serial ports**: 8
- **I2C ports**: 4
- BMP581 (barometer, external, bus 2)
@@ -4821,7 +4830,7 @@ For more information see [Basic Concepts > SD Cards (Removable Memory)](../getti
- ICM-45686 (IMU)
- **CAN buses**: 2
- **USB**: Yes
- **RC input**: PPM
- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST, PPM (via IO)
- **Analog battery inputs**: 2
- **Additional analog inputs**: TODO: number of additional analog inputs
- **Ethernet**: Yes
@@ -4846,7 +4855,7 @@ For more information see [Basic Concepts > SD Cards (Removable Memory)](../getti
"chip_model": "STM32H753",
"has_io_board": true,
"total_outputs": 9,
"fmu_servo_outputs": 8,
"fmu_servo_outputs": 9,
"io_outputs": 8,
"has_sd_card": true,
"has_ethernet": true,
@@ -4934,14 +4943,15 @@ This flight controller supports up to 9 FMU PWM outputs (AUX) and 8 IO PWM outpu
FMU Outputs:
- Outputs 1-6 support [DShot](../peripherals/dshot.md).
- Outputs 7-8 do not support DShot.
- Outputs 7-9 do not support DShot.
- Outputs 1-6 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry).
The 9 outputs are in 3 groups:
The 9 outputs are in 4 groups:
- Outputs 1-4 in group1 (Timer5)
- Outputs 5-6 in group2 (Timer4)
- Outputs 7-8 in group3 (Timer12)
- Output 9 in group4 (Timer1)
All outputs within the same group must use the same output protocol and rate.
```
@@ -5132,14 +5142,15 @@ This flight controller supports up to 9 FMU PWM outputs (AUX) and 8 IO PWM outpu
FMU Outputs:
- Outputs 1-6 support [DShot](../peripherals/dshot.md).
- Outputs 7-8 do not support DShot.
- Outputs 7-9 do not support DShot.
- Outputs 1-6 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry).
The 9 outputs are in 3 groups:
The 9 outputs are in 4 groups:
- Outputs 1-4 in group1 (Timer5)
- Outputs 5-6 in group2 (Timer4)
- Outputs 7-8 in group3 (Timer12)
- Output 9 in group4 (Timer1)
All outputs within the same group must use the same output protocol and rate.
-->
@@ -5526,7 +5537,7 @@ All outputs within the same group must use the same output protocol and rate.
### Interfaces
- **PWM outputs**: 8 (FMU)
- **PWM outputs**: 16 (FMU)
- **Serial ports**: 8
- **I2C ports**: 4
- ICP-20100 (barometer, internal, bus 4)
@@ -5562,7 +5573,7 @@ All outputs within the same group must use the same output protocol and rate.
"chip_model": "STM32H743",
"has_io_board": false,
"total_outputs": 16,
"fmu_servo_outputs": 8,
"fmu_servo_outputs": 16,
"io_outputs": 0,
"has_sd_card": true,
"has_ethernet": true,
@@ -5648,13 +5659,17 @@ This flight controller supports up to 16 FMU PWM outputs (MAIN).
Outputs:
- Outputs 1-8 support [DShot](../peripherals/dshot.md).
- Outputs 9-16 do not support DShot.
- Outputs 1-7 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry).
- Output 8 supports Bidirectional DShot output only (no eRPM capture).
The 16 outputs are in 2 groups:
The 16 outputs are in 5 groups:
- Outputs 1-4 in group1 (Timer5)
- Outputs 5-8 in group2 (Timer4)
- Outputs 9-11 in group3 (Timer1)
- Outputs 12-14 in group4 (Timer8)
- Outputs 15-16 in group5 (Timer12)
All outputs within the same group must use the same output protocol and rate.
```
@@ -5841,13 +5856,17 @@ This flight controller supports up to 16 FMU PWM outputs (MAIN).
Outputs:
- Outputs 1-8 support [DShot](../peripherals/dshot.md).
- Outputs 9-16 do not support DShot.
- Outputs 1-7 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry).
- Output 8 supports Bidirectional DShot output only (no eRPM capture).
The 16 outputs are in 2 groups:
The 16 outputs are in 5 groups:
- Outputs 1-4 in group1 (Timer5)
- Outputs 5-8 in group2 (Timer4)
- Outputs 9-11 in group3 (Timer1)
- Outputs 12-14 in group4 (Timer8)
- Outputs 15-16 in group5 (Timer12)
All outputs within the same group must use the same output protocol and rate.
-->
@@ -5876,7 +5895,7 @@ All outputs within the same group must use the same output protocol and rate.
### Interfaces
- **PWM outputs**: 8 (FMU)
- **PWM outputs**: 16 (FMU)
- **Serial ports**: 8
- **I2C ports**: 4
- ICP-20100 (barometer, internal, bus 4)
@@ -5912,7 +5931,7 @@ All outputs within the same group must use the same output protocol and rate.
"chip_model": "STM32H743",
"has_io_board": false,
"total_outputs": 16,
"fmu_servo_outputs": 8,
"fmu_servo_outputs": 16,
"io_outputs": 0,
"has_sd_card": true,
"has_ethernet": true,
@@ -5997,13 +6016,17 @@ This flight controller supports up to 16 FMU PWM outputs (MAIN).
Outputs:
- Outputs 1-8 support [DShot](../peripherals/dshot.md).
- Outputs 9-16 do not support DShot.
- Outputs 1-7 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry).
- Output 8 supports Bidirectional DShot output only (no eRPM capture).
The 16 outputs are in 2 groups:
The 16 outputs are in 5 groups:
- Outputs 1-4 in group1 (Timer5)
- Outputs 5-8 in group2 (Timer4)
- Outputs 9-11 in group3 (Timer1)
- Outputs 12-14 in group4 (Timer8)
- Outputs 15-16 in group5 (Timer12)
All outputs within the same group must use the same output protocol and rate.
```
@@ -6190,13 +6213,17 @@ This flight controller supports up to 16 FMU PWM outputs (MAIN).
Outputs:
- Outputs 1-8 support [DShot](../peripherals/dshot.md).
- Outputs 9-16 do not support DShot.
- Outputs 1-7 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry).
- Output 8 supports Bidirectional DShot output only (no eRPM capture).
The 16 outputs are in 2 groups:
The 16 outputs are in 5 groups:
- Outputs 1-4 in group1 (Timer5)
- Outputs 5-8 in group2 (Timer4)
- Outputs 9-11 in group3 (Timer1)
- Outputs 12-14 in group4 (Timer8)
- Outputs 15-16 in group5 (Timer12)
All outputs within the same group must use the same output protocol and rate.
-->
@@ -6596,6 +6623,7 @@ All outputs within the same group must use the same output protocol and rate.
- MS5611 (barometer)
- **CAN buses**: 2
- **USB**: Yes
- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST (via IO)
- **Analog battery inputs**: 2
- **Additional analog inputs**: TODO: number of additional analog inputs
@@ -6932,6 +6960,7 @@ All outputs within the same group must use the same output protocol and rate.
- MS5611 (barometer)
- **CAN buses**: 2
- **USB**: Yes
- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST (via IO)
- **Analog battery inputs**: 2
- **Additional analog inputs**: TODO: number of additional analog inputs
@@ -7270,6 +7299,7 @@ All outputs within the same group must use the same output protocol and rate.
- MS5611 (barometer)
- **CAN buses**: 2
- **USB**: Yes
- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST (via IO)
- **Analog battery inputs**: 2
- **Additional analog inputs**: TODO: number of additional analog inputs
@@ -9642,7 +9672,7 @@ For more information see [Basic Concepts > SD Cards (Removable Memory)](../getti
### Interfaces
- **PWM outputs**: 13 (5 FMU + 8 IO)
- **PWM outputs**: 18 (10 FMU + 8 IO)
- **Serial ports**: 7
- **I2C ports**: 4
- IST8310 (magnetometer, internal)
@@ -9652,6 +9682,7 @@ For more information see [Basic Concepts > SD Cards (Removable Memory)](../getti
- MS5611 (barometer)
- **CAN buses**: 2
- **USB**: Yes
- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST (via IO)
- **Analog battery inputs**: 2
- **Additional analog inputs**: TODO: number of additional analog inputs
@@ -9675,7 +9706,7 @@ For more information see [Basic Concepts > SD Cards (Removable Memory)](../getti
"chip_model": "STM32H743",
"has_io_board": true,
"total_outputs": 10,
"fmu_servo_outputs": 5,
"fmu_servo_outputs": 10,
"io_outputs": 8,
"has_sd_card": true,
"has_ethernet": false,
@@ -9758,12 +9789,18 @@ For battery and power module configuration see [Battery and Power Module Setup](
This flight controller supports up to 10 FMU PWM outputs (AUX) and 8 IO PWM outputs (MAIN).
All FMU outputs support [DShot](../peripherals/dshot.md) and [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry).
FMU Outputs:
The 10 outputs are in 2 groups:
- Outputs 1-5 support [DShot](../peripherals/dshot.md).
- Outputs 6-10 do not support DShot.
- Outputs 1-5 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry).
The 10 outputs are in 4 groups:
- Outputs 1-4 in group1 (Timer1)
- Output 5 in group2 (Timer4)
- Outputs 6-8 in group3 (Timer2)
- Outputs 9-10 in group4 (Timer12)
All outputs within the same group must use the same output protocol and rate.
```
@@ -9945,12 +9982,18 @@ For more information see [Basic Concepts > SD Cards (Removable Memory)](../getti
This flight controller supports up to 10 FMU PWM outputs (AUX) and 8 IO PWM outputs (MAIN).
All FMU outputs support [DShot](../peripherals/dshot.md) and [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry).
FMU Outputs:
The 10 outputs are in 2 groups:
- Outputs 1-5 support [DShot](../peripherals/dshot.md).
- Outputs 6-10 do not support DShot.
- Outputs 1-5 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry).
The 10 outputs are in 4 groups:
- Outputs 1-4 in group1 (Timer1)
- Output 5 in group2 (Timer4)
- Outputs 6-8 in group3 (Timer2)
- Outputs 9-10 in group4 (Timer12)
All outputs within the same group must use the same output protocol and rate.
-->
@@ -11970,7 +12013,7 @@ All outputs within the same group must use the same output protocol and rate.
### Interfaces
- **PWM outputs**: 16 (8 FMU + 8 IO)
- **PWM outputs**: 19 (11 FMU + 8 IO)
- **Serial ports**: 7
- **I2C ports**: 4
- IST8310 (magnetometer, internal)
@@ -11982,7 +12025,7 @@ All outputs within the same group must use the same output protocol and rate.
- MS5611 (barometer)
- **CAN buses**: 3
- **USB**: Yes
- **RC input**: PPM
- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST, PPM (via IO)
- **Analog battery inputs**: 2
- **Additional analog inputs**: TODO: number of additional analog inputs
@@ -12005,7 +12048,7 @@ All outputs within the same group must use the same output protocol and rate.
"chip_model": "STM32F765",
"has_io_board": true,
"total_outputs": 11,
"fmu_servo_outputs": 8,
"fmu_servo_outputs": 11,
"io_outputs": 8,
"has_sd_card": true,
"has_ethernet": false,
@@ -12091,14 +12134,15 @@ This flight controller supports up to 11 FMU PWM outputs (AUX) and 8 IO PWM outp
FMU Outputs:
- Outputs 1-4 support [DShot](../peripherals/dshot.md).
- Outputs 5-8 do not support DShot.
- Outputs 5-11 do not support DShot.
- Outputs 1-4 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry).
The 11 outputs are in 3 groups:
The 11 outputs are in 4 groups:
- Outputs 1-4 in group1 (Timer1)
- Outputs 5-6 in group2 (Timer4)
- Outputs 7-8 in group3 (Timer12)
- Outputs 9-11 in group4 (Timer2)
All outputs within the same group must use the same output protocol and rate.
```
@@ -12283,14 +12327,15 @@ This flight controller supports up to 11 FMU PWM outputs (AUX) and 8 IO PWM outp
FMU Outputs:
- Outputs 1-4 support [DShot](../peripherals/dshot.md).
- Outputs 5-8 do not support DShot.
- Outputs 5-11 do not support DShot.
- Outputs 1-4 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry).
The 11 outputs are in 3 groups:
The 11 outputs are in 4 groups:
- Outputs 1-4 in group1 (Timer1)
- Outputs 5-6 in group2 (Timer4)
- Outputs 7-8 in group3 (Timer12)
- Outputs 9-11 in group4 (Timer2)
All outputs within the same group must use the same output protocol and rate.
-->
@@ -15173,7 +15218,7 @@ All outputs within the same group must use the same output protocol and rate.
- ICM-42688P (IMU)
- **CAN buses**: 1
- **USB**: Yes
- **RC input**: PPM
- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST, PPM (via IO)
- **Analog battery inputs**: 1
- **Additional analog inputs**: TODO: number of additional analog inputs
@@ -17683,6 +17728,7 @@ All outputs within the same group must use the same output protocol and rate.
- MPU-9250 (IMU)
- MS5611 (barometer)
- **USB**: Yes
- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST (via IO)
- **Analog battery inputs**: 1
- **Additional analog inputs**: TODO: number of additional analog inputs
@@ -17990,6 +18036,7 @@ All outputs within the same group must use the same output protocol and rate.
- MPU-9250 (IMU)
- MS5611 (barometer)
- **USB**: Yes
- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST (via IO)
- **Analog battery inputs**: 1
- **Additional analog inputs**: TODO: number of additional analog inputs
@@ -20816,6 +20863,7 @@ All outputs within the same group must use the same output protocol and rate.
- MS5611 (barometer)
- HMC5883L (magnetometer)
- **USB**: Yes
- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST (via IO)
- **Analog battery inputs**: 1
- **Additional analog inputs**: TODO: number of additional analog inputs
@@ -21122,6 +21170,7 @@ All outputs within the same group must use the same output protocol and rate.
- MS5611 (barometer)
- HMC5883L (magnetometer)
- **USB**: Yes
- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST (via IO)
- **Analog battery inputs**: 1
- **Additional analog inputs**: TODO: number of additional analog inputs
@@ -21728,7 +21777,7 @@ All outputs within the same group must use the same output protocol and rate.
- MS5611 (barometer)
- LIS3MDL (magnetometer)
- **USB**: Yes
- **RC input**: PPM
- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST, PPM (via IO)
- **Analog battery inputs**: 2
- **Additional analog inputs**: TODO: number of additional analog inputs
@@ -22032,7 +22081,7 @@ All outputs within the same group must use the same output protocol and rate.
### Interfaces
- **PWM outputs**: 16 (8 FMU + 8 IO)
- **PWM outputs**: 19 (11 FMU + 8 IO)
- **Serial ports**: 7
- **I2C ports**: 4
- IST8310 (magnetometer, internal)
@@ -22043,7 +22092,7 @@ All outputs within the same group must use the same output protocol and rate.
- MS5611 (barometer)
- **CAN buses**: 3
- **USB**: Yes
- **RC input**: DSM/SRXL2, S.Bus/CPPM
- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST, PPM (via IO)
- **Analog battery inputs**: 2
- **Additional analog inputs**: TODO: number of additional analog inputs
@@ -22067,7 +22116,7 @@ All outputs within the same group must use the same output protocol and rate.
"chip_model": "STM32F765",
"has_io_board": true,
"total_outputs": 11,
"fmu_servo_outputs": 8,
"fmu_servo_outputs": 11,
"io_outputs": 8,
"has_sd_card": true,
"has_ethernet": false,
@@ -22154,14 +22203,15 @@ This flight controller supports up to 11 FMU PWM outputs (AUX) and 8 IO PWM outp
FMU Outputs:
- Outputs 1-4 support [DShot](../peripherals/dshot.md).
- Outputs 5-8 do not support DShot.
- Outputs 5-11 do not support DShot.
- Outputs 1-4 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry).
The 11 outputs are in 3 groups:
The 11 outputs are in 4 groups:
- Outputs 1-4 in group1 (Timer1)
- Outputs 5-6 in group2 (Timer4)
- Outputs 7-8 in group3 (Timer12)
- Outputs 9-11 in group4 (Timer2)
All outputs within the same group must use the same output protocol and rate.
```
@@ -22345,14 +22395,15 @@ This flight controller supports up to 11 FMU PWM outputs (AUX) and 8 IO PWM outp
FMU Outputs:
- Outputs 1-4 support [DShot](../peripherals/dshot.md).
- Outputs 5-8 do not support DShot.
- Outputs 5-11 do not support DShot.
- Outputs 1-4 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry).
The 11 outputs are in 3 groups:
The 11 outputs are in 4 groups:
- Outputs 1-4 in group1 (Timer1)
- Outputs 5-6 in group2 (Timer4)
- Outputs 7-8 in group3 (Timer12)
- Outputs 9-11 in group4 (Timer2)
All outputs within the same group must use the same output protocol and rate.
-->
@@ -22382,7 +22433,7 @@ All outputs within the same group must use the same output protocol and rate.
### Interfaces
- **PWM outputs**: 16 (8 FMU + 8 IO)
- **PWM outputs**: 17 (9 FMU + 8 IO)
- **Serial ports**: 8
- **I2C ports**: 4
- BMM150 (magnetometer, internal)
@@ -22392,7 +22443,7 @@ All outputs within the same group must use the same output protocol and rate.
- ICM-20602 (IMU)
- **CAN buses**: 2
- **USB**: Yes
- **RC input**: DSM/SRXL2, S.Bus/CPPM
- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST, PPM (via IO)
- **Analog battery inputs**: 2
- **Additional analog inputs**: TODO: number of additional analog inputs
- **Ethernet**: Yes
@@ -22417,7 +22468,7 @@ All outputs within the same group must use the same output protocol and rate.
"chip_model": "STM32F765",
"has_io_board": true,
"total_outputs": 9,
"fmu_servo_outputs": 8,
"fmu_servo_outputs": 9,
"io_outputs": 8,
"has_sd_card": true,
"has_ethernet": true,
@@ -22508,14 +22559,15 @@ This flight controller supports up to 9 FMU PWM outputs (AUX) and 8 IO PWM outpu
FMU Outputs:
- Outputs 1-6 support [DShot](../peripherals/dshot.md).
- Outputs 7-8 do not support DShot.
- Outputs 7-9 do not support DShot.
- Outputs 1-6 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry).
The 9 outputs are in 3 groups:
The 9 outputs are in 4 groups:
- Outputs 1-4 in group1 (Timer1)
- Outputs 5-6 in group2 (Timer4)
- Outputs 7-8 in group3 (Timer12)
- Output 9 in group4 (Timer5)
All outputs within the same group must use the same output protocol and rate.
```
@@ -22711,14 +22763,15 @@ This flight controller supports up to 9 FMU PWM outputs (AUX) and 8 IO PWM outpu
FMU Outputs:
- Outputs 1-6 support [DShot](../peripherals/dshot.md).
- Outputs 7-8 do not support DShot.
- Outputs 7-9 do not support DShot.
- Outputs 1-6 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry).
The 9 outputs are in 3 groups:
The 9 outputs are in 4 groups:
- Outputs 1-4 in group1 (Timer1)
- Outputs 5-6 in group2 (Timer4)
- Outputs 7-8 in group3 (Timer12)
- Output 9 in group4 (Timer5)
All outputs within the same group must use the same output protocol and rate.
-->
@@ -22758,6 +22811,7 @@ All outputs within the same group must use the same output protocol and rate.
- ICM-42688P (IMU)
- **CAN buses**: 2
- **USB**: Yes
- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST (via IO)
- **Analog battery inputs**: 2
- **Additional analog inputs**: TODO: number of additional analog inputs
@@ -23097,7 +23151,7 @@ All outputs within the same group must use the same output protocol and rate.
### Interfaces
- **PWM outputs**: 8 (FMU)
- **PWM outputs**: 9 (FMU)
- **Serial ports**: 8
- **I2C ports**: 4
- BMP388 (barometer, internal)
@@ -23132,7 +23186,7 @@ All outputs within the same group must use the same output protocol and rate.
"chip_model": "STM32H753",
"has_io_board": false,
"total_outputs": 9,
"fmu_servo_outputs": 8,
"fmu_servo_outputs": 9,
"io_outputs": 0,
"has_sd_card": true,
"has_ethernet": false,
@@ -23218,14 +23272,15 @@ This flight controller supports up to 9 FMU PWM outputs (MAIN).
Outputs:
- Outputs 1-6 support [DShot](../peripherals/dshot.md).
- Outputs 7-8 do not support DShot.
- Outputs 7-9 do not support DShot.
- Outputs 1-6 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry).
The 9 outputs are in 3 groups:
The 9 outputs are in 4 groups:
- Outputs 1-4 in group1 (Timer5)
- Outputs 5-6 in group2 (Timer4)
- Outputs 7-8 in group3 (Timer12)
- Output 9 in group4 (Timer1)
All outputs within the same group must use the same output protocol and rate.
```
@@ -23413,14 +23468,15 @@ This flight controller supports up to 9 FMU PWM outputs (MAIN).
Outputs:
- Outputs 1-6 support [DShot](../peripherals/dshot.md).
- Outputs 7-8 do not support DShot.
- Outputs 7-9 do not support DShot.
- Outputs 1-6 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry).
The 9 outputs are in 3 groups:
The 9 outputs are in 4 groups:
- Outputs 1-4 in group1 (Timer5)
- Outputs 5-6 in group2 (Timer4)
- Outputs 7-8 in group3 (Timer12)
- Output 9 in group4 (Timer1)
All outputs within the same group must use the same output protocol and rate.
-->
@@ -23450,14 +23506,14 @@ All outputs within the same group must use the same output protocol and rate.
### Interfaces
- **PWM outputs**: 16 (8 FMU + 8 IO)
- **PWM outputs**: 17 (9 FMU + 8 IO)
- **Serial ports**: 8
- **I2C ports**: 4
- IST8310 (magnetometer, external, bus 1)
- **SPI buses**: 5
- **CAN buses**: 2
- **USB**: Yes
- **RC input**: DSM/SRXL2, S.Bus/CPPM
- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST, PPM (via IO)
- **Analog battery inputs**: 2
- **Additional analog inputs**: TODO: number of additional analog inputs
- **Ethernet**: Yes
@@ -23482,7 +23538,7 @@ All outputs within the same group must use the same output protocol and rate.
"chip_model": "STM32H753",
"has_io_board": true,
"total_outputs": 9,
"fmu_servo_outputs": 8,
"fmu_servo_outputs": 9,
"io_outputs": 8,
"has_sd_card": true,
"has_ethernet": true,
@@ -23574,14 +23630,15 @@ This flight controller supports up to 9 FMU PWM outputs (AUX) and 8 IO PWM outpu
FMU Outputs:
- Outputs 1-6 support [DShot](../peripherals/dshot.md).
- Outputs 7-8 do not support DShot.
- Outputs 7-9 do not support DShot.
- Outputs 1-6 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry).
The 9 outputs are in 3 groups:
The 9 outputs are in 4 groups:
- Outputs 1-4 in group1 (Timer5)
- Outputs 5-6 in group2 (Timer4)
- Outputs 7-8 in group3 (Timer12)
- Output 9 in group4 (Timer1)
All outputs within the same group must use the same output protocol and rate.
```
@@ -23777,14 +23834,15 @@ This flight controller supports up to 9 FMU PWM outputs (AUX) and 8 IO PWM outpu
FMU Outputs:
- Outputs 1-6 support [DShot](../peripherals/dshot.md).
- Outputs 7-8 do not support DShot.
- Outputs 7-9 do not support DShot.
- Outputs 1-6 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry).
The 9 outputs are in 3 groups:
The 9 outputs are in 4 groups:
- Outputs 1-4 in group1 (Timer5)
- Outputs 5-6 in group2 (Timer4)
- Outputs 7-8 in group3 (Timer12)
- Output 9 in group4 (Timer1)
All outputs within the same group must use the same output protocol and rate.
-->
@@ -23822,7 +23880,7 @@ All outputs within the same group must use the same output protocol and rate.
- IST8310 (magnetometer, external, bus 1)
- **SPI buses**: 4
- **USB**: TODO: confirm USB connector type
- **RC input**: DSM/SRXL2, S.Bus/CPPM
- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST, PPM (via IO)
- **Analog battery inputs**: 2
- **Additional analog inputs**: TODO: number of additional analog inputs
- **Ethernet**: Yes
@@ -24460,7 +24518,7 @@ Serial port mapping could not be determined from source.
- BMI088 (IMU)
- **CAN buses**: 2
- **USB**: Yes
- **RC input**: DSM/SRXL2, S.Bus
- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST (via IO)
- **Analog battery inputs**: 1
- **Additional analog inputs**: TODO: number of additional analog inputs
@@ -25072,6 +25130,7 @@ Serial port mapping could not be determined from source.
- MS5611 (barometer)
- **CAN buses**: 1
- **USB**: Yes
- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST (via IO)
- **Analog battery inputs**: 1
- **Additional analog inputs**: TODO: number of additional analog inputs
@@ -25385,7 +25444,7 @@ For more information see [Basic Concepts > SD Cards (Removable Memory)](../getti
- MPU-9250 (IMU)
- **CAN buses**: 2
- **USB**: Yes
- **RC input**: PPM
- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST, PPM (via IO)
- **Analog battery inputs**: 1
- **Additional analog inputs**: TODO: number of additional analog inputs
- **Ethernet**: Yes
@@ -26044,7 +26103,7 @@ All outputs within the same group must use the same output protocol and rate.
### Interfaces
- **PWM outputs**: 16 (8 FMU + 8 IO)
- **PWM outputs**: 17 (9 FMU + 8 IO)
- **Serial ports**: 8
- **I2C ports**: 4
- ICP-20100 (barometer, external)
@@ -26057,7 +26116,7 @@ All outputs within the same group must use the same output protocol and rate.
- ICM-20649 (IMU)
- **CAN buses**: 2
- **USB**: Yes
- **RC input**: DSM/SRXL2, S.Bus/CPPM
- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST, PPM (via IO)
- **Analog battery inputs**: 2
- **Additional analog inputs**: TODO: number of additional analog inputs
- **Ethernet**: Yes
@@ -26082,7 +26141,7 @@ All outputs within the same group must use the same output protocol and rate.
"chip_model": "STM32H753",
"has_io_board": true,
"total_outputs": 9,
"fmu_servo_outputs": 8,
"fmu_servo_outputs": 9,
"io_outputs": 8,
"has_sd_card": true,
"has_ethernet": true,
@@ -26172,14 +26231,15 @@ This flight controller supports up to 9 FMU PWM outputs (AUX) and 8 IO PWM outpu
FMU Outputs:
- Outputs 1-6 support [DShot](../peripherals/dshot.md).
- Outputs 7-8 do not support DShot.
- Outputs 7-9 do not support DShot.
- Outputs 1-6 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry).
The 9 outputs are in 3 groups:
The 9 outputs are in 4 groups:
- Outputs 1-4 in group1 (Timer5)
- Outputs 5-6 in group2 (Timer4)
- Outputs 7-8 in group3 (Timer12)
- Output 9 in group4 (Timer1)
All outputs within the same group must use the same output protocol and rate.
```
@@ -26370,14 +26430,15 @@ This flight controller supports up to 9 FMU PWM outputs (AUX) and 8 IO PWM outpu
FMU Outputs:
- Outputs 1-6 support [DShot](../peripherals/dshot.md).
- Outputs 7-8 do not support DShot.
- Outputs 7-9 do not support DShot.
- Outputs 1-6 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry).
The 9 outputs are in 3 groups:
The 9 outputs are in 4 groups:
- Outputs 1-4 in group1 (Timer5)
- Outputs 5-6 in group2 (Timer4)
- Outputs 7-8 in group3 (Timer12)
- Output 9 in group4 (Timer1)
All outputs within the same group must use the same output protocol and rate.
-->
@@ -26414,6 +26475,7 @@ All outputs within the same group must use the same output protocol and rate.
- MPU-9250 (IMU)
- MS5611 (barometer)
- **USB**: Yes
- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST (via IO)
- **Analog battery inputs**: 1
- **Additional analog inputs**: TODO: number of additional analog inputs
@@ -26715,6 +26777,7 @@ All outputs within the same group must use the same output protocol and rate.
- MPU-9250 (IMU)
- MS5611 (barometer)
- **USB**: Yes
- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST (via IO)
- **Analog battery inputs**: 1
- **Additional analog inputs**: TODO: number of additional analog inputs
@@ -27301,7 +27364,7 @@ Serial port mapping could not be determined from source.
- BMI270 (IMU)
- **CAN buses**: 2
- **USB**: Yes
- **RC input**: DSM/SRXL2, S.Bus
- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST (via IO)
- **Analog battery inputs**: 1
- **Additional analog inputs**: TODO: number of additional analog inputs
@@ -28580,7 +28643,7 @@ For more information see [Basic Concepts > SD Cards (Removable Memory)](../getti
### Interfaces
- **PWM outputs**: 16 (8 FMU + 8 IO)
- **PWM outputs**: 17 (9 FMU + 8 IO)
- **Serial ports**: 8
- **I2C ports**: 4
- ICP-20100 (barometer, internal)
@@ -28591,7 +28654,7 @@ For more information see [Basic Concepts > SD Cards (Removable Memory)](../getti
- **SPI buses**: 5
- **CAN buses**: 2
- **USB**: Yes
- **RC input**: PPM
- **RC input**: SBUS, DSM/DSMX, ST24, SUMD, CRSF, GHST, PPM (via IO)
- **Analog battery inputs**: 2
- **Additional analog inputs**: TODO: number of additional analog inputs
- **Ethernet**: Yes
@@ -28616,7 +28679,7 @@ For more information see [Basic Concepts > SD Cards (Removable Memory)](../getti
"chip_model": "STM32H753",
"has_io_board": true,
"total_outputs": 9,
"fmu_servo_outputs": 8,
"fmu_servo_outputs": 9,
"io_outputs": 8,
"has_sd_card": true,
"has_ethernet": true,
@@ -28701,14 +28764,15 @@ This flight controller supports up to 9 FMU PWM outputs (AUX) and 8 IO PWM outpu
FMU Outputs:
- Outputs 1-6 support [DShot](../peripherals/dshot.md).
- Outputs 7-8 do not support DShot.
- Outputs 7-9 do not support DShot.
- Outputs 1-6 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry).
The 9 outputs are in 3 groups:
The 9 outputs are in 4 groups:
- Outputs 1-4 in group1 (Timer5)
- Outputs 5-6 in group2 (Timer4)
- Outputs 7-8 in group3 (Timer12)
- Output 9 in group4 (Timer1)
All outputs within the same group must use the same output protocol and rate.
```
@@ -0,0 +1,20 @@
## PWM Outputs {#pwm_outputs}
This flight controller supports up to 16 FMU PWM outputs (MAIN).
Outputs:
- Outputs 1-8 support [DShot](../peripherals/dshot.md).
- Outputs 9-16 do not support DShot.
- Outputs 1-7 support [Bidirectional DShot](../peripherals/dshot.md#bidirectional-dshot-telemetry).
- Output 8 supports Bidirectional DShot output only (no eRPM capture).
The 16 outputs are in 5 groups:
- Outputs 1-4 in group1 (Timer5)
- Outputs 5-8 in group2 (Timer4)
- Outputs 9-11 in group3 (Timer1)
- Outputs 12-14 in group4 (Timer8)
- Outputs 15-16 in group5 (Timer12)
All outputs within the same group must use the same output protocol and rate.
@@ -148,3 +148,45 @@ class TestComputeBdshot:
groups = fcdg.compute_groups(timers, channels)
groups = fcdg.compute_bdshot(groups, channels, "unknown")
assert all(g["bdshot_outputs"] == [] for g in groups)
def test_capture_channel_no_bdshot_on_no_dma_timers(self, board_stm32h7_capture_channels):
# Timer1/Timer8/Timer12 have no DMA → dshot=False → bdshot=False
timers, channels = _parse(board_stm32h7_capture_channels)
groups = fcdg.compute_groups(timers, channels)
groups = fcdg.compute_bdshot(groups, channels, "stm32h7")
for g in groups:
if g["timer"] in ("Timer1", "Timer8", "Timer12"):
assert g["dshot"] is False
assert g["bdshot"] is False
assert g["bdshot_outputs"] == []
class TestComputeGroupsCapture:
def test_capture_group_count(self, board_stm32h7_capture_channels):
timers, channels = _parse(board_stm32h7_capture_channels)
groups = fcdg.compute_groups(timers, channels)
assert len(groups) == 5
def test_capture_total_outputs(self, board_stm32h7_capture_channels):
timers, channels = _parse(board_stm32h7_capture_channels)
groups = fcdg.compute_groups(timers, channels)
all_outputs = sorted(o for g in groups for o in g["outputs"])
assert all_outputs == list(range(1, 17))
def test_capture_dshot_only_on_dma_timers(self, board_stm32h7_capture_channels):
timers, channels = _parse(board_stm32h7_capture_channels)
groups = fcdg.compute_groups(timers, channels)
dshot_groups = {g["timer"] for g in groups if g["dshot"]}
assert dshot_groups == {"Timer5", "Timer4"}
non_dshot_groups = {g["timer"] for g in groups if not g["dshot"]}
assert non_dshot_groups == {"Timer1", "Timer8", "Timer12"}
def test_capture_timer_group_memberships(self, board_stm32h7_capture_channels):
timers, channels = _parse(board_stm32h7_capture_channels)
groups = fcdg.compute_groups(timers, channels)
by_timer = {g["timer"]: g["outputs"] for g in groups}
assert by_timer["Timer5"] == [1, 2, 3, 4]
assert by_timer["Timer4"] == [5, 6, 7, 8]
assert by_timer["Timer1"] == [9, 10, 11]
assert by_timer["Timer8"] == [12, 13, 14]
assert by_timer["Timer12"] == [15, 16]
@@ -107,6 +107,29 @@ def _entry_imxrt():
}
def _entry_stm32h7_capture_channels():
"""16 outputs: 8 with DShot (Timer5/Timer4) + 8 capture-only (Timer1/Timer8/Timer12)."""
return {
"has_io_board": False, "total_outputs": 16, "io_outputs": 0,
"serial_ports": [],
"has_rc_input": False, "has_common_rc": False, "rc_serial_device": None,
"has_ppm_pin": False, "ppm_shared_with_rc_serial": False,
"has_pps_capture": False, "has_safety_switch": False, "has_safety_led": False,
"has_buzzer": False,
"num_power_inputs": 1, "has_redundant_power": False,
"has_dual_battery_monitoring": False, "has_dronecan_power_input": False,
"power_monitor_type": "analog", "has_sd_card": True,
"rc_ports_wizard": None, "gps_ports_wizard": None, "power_ports_wizard": None,
"groups": [
_group(1, "Timer5", [1, 2, 3, 4], bdshot_outputs=[1, 2, 3, 4]),
_group(2, "Timer4", [5, 6, 7, 8], bdshot_outputs=[5, 6, 7], bdshot_output_only=[8]),
_group(3, "Timer1", [9, 10, 11], dshot=False),
_group(4, "Timer8", [12, 13, 14], dshot=False),
_group(5, "Timer12", [15, 16], dshot=False),
],
}
def _entry_stm32f4_no_dshot():
return {
"has_io_board": False, "total_outputs": 6, "io_outputs": 0,
@@ -151,6 +174,10 @@ class TestGeneratePwmSection:
result = fcdg.generate_pwm_section(BOARD_KEY, _entry_imxrt())
snapshot("pwm_imxrt_all_dshot.md", result)
def test_stm32h7_capture_channels(self, snapshot):
result = fcdg.generate_pwm_section(BOARD_KEY, _entry_stm32h7_capture_channels())
snapshot("pwm_stm32h7_capture_channels.md", result)
def test_stm32f4_no_dshot(self, snapshot):
result = fcdg.generate_pwm_section(BOARD_KEY, _entry_stm32f4_no_dshot())
snapshot("pwm_stm32f4_no_dshot.md", result)
@@ -112,6 +112,24 @@ class TestParseTimerConfig:
result = fcdg.parse_timer_config(board_imxrt)
assert len(result["channels"]) == 8
def test_capture_channel_count(self, board_stm32h7_capture_channels):
# 8 regular + 8 initIOTimerChannelCapture = 16 total
result = fcdg.parse_timer_config(board_stm32h7_capture_channels)
assert len(result["channels"]) == 16
def test_capture_channels_include_capture_timers(self, board_stm32h7_capture_channels):
result = fcdg.parse_timer_config(board_stm32h7_capture_channels)
timer_names = {ch["timer"] for ch in result["channels"]}
assert "Timer1" in timer_names
assert "Timer8" in timer_names
assert "Timer12" in timer_names
def test_capture_channels_output_indices(self, board_stm32h7_capture_channels):
# All 16 outputs are numbered 1..16 in order
result = fcdg.parse_timer_config(board_stm32h7_capture_channels)
indices = [ch["output_index"] for ch in result["channels"]]
assert indices == list(range(1, 17))
def test_stm32f4_no_dshot(self, board_stm32f4):
result = fcdg.parse_timer_config(board_stm32f4)
assert all(not t["dshot"] for t in result["timers"])