Skip to content

Commit b2940e5

Browse files
cumin777claude
andcommitted
feat(xiao): add Seeed XIAO STM32C5 board support
Variant, linker script and boards.txt entry for the Seeed Studio XIAO STM32C5 (STM32C5A3CG). Boards ship with a TinyUF2 bootloader in the first 32 KiB, so build.flash_offset is 0x8000 and USB CDC is the default serial configuration. Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 8bc8cc9 commit b2940e5

5 files changed

Lines changed: 460 additions & 0 deletions

File tree

‎boards.txt‎

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2482,6 +2482,54 @@ GenC0.menu.upload_method.OpenOCDDapLink.upload.tool=openocd_upload
24822482
GenC0.menu.upload_method.OpenOCDDapLink.debug.server.openocd.scripts.0=interface/cmsis-dap.cfg
24832483
GenC0.menu.upload_method.OpenOCDDapLink.debug.server.openocd.scripts.1={runtime.platform.path}/debugger/select_swd.cfg
24842484

2485+
################################################################################
2486+
# Seeed XIAO STM32C5
2487+
# Docs: url=https://www.seeedstudio.com/
2488+
XIAO_STM32C5.name=Seeed Studio
2489+
2490+
XIAO_STM32C5.build.core=arduino
2491+
XIAO_STM32C5.build.board=XIAO_STM32C5
2492+
XIAO_STM32C5.build.variant=STM32C5xx/C593C(E-G)(T-U)_C5A3CG(T-U)
2493+
XIAO_STM32C5.build.variant_h=variant_XIAO_STM32C5.h
2494+
XIAO_STM32C5.build.ldscript=ldscript_XIAO_STM32C5.ld
2495+
XIAO_STM32C5.build.st_extra_flags=-D{build.product_line} -DHSE_VALUE=48000000U -DUSBD_SELF_POWERED=1 -DUSBD_MAX_POWER=50 {build.enable_usb} {build.xSerial}
2496+
XIAO_STM32C5.build.mcu=cortex-m33
2497+
XIAO_STM32C5.build.fpu=-mfpu=fpv5-sp-d16
2498+
XIAO_STM32C5.build.float-abi=-mfloat-abi=hard
2499+
XIAO_STM32C5.build.series=STM32C5xx
2500+
XIAO_STM32C5.build.product_line=STM32C5A3xx
2501+
XIAO_STM32C5.build.hal=-DUSE_HALV2_DRIVER
2502+
XIAO_STM32C5.build.flash_offset=0x8000
2503+
XIAO_STM32C5.upload.maximum_size=1015808
2504+
XIAO_STM32C5.upload.maximum_data_size=262144
2505+
XIAO_STM32C5.debug.svd_file={runtime.tools.STM32_SVD.path}/svd/STM32C5xx/STM32C5A3.svd
2506+
XIAO_STM32C5.vid.0=0x2886
2507+
XIAO_STM32C5.pid.0=0x80C5
2508+
2509+
# Seeed XIAO STM32C5
2510+
# Docs: url=https://www.seeedstudio.com/XIAO-STM32C5-p-7011.html
2511+
# Docs: mcu=STM32C5A3CG
2512+
XIAO_STM32C5.menu.pnum.XIAO_STM32C5=Seeed XIAO STM32C5
2513+
XIAO_STM32C5.menu.pnum.XIAO_STM32C5.build.board=XIAO_STM32C5
2514+
XIAO_STM32C5.menu.pnum.XIAO_STM32C5.build.product_line=STM32C5A3xx
2515+
XIAO_STM32C5.menu.pnum.XIAO_STM32C5.build.variant=STM32C5xx/C593C(E-G)(T-U)_C5A3CG(T-U)
2516+
XIAO_STM32C5.menu.pnum.XIAO_STM32C5.build.variant_h=variant_XIAO_STM32C5.h
2517+
XIAO_STM32C5.menu.pnum.XIAO_STM32C5.build.ldscript=ldscript_XIAO_STM32C5.ld
2518+
XIAO_STM32C5.menu.pnum.XIAO_STM32C5.upload.maximum_size=1015808
2519+
XIAO_STM32C5.menu.pnum.XIAO_STM32C5.upload.maximum_data_size=262144
2520+
XIAO_STM32C5.menu.pnum.XIAO_STM32C5.debug.svd_file={runtime.tools.STM32_SVD.path}/svd/STM32C5xx/STM32C5A3.svd
2521+
2522+
# Upload menu
2523+
XIAO_STM32C5.menu.upload_method.swdMethod=STM32CubeProgrammer (SWD)
2524+
XIAO_STM32C5.menu.upload_method.swdMethod.upload.protocol=swd
2525+
XIAO_STM32C5.menu.upload_method.swdMethod.upload.options=-a {upload.address} -m {upload.mode} -s {upload.start} -f {upload.freq} -n {upload.stlink_sn}
2526+
XIAO_STM32C5.menu.upload_method.swdMethod.upload.tool=stm32CubeProg
2527+
2528+
XIAO_STM32C5.menu.upload_method.jlinkMethod=STM32CubeProgrammer (J-Link)
2529+
XIAO_STM32C5.menu.upload_method.jlinkMethod.upload.protocol=jlink
2530+
XIAO_STM32C5.menu.upload_method.jlinkMethod.upload.options=-a {upload.address} -s {upload.start}
2531+
XIAO_STM32C5.menu.upload_method.jlinkMethod.upload.tool=stm32CubeProg
2532+
24852533
################################################################################
24862534
# Generic C5
24872535
GenC5.name=Generic STM32C5 series
@@ -17281,6 +17329,11 @@ GenC0.menu.xserial.none.build.xSerial=-DHAL_UART_MODULE_ENABLED -DHWSERIAL_NONE
1728117329
GenC0.menu.xserial.disabled=Disabled (no Serial support)
1728217330
GenC0.menu.xserial.disabled.build.xSerial=
1728317331

17332+
XIAO_STM32C5.menu.xserial.generic=Enabled (generic 'Serial')
17333+
XIAO_STM32C5.menu.xserial.none=Enabled (no generic 'Serial')
17334+
XIAO_STM32C5.menu.xserial.none.build.xSerial=-DHAL_UART_MODULE_ENABLED -DHWSERIAL_NONE
17335+
XIAO_STM32C5.menu.xserial.disabled=Disabled (no Serial support)
17336+
XIAO_STM32C5.menu.xserial.disabled.build.xSerial=
1728417337
GenC5.menu.xserial.generic=Enabled (generic 'Serial')
1728517338
GenC5.menu.xserial.none=Enabled (no generic 'Serial')
1728617339
GenC5.menu.xserial.none.build.xSerial=-DHAL_UART_MODULE_ENABLED -DHWSERIAL_NONE
@@ -17570,6 +17623,11 @@ GenC0.menu.usb.CDC.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC -DDISABLE_G
1757017623
GenC0.menu.usb.HID=HID (keyboard and mouse)
1757117624
GenC0.menu.usb.HID.build.enable_usb={build.usb_flags} -DUSBD_USE_HID_COMPOSITE
1757217625

17626+
XIAO_STM32C5.menu.usb.CDCgen=CDC (generic 'Serial' supersede U(S)ART)
17627+
XIAO_STM32C5.menu.usb.CDCgen.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC
17628+
XIAO_STM32C5.menu.usb.none=None
17629+
XIAO_STM32C5.menu.usb.CDC=CDC (no generic 'Serial')
17630+
XIAO_STM32C5.menu.usb.CDC.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC -DDISABLE_GENERIC_SERIALUSB
1757317631
GenC5.menu.usb.none=None
1757417632
GenC5.menu.usb.CDCgen=CDC (generic 'Serial' supersede U(S)ART)
1757517633
GenC5.menu.usb.CDCgen.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC
@@ -18029,6 +18087,23 @@ GenC0.menu.opt.o3lto.build.flags.optimize=-O3 -flto
1802918087
GenC0.menu.opt.ogstd=Debug (-Og)
1803018088
GenC0.menu.opt.ogstd.build.flags.optimize=-Og
1803118089

18090+
XIAO_STM32C5.menu.opt.osstd=Smallest (-Os default)
18091+
XIAO_STM32C5.menu.opt.oslto=Smallest (-Os) with LTO
18092+
XIAO_STM32C5.menu.opt.oslto.build.flags.optimize=-Os -flto
18093+
XIAO_STM32C5.menu.opt.o1std=Fast (-O1)
18094+
XIAO_STM32C5.menu.opt.o1std.build.flags.optimize=-O1
18095+
XIAO_STM32C5.menu.opt.o1lto=Fast (-O1) with LTO
18096+
XIAO_STM32C5.menu.opt.o1lto.build.flags.optimize=-O1 -flto
18097+
XIAO_STM32C5.menu.opt.o2std=Faster (-O2)
18098+
XIAO_STM32C5.menu.opt.o2std.build.flags.optimize=-O2
18099+
XIAO_STM32C5.menu.opt.o2lto=Faster (-O2) with LTO
18100+
XIAO_STM32C5.menu.opt.o2lto.build.flags.optimize=-O2 -flto
18101+
XIAO_STM32C5.menu.opt.o3std=Fastest (-O3)
18102+
XIAO_STM32C5.menu.opt.o3std.build.flags.optimize=-O3
18103+
XIAO_STM32C5.menu.opt.o3lto=Fastest (-O3) with LTO
18104+
XIAO_STM32C5.menu.opt.o3lto.build.flags.optimize=-O3 -flto
18105+
XIAO_STM32C5.menu.opt.ogstd=Debug (-Og)
18106+
XIAO_STM32C5.menu.opt.ogstd.build.flags.optimize=-Og
1803218107
GenC5.menu.opt.osstd=Smallest (-Os default)
1803318108
GenC5.menu.opt.oslto=Smallest (-Os) with LTO
1803418109
GenC5.menu.opt.oslto.build.flags.optimize=-Os -flto
@@ -18804,6 +18879,9 @@ GenC0.menu.dbg.none=None
1880418879
GenC0.menu.dbg.enable=Symbols Enabled (-g)
1880518880
GenC0.menu.dbg.enable.build.flags.debug=-g
1880618881

18882+
XIAO_STM32C5.menu.dbg.none=None
18883+
XIAO_STM32C5.menu.dbg.enable=Symbols Enabled (-g)
18884+
XIAO_STM32C5.menu.dbg.enable.build.flags.debug=-g
1880718885
GenC5.menu.dbg.none=None
1880818886
GenC5.menu.dbg.enable=Symbols Enabled (-g)
1880918887
GenC5.menu.dbg.enable.build.flags.debug=-g
@@ -19159,6 +19237,15 @@ GenC0.menu.rtlib.nanofps.build.flags.ldspecs=--specs=nano.specs -u _printf_float
1915919237
GenC0.menu.rtlib.full=Newlib Standard
1916019238
GenC0.menu.rtlib.full.build.flags.ldspecs=
1916119239

19240+
XIAO_STM32C5.menu.rtlib.nano=Newlib Nano (default)
19241+
XIAO_STM32C5.menu.rtlib.nanofp=Newlib Nano + Float Printf
19242+
XIAO_STM32C5.menu.rtlib.nanofp.build.flags.ldspecs=--specs=nano.specs -u _printf_float
19243+
XIAO_STM32C5.menu.rtlib.nanofs=Newlib Nano + Float Scanf
19244+
XIAO_STM32C5.menu.rtlib.nanofs.build.flags.ldspecs=--specs=nano.specs -u _scanf_float
19245+
XIAO_STM32C5.menu.rtlib.nanofps=Newlib Nano + Float Printf/Scanf
19246+
XIAO_STM32C5.menu.rtlib.nanofps.build.flags.ldspecs=--specs=nano.specs -u _printf_float -u _scanf_float
19247+
XIAO_STM32C5.menu.rtlib.full=Newlib Standard
19248+
XIAO_STM32C5.menu.rtlib.full.build.flags.ldspecs=
1916219249
GenC5.menu.rtlib.nano=Newlib Nano (default)
1916319250
GenC5.menu.rtlib.nanofp=Newlib Nano + Float Printf
1916419251
GenC5.menu.rtlib.nanofp.build.flags.ldspecs=--specs=nano.specs -u _printf_float

‎docs/supported-boards/index.md‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,12 @@
177177
| Generic C092RCIx | [STM32C092RC](https://www.st.com/en/microcontrollers-microprocessors/stm32c092rc.html) | `GENERIC_C092RCIX` | 2.11.0 | |
178178
| Generic C092RCTx | [STM32C092RC](https://www.st.com/en/microcontrollers-microprocessors/stm32c092rc.html) | `GENERIC_C092RCTX` | 2.11.0 | |
179179

180+
### [Seeed Studio boards](https://www.seeedstudio.com/)
181+
182+
| Board | STM32 MCU | `build.board` | First release | Notes |
183+
| --- | --- | --- | --- | --- |
184+
| [Seeed XIAO STM32C5](https://www.seeedstudio.com/XIAO-STM32C5-p-7011.html) | [STM32C5A3CG](https://www.st.com/en/microcontrollers-microprocessors/stm32c5a3cg.html) | `XIAO_STM32C5` | Next release | |
185+
180186
### Generic STM32C5 series boards
181187

182188
| Board | STM32 MCU | `build.board` | First release | Notes |
Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
/*
2+
* Copyright (c) 2026, Seeed Technology Co., Ltd.
3+
* SPDX-License-Identifier: BSD-3-Clause
4+
*
5+
* The application starts after the 32 KiB TinyUF2 bootloader. Memory sizes are
6+
* supplied by boards.txt through LD_MAX_SIZE and LD_MAX_DATA_SIZE.
7+
*/
8+
ENTRY(Reset_Handler)
9+
10+
HEAP_SIZE = 0x2000;
11+
STACK_SIZE = 0x2000;
12+
13+
MEMORY
14+
{
15+
ROM (rx) : org = 0x08000000 + LD_FLASH_OFFSET, len = LD_MAX_SIZE - LD_FLASH_OFFSET
16+
RAM (xrw) : org = 0x20000000, len = LD_MAX_DATA_SIZE
17+
}
18+
19+
SECTIONS
20+
{
21+
.vectors :
22+
{
23+
. = ALIGN(8);
24+
KEEP(*(.vectors));
25+
. = ALIGN(8);
26+
} > ROM
27+
28+
.text :
29+
{
30+
. = ALIGN(8);
31+
*(.text);
32+
*(.text*);
33+
*(.glue_7);
34+
*(.glue_7t);
35+
*(.eh_frame);
36+
KEEP(*(.init));
37+
KEEP(*(.fini));
38+
. = ALIGN(8);
39+
_etext = .;
40+
} > ROM
41+
42+
.rodata :
43+
{
44+
. = ALIGN(8);
45+
*(.rodata);
46+
*(.rodata*);
47+
. = ALIGN(8);
48+
} > ROM
49+
50+
.ARM.extab (READONLY) :
51+
{
52+
. = ALIGN(8);
53+
*(.ARM.extab* .gnu.linkonce.armextab.*)
54+
. = ALIGN(8);
55+
} > ROM
56+
57+
.ARM (READONLY) :
58+
{
59+
. = ALIGN(8);
60+
__exidx_start = .;
61+
*(.ARM.exidx*);
62+
__exidx_end = .;
63+
. = ALIGN(8);
64+
} > ROM
65+
66+
.preinit_array (READONLY) :
67+
{
68+
. = ALIGN(8);
69+
PROVIDE_HIDDEN(__preinit_array_start = .);
70+
KEEP(*(.preinit_array*));
71+
PROVIDE_HIDDEN(__preinit_array_end = .);
72+
. = ALIGN(8);
73+
} > ROM
74+
75+
.init_array (READONLY) :
76+
{
77+
. = ALIGN(8);
78+
PROVIDE_HIDDEN(__init_array_start = .);
79+
KEEP(*(SORT(.init_array.*)));
80+
KEEP(*(.init_array*));
81+
PROVIDE_HIDDEN(__init_array_end = .);
82+
. = ALIGN(8);
83+
} > ROM
84+
85+
.fini_array (READONLY) :
86+
{
87+
. = ALIGN(8);
88+
PROVIDE_HIDDEN(__fini_array_start = .);
89+
KEEP(*(SORT(.fini_array.*)));
90+
KEEP(*(.fini_array*));
91+
PROVIDE_HIDDEN(__fini_array_end = .);
92+
. = ALIGN(8);
93+
} > ROM
94+
95+
.copy.table (READONLY) :
96+
{
97+
. = ALIGN(8);
98+
__copy_table_start__ = .;
99+
LONG(LOADADDR(.data));
100+
LONG(ADDR(.data));
101+
LONG(SIZEOF(.data) / 4);
102+
__copy_table_end__ = .;
103+
} > ROM
104+
105+
.zero.table (READONLY) :
106+
{
107+
. = ALIGN(8);
108+
__zero_table_start__ = .;
109+
LONG(ADDR(.bss));
110+
LONG(SIZEOF(.bss) / 4);
111+
__zero_table_end__ = .;
112+
} > ROM
113+
114+
.data :
115+
{
116+
. = ALIGN(8);
117+
_sidata = LOADADDR(.data);
118+
__data_start__ = .;
119+
_sdata = .;
120+
*(.data);
121+
*(.data*);
122+
. = ALIGN(8);
123+
_edata = .;
124+
} > RAM AT> ROM
125+
126+
.bss :
127+
{
128+
. = ALIGN(8);
129+
_sbss = .;
130+
__bss_start__ = _sbss;
131+
*(.bss);
132+
*(.bss*);
133+
*(COMMON);
134+
. = ALIGN(8);
135+
_ebss = .;
136+
__bss_end__ = _ebss;
137+
} > RAM
138+
139+
.heap (NOLOAD) :
140+
{
141+
. = ALIGN(8);
142+
__end__ = .;
143+
PROVIDE(end = .);
144+
_heap_start = .;
145+
. += HEAP_SIZE;
146+
. = ALIGN(8);
147+
_heap_end = .;
148+
__HeapLimit = .;
149+
} > RAM
150+
151+
.stack (NOLOAD) :
152+
{
153+
. = ALIGN(8);
154+
__StackLimit = .;
155+
. += STACK_SIZE;
156+
. = ALIGN(8);
157+
__StackTop = .;
158+
_estack = .;
159+
__stack = .;
160+
} > RAM
161+
162+
/DISCARD/ :
163+
{
164+
libc.a(*);
165+
libm.a(*);
166+
libgcc.a(*);
167+
}
168+
169+
.ARM.attributes 0 :
170+
{
171+
*(.ARM.attributes)
172+
}
173+
}

0 commit comments

Comments
 (0)