Skip to content

Commit f9d6f69

Browse files
committed
Merge branch 'master' of github.com:adafruit/ArduinoCore-samd
2 parents c7ed745 + 7b3fb12 commit f9d6f69

File tree

13 files changed

+1063
-135
lines changed

13 files changed

+1063
-135
lines changed

boards.txt

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,43 @@ adafruit_metro_m4.menu.cache.off=Disabled
308308
adafruit_metro_m4.menu.cache.off.build.cache_flags=
309309

310310

311+
312+
# Adafruit ItsyBitsy M4 (SAMD51)
313+
# ------------------------------
314+
adafruit_itsybitsy_m4.name=Adafruit ItsyBitsy M4 (SAMD51)
315+
adafruit_itsybitsy_m4.vid.0=0x239A
316+
adafruit_itsybitsy_m4.pid.0=0x802B
317+
adafruit_itsybitsy_m4.vid.1=0x239A
318+
adafruit_itsybitsy_m4.pid.1=0x002B
319+
adafruit_itsybitsy_m4.upload.tool=bossac18
320+
adafruit_itsybitsy_m4.upload.protocol=sam-ba
321+
adafruit_itsybitsy_m4.upload.maximum_size=507904
322+
adafruit_itsybitsy_m4.upload.offset=0x4000
323+
adafruit_itsybitsy_m4.upload.use_1200bps_touch=true
324+
adafruit_itsybitsy_m4.upload.wait_for_upload_port=true
325+
adafruit_itsybitsy_m4.upload.native_usb=true
326+
adafruit_itsybitsy_m4.build.mcu=cortex-m4
327+
adafruit_itsybitsy_m4.build.f_cpu=120000000L
328+
adafruit_itsybitsy_m4.build.usb_product="Adafruit ItsyBitsy M4"
329+
adafruit_itsybitsy_m4.build.usb_manufacturer="Adafruit LLC"
330+
adafruit_itsybitsy_m4.build.board=ITSYBITSY_M4
331+
adafruit_itsybitsy_m4.build.core=arduino
332+
adafruit_itsybitsy_m4.build.extra_flags=-D__SAMD51G19A__ -DADAFRUIT_ITSYBITSY_M4_EXPRESS -D__SAMD51__ {build.usb_flags} -D__FPU_PRESENT -DARM_MATH_CM4 -DCRYSTALLESS -mfloat-abi=hard -mfpu=fpv4-sp-d16
333+
adafruit_itsybitsy_m4.build.ldscript=linker_scripts/gcc/flash_with_bootloader.ld
334+
adafruit_itsybitsy_m4.build.openocdscript=openocd_scripts/arduino_zero.cfg
335+
adafruit_itsybitsy_m4.build.variant=itsybitsy_m4
336+
adafruit_itsybitsy_m4.build.variant_system_lib=
337+
adafruit_itsybitsy_m4.build.vid=0x239A
338+
adafruit_itsybitsy_m4.build.pid=0x802B
339+
adafruit_itsybitsy_m4.bootloader.tool=openocd
340+
adafruit_itsybitsy_m4.bootloader.file=metroM4/bootloader.bin
341+
adafruit_itsybitsy_m4.compiler.arm.cmsis.ldflags="-L{build.variant.path}" -larm_cortexM4lf_math -mfloat-abi=hard -mfpu=fpv4-sp-d16
342+
adafruit_itsybitsy_m4.menu.cache.on=Enabled
343+
adafruit_itsybitsy_m4.menu.cache.on.build.cache_flags=-DENABLE_CACHE
344+
adafruit_itsybitsy_m4.menu.cache.off=Disabled
345+
adafruit_itsybitsy_m4.menu.cache.off.build.cache_flags=
346+
347+
311348
# Adafruit Feather M4 (SAMD51)
312349
# ------------------------------
313350
#adafruit_feather_m4.name=Adafruit Feather M4 (SAMD51)

cores/arduino/startup.c

Lines changed: 138 additions & 134 deletions
Original file line numberDiff line numberDiff line change
@@ -58,197 +58,201 @@ void SystemInit( void )
5858
#if defined(__SAMD51__)
5959
NVMCTRL->CTRLA.reg |= NVMCTRL_CTRLA_RWS(0);
6060

61-
#if defined(CRYSTALLESS)
62-
63-
64-
#else // has crystal
65-
66-
/* ----------------------------------------------------------------------------------------------
67-
* 1) Enable XOSC32K clock (External on-board 32.768Hz oscillator)
68-
*/
61+
#ifndef CRYSTALLESS
62+
/* ----------------------------------------------------------------------------------------------
63+
* 1) Enable XOSC32K clock (External on-board 32.768Hz oscillator)
64+
*/
65+
66+
OSC32KCTRL->XOSC32K.reg = OSC32KCTRL_XOSC32K_ENABLE | OSC32KCTRL_XOSC32K_EN32K | OSC32KCTRL_XOSC32K_EN32K | OSC32KCTRL_XOSC32K_CGM_XT | OSC32KCTRL_XOSC32K_XTALEN;
67+
68+
while( (OSC32KCTRL->STATUS.reg & OSC32KCTRL_STATUS_XOSC32KRDY) == 0 ){
69+
/* Wait for oscillator to be ready */
70+
}
6971

70-
OSC32KCTRL->XOSC32K.reg = OSC32KCTRL_XOSC32K_ENABLE | OSC32KCTRL_XOSC32K_EN32K | OSC32KCTRL_XOSC32K_EN32K | OSC32KCTRL_XOSC32K_CGM_XT | OSC32KCTRL_XOSC32K_XTALEN;
71-
72-
while( (OSC32KCTRL->STATUS.reg & OSC32KCTRL_STATUS_XOSC32KRDY) == 0 ){
73-
/* Wait for oscillator to be ready */
74-
}
72+
#endif //CRYSTALLESS
7573

76-
#endif //CRYSTALLESS
77-
7874
//software reset
7975

8076
GCLK->CTRLA.bit.SWRST = 1;
8177
while ( GCLK->SYNCBUSY.reg & GCLK_SYNCBUSY_SWRST ){
8278
/* wait for reset to complete */
8379
}
80+
81+
#ifndef CRYSTALLESS
82+
/* ----------------------------------------------------------------------------------------------
83+
* 2) Put XOSC32K as source of Generic Clock Generator 3
84+
*/
85+
GCLK->GENCTRL[GENERIC_CLOCK_GENERATOR_XOSC32K].reg = GCLK_GENCTRL_SRC(GCLK_GENCTRL_SRC_XOSC32K) | //generic clock gen 3
86+
GCLK_GENCTRL_GENEN;
87+
#else
88+
/* ----------------------------------------------------------------------------------------------
89+
* 2) Put OSCULP32K as source of Generic Clock Generator 3
90+
*/
91+
GCLK->GENCTRL[GENERIC_CLOCK_GENERATOR_XOSC32K].reg = GCLK_GENCTRL_SRC(GCLK_GENCTRL_SRC_OSCULP32K) | GCLK_GENCTRL_GENEN; //generic clock gen 3
92+
#endif
8493

85-
/* ----------------------------------------------------------------------------------------------
86-
* 2) Put XOSC32K as source of Generic Clock Generator 3
87-
*/
88-
GCLK->GENCTRL[GENERIC_CLOCK_GENERATOR_XOSC32K].reg = GCLK_GENCTRL_SRC(GCLK_GENCTRL_SRC_XOSC32K) | //generic clock gen 3
89-
GCLK_GENCTRL_GENEN;
9094

91-
while ( GCLK->SYNCBUSY.reg & GCLK_SYNCBUSY_GENCTRL3 ){
92-
/* Wait for synchronization */
93-
}
95+
while ( GCLK->SYNCBUSY.reg & GCLK_SYNCBUSY_GENCTRL3 ){
96+
/* Wait for synchronization */
97+
}
9498

95-
/* ----------------------------------------------------------------------------------------------
96-
* 3) Put Generic Clock Generator 3 as source for Generic Clock Gen 0 (DFLL48M reference)
97-
*/
98-
GCLK->GENCTRL[0].reg = GCLK_GENCTRL_SRC(GCLK_GENCTRL_SRC_OSCULP32K) | GCLK_GENCTRL_GENEN;
99-
100-
/* ----------------------------------------------------------------------------------------------
101-
* 4) Enable DFLL48M clock
102-
*/
99+
/* ----------------------------------------------------------------------------------------------
100+
* 3) Put Generic Clock Generator 3 as source for Generic Clock Gen 0 (DFLL48M reference)
101+
*/
102+
GCLK->GENCTRL[0].reg = GCLK_GENCTRL_SRC(GCLK_GENCTRL_SRC_OSCULP32K) | GCLK_GENCTRL_GENEN;
103+
104+
/* ----------------------------------------------------------------------------------------------
105+
* 4) Enable DFLL48M clock
106+
*/
103107

104108
while ( GCLK->SYNCBUSY.reg & GCLK_SYNCBUSY_GENCTRL0 ){
105109
/* Wait for synchronization */
106110
}
107111

108-
/* DFLL Configuration in Open Loop mode */
109-
110-
OSCCTRL->DFLLCTRLA.reg = 0;
111-
//GCLK->PCHCTRL[OSCCTRL_GCLK_ID_DFLL48].reg = (1 << GCLK_PCHCTRL_CHEN_Pos) | GCLK_PCHCTRL_GEN(GCLK_PCHCTRL_GEN_GCLK3_Val);
112-
113-
OSCCTRL->DFLLMUL.reg = OSCCTRL_DFLLMUL_CSTEP( 0x1 ) |
114-
OSCCTRL_DFLLMUL_FSTEP( 0x1 ) |
115-
OSCCTRL_DFLLMUL_MUL( 0 );
116-
117-
while ( OSCCTRL->DFLLSYNC.reg & OSCCTRL_DFLLSYNC_DFLLMUL )
118-
{
119-
/* Wait for synchronization */
120-
}
112+
/* DFLL Configuration in Open Loop mode */
121113

122-
OSCCTRL->DFLLCTRLB.reg = 0;
123-
while ( OSCCTRL->DFLLSYNC.reg & OSCCTRL_DFLLSYNC_DFLLCTRLB )
124-
{
125-
/* Wait for synchronization */
126-
}
114+
OSCCTRL->DFLLCTRLA.reg = 0;
115+
//GCLK->PCHCTRL[OSCCTRL_GCLK_ID_DFLL48].reg = (1 << GCLK_PCHCTRL_CHEN_Pos) | GCLK_PCHCTRL_GEN(GCLK_PCHCTRL_GEN_GCLK3_Val);
127116

128-
OSCCTRL->DFLLCTRLA.reg |= OSCCTRL_DFLLCTRLA_ENABLE;
129-
while ( OSCCTRL->DFLLSYNC.reg & OSCCTRL_DFLLSYNC_ENABLE )
130-
{
131-
/* Wait for synchronization */
132-
}
133-
134-
OSCCTRL->DFLLVAL.reg = OSCCTRL->DFLLVAL.reg;
135-
while( OSCCTRL->DFLLSYNC.bit.DFLLVAL );
117+
OSCCTRL->DFLLMUL.reg = OSCCTRL_DFLLMUL_CSTEP( 0x1 ) |
118+
OSCCTRL_DFLLMUL_FSTEP( 0x1 ) |
119+
OSCCTRL_DFLLMUL_MUL( 0 );
120+
121+
while ( OSCCTRL->DFLLSYNC.reg & OSCCTRL_DFLLSYNC_DFLLMUL )
122+
{
123+
/* Wait for synchronization */
124+
}
125+
126+
OSCCTRL->DFLLCTRLB.reg = 0;
127+
while ( OSCCTRL->DFLLSYNC.reg & OSCCTRL_DFLLSYNC_DFLLCTRLB )
128+
{
129+
/* Wait for synchronization */
130+
}
131+
132+
OSCCTRL->DFLLCTRLA.reg |= OSCCTRL_DFLLCTRLA_ENABLE;
133+
while ( OSCCTRL->DFLLSYNC.reg & OSCCTRL_DFLLSYNC_ENABLE )
134+
{
135+
/* Wait for synchronization */
136+
}
137+
138+
OSCCTRL->DFLLVAL.reg = OSCCTRL->DFLLVAL.reg;
139+
while( OSCCTRL->DFLLSYNC.bit.DFLLVAL );
136140

137141
OSCCTRL->DFLLCTRLB.reg = OSCCTRL_DFLLCTRLB_WAITLOCK |
138142
OSCCTRL_DFLLCTRLB_CCDIS | OSCCTRL_DFLLCTRLB_USBCRM ;
139143

140-
while ( !OSCCTRL->STATUS.bit.DFLLRDY )
141-
{
142-
/* Wait for synchronization */
143-
}
144-
145-
GCLK->GENCTRL[GENERIC_CLOCK_GENERATOR_1M].reg = GCLK_GENCTRL_SRC(GCLK_GENCTRL_SRC_DFLL_Val) | GCLK_GENCTRL_GENEN | GCLK_GENCTRL_DIV(24u);
146-
147-
while ( GCLK->SYNCBUSY.bit.GENCTRL5 ){
148-
/* Wait for synchronization */
149-
}
150-
144+
while ( !OSCCTRL->STATUS.bit.DFLLRDY )
145+
{
146+
/* Wait for synchronization */
147+
}
148+
149+
GCLK->GENCTRL[GENERIC_CLOCK_GENERATOR_1M].reg = GCLK_GENCTRL_SRC(GCLK_GENCTRL_SRC_DFLL_Val) | GCLK_GENCTRL_GENEN | GCLK_GENCTRL_DIV(24u);
150+
151+
while ( GCLK->SYNCBUSY.bit.GENCTRL5 ){
152+
/* Wait for synchronization */
153+
}
154+
151155

152156
/* ------------------------------------------------------------------------
153157
* Set up the PLLs
154158
*/
155159

156-
//PLL0 is 120MHz
157-
GCLK->PCHCTRL[OSCCTRL_GCLK_ID_FDPLL0].reg = (1 << GCLK_PCHCTRL_CHEN_Pos) | GCLK_PCHCTRL_GEN(GCLK_PCHCTRL_GEN_GCLK5_Val);
158-
159-
OSCCTRL->Dpll[0].DPLLRATIO.reg = OSCCTRL_DPLLRATIO_LDRFRAC(0x00) | OSCCTRL_DPLLRATIO_LDR(59); //120 Mhz
160-
161-
while(OSCCTRL->Dpll[0].DPLLSYNCBUSY.bit.DPLLRATIO);
162-
163-
//MUST USE LBYPASS DUE TO BUG IN REV A OF SAMD51
164-
OSCCTRL->Dpll[0].DPLLCTRLB.reg = OSCCTRL_DPLLCTRLB_REFCLK_GCLK | OSCCTRL_DPLLCTRLB_LBYPASS;
165-
166-
OSCCTRL->Dpll[0].DPLLCTRLA.reg = OSCCTRL_DPLLCTRLA_ENABLE;
167-
168-
while( OSCCTRL->Dpll[0].DPLLSTATUS.bit.CLKRDY == 0 || OSCCTRL->Dpll[0].DPLLSTATUS.bit.LOCK == 0 );
169-
170-
//PLL1 is 100MHz
171-
GCLK->PCHCTRL[OSCCTRL_GCLK_ID_FDPLL1].reg = (1 << GCLK_PCHCTRL_CHEN_Pos) | GCLK_PCHCTRL_GEN(GCLK_PCHCTRL_GEN_GCLK5_Val);
172-
173-
OSCCTRL->Dpll[1].DPLLRATIO.reg = OSCCTRL_DPLLRATIO_LDRFRAC(0x00) | OSCCTRL_DPLLRATIO_LDR(49); //100 Mhz
174-
175-
while(OSCCTRL->Dpll[1].DPLLSYNCBUSY.bit.DPLLRATIO);
176-
177-
//MUST USE LBYPASS DUE TO BUG IN REV A OF SAMD51
178-
OSCCTRL->Dpll[1].DPLLCTRLB.reg = OSCCTRL_DPLLCTRLB_REFCLK_GCLK | OSCCTRL_DPLLCTRLB_LBYPASS;
179-
180-
OSCCTRL->Dpll[1].DPLLCTRLA.reg = OSCCTRL_DPLLCTRLA_ENABLE;
181-
182-
while( OSCCTRL->Dpll[1].DPLLSTATUS.bit.CLKRDY == 0 || OSCCTRL->Dpll[1].DPLLSTATUS.bit.LOCK == 0 );
183-
160+
//PLL0 is 120MHz
161+
GCLK->PCHCTRL[OSCCTRL_GCLK_ID_FDPLL0].reg = (1 << GCLK_PCHCTRL_CHEN_Pos) | GCLK_PCHCTRL_GEN(GCLK_PCHCTRL_GEN_GCLK5_Val);
162+
163+
OSCCTRL->Dpll[0].DPLLRATIO.reg = OSCCTRL_DPLLRATIO_LDRFRAC(0x00) | OSCCTRL_DPLLRATIO_LDR(59); //120 Mhz
164+
165+
while(OSCCTRL->Dpll[0].DPLLSYNCBUSY.bit.DPLLRATIO);
166+
167+
//MUST USE LBYPASS DUE TO BUG IN REV A OF SAMD51
168+
OSCCTRL->Dpll[0].DPLLCTRLB.reg = OSCCTRL_DPLLCTRLB_REFCLK_GCLK | OSCCTRL_DPLLCTRLB_LBYPASS;
169+
170+
OSCCTRL->Dpll[0].DPLLCTRLA.reg = OSCCTRL_DPLLCTRLA_ENABLE;
171+
172+
while( OSCCTRL->Dpll[0].DPLLSTATUS.bit.CLKRDY == 0 || OSCCTRL->Dpll[0].DPLLSTATUS.bit.LOCK == 0 );
173+
174+
//PLL1 is 100MHz
175+
GCLK->PCHCTRL[OSCCTRL_GCLK_ID_FDPLL1].reg = (1 << GCLK_PCHCTRL_CHEN_Pos) | GCLK_PCHCTRL_GEN(GCLK_PCHCTRL_GEN_GCLK5_Val);
176+
177+
OSCCTRL->Dpll[1].DPLLRATIO.reg = OSCCTRL_DPLLRATIO_LDRFRAC(0x00) | OSCCTRL_DPLLRATIO_LDR(49); //100 Mhz
178+
179+
while(OSCCTRL->Dpll[1].DPLLSYNCBUSY.bit.DPLLRATIO);
180+
181+
//MUST USE LBYPASS DUE TO BUG IN REV A OF SAMD51
182+
OSCCTRL->Dpll[1].DPLLCTRLB.reg = OSCCTRL_DPLLCTRLB_REFCLK_GCLK | OSCCTRL_DPLLCTRLB_LBYPASS;
183+
184+
OSCCTRL->Dpll[1].DPLLCTRLA.reg = OSCCTRL_DPLLCTRLA_ENABLE;
185+
186+
while( OSCCTRL->Dpll[1].DPLLSTATUS.bit.CLKRDY == 0 || OSCCTRL->Dpll[1].DPLLSTATUS.bit.LOCK == 0 );
187+
184188

185189
/* ------------------------------------------------------------------------
186190
* Set up the peripheral clocks
187191
*/
188192

189193
//48MHZ CLOCK FOR USB AND STUFF
190194
GCLK->GENCTRL[GENERIC_CLOCK_GENERATOR_48M].reg = GCLK_GENCTRL_SRC(GCLK_GENCTRL_SRC_DFLL_Val) |
191-
GCLK_GENCTRL_IDC |
192-
//GCLK_GENCTRL_OE |
193-
GCLK_GENCTRL_GENEN;
194-
195-
while ( GCLK->SYNCBUSY.reg & GENERIC_CLOCK_GENERATOR_48M_SYNC)
196-
{
197-
/* Wait for synchronization */
198-
}
199-
200-
//100MHZ CLOCK FOR OTHER PERIPHERALS
201-
GCLK->GENCTRL[GENERIC_CLOCK_GENERATOR_100M].reg = GCLK_GENCTRL_SRC(GCLK_GENCTRL_SRC_DPLL1_Val) |
202-
GCLK_GENCTRL_IDC |
203-
//GCLK_GENCTRL_OE |
204-
GCLK_GENCTRL_GENEN;
205-
206-
while ( GCLK->SYNCBUSY.reg & GENERIC_CLOCK_GENERATOR_100M_SYNC)
207-
{
208-
/* Wait for synchronization */
209-
}
210-
195+
GCLK_GENCTRL_IDC |
196+
//GCLK_GENCTRL_OE |
197+
GCLK_GENCTRL_GENEN;
198+
199+
while ( GCLK->SYNCBUSY.reg & GENERIC_CLOCK_GENERATOR_48M_SYNC)
200+
{
201+
/* Wait for synchronization */
202+
}
203+
204+
//100MHZ CLOCK FOR OTHER PERIPHERALS
205+
GCLK->GENCTRL[GENERIC_CLOCK_GENERATOR_100M].reg = GCLK_GENCTRL_SRC(GCLK_GENCTRL_SRC_DPLL1_Val) |
206+
GCLK_GENCTRL_IDC |
207+
//GCLK_GENCTRL_OE |
208+
GCLK_GENCTRL_GENEN;
209+
210+
while ( GCLK->SYNCBUSY.reg & GENERIC_CLOCK_GENERATOR_100M_SYNC)
211+
{
212+
/* Wait for synchronization */
213+
}
214+
211215
//12MHZ CLOCK FOR DAC
212-
GCLK->GENCTRL[GENERIC_CLOCK_GENERATOR_12M].reg = GCLK_GENCTRL_SRC(GCLK_GENCTRL_SRC_DFLL_Val) |
216+
GCLK->GENCTRL[GENERIC_CLOCK_GENERATOR_12M].reg = GCLK_GENCTRL_SRC(GCLK_GENCTRL_SRC_DFLL_Val) |
213217
GCLK_GENCTRL_IDC |
214218
GCLK_GENCTRL_DIV(4) |
215219
GCLK_GENCTRL_DIVSEL |
216220
//GCLK_GENCTRL_OE |
217221
GCLK_GENCTRL_GENEN;
218-
219-
while ( GCLK->SYNCBUSY.reg & GENERIC_CLOCK_GENERATOR_12M_SYNC)
222+
223+
while ( GCLK->SYNCBUSY.reg & GENERIC_CLOCK_GENERATOR_12M_SYNC)
220224
{
221-
/* Wait for synchronization */
225+
/* Wait for synchronization */
222226
}
223227

224228
/*---------------------------------------------------------------------
225-
* Set up main clock
226-
*/
227-
228-
GCLK->GENCTRL[GENERIC_CLOCK_GENERATOR_MAIN].reg = GCLK_GENCTRL_SRC(MAIN_CLOCK_SOURCE) |
229-
GCLK_GENCTRL_IDC |
230-
//GCLK_GENCTRL_OE |
231-
GCLK_GENCTRL_GENEN;
232-
229+
* Set up main clock
230+
*/
231+
232+
GCLK->GENCTRL[GENERIC_CLOCK_GENERATOR_MAIN].reg = GCLK_GENCTRL_SRC(MAIN_CLOCK_SOURCE) |
233+
GCLK_GENCTRL_IDC |
234+
//GCLK_GENCTRL_OE |
235+
GCLK_GENCTRL_GENEN;
236+
233237

234238
while ( GCLK->SYNCBUSY.reg & GCLK_SYNCBUSY_GENCTRL0 )
235-
{
236-
/* Wait for synchronization */
237-
}
239+
{
240+
/* Wait for synchronization */
241+
}
238242

239243
MCLK->CPUDIV.reg = MCLK_CPUDIV_DIV_DIV1;
240-
244+
241245
/* Use the LDO regulator by default */
242246
SUPC->VREG.bit.SEL = 0;
243247

244-
248+
245249
/* If desired, enable cache! */
246250
#if defined(ENABLE_CACHE)
247251
__disable_irq();
248252
CMCC->CTRL.reg = 1;
249253
__enable_irq();
250254
#endif
251-
255+
252256
//*************** END SAMD51 *************************//
253257

254258
#else

platform.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
# https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5---3rd-party-Hardware-specification
2121

2222
name=Adafruit SAMD (32-bits ARM Cortex-M0+ and Cortex-M4) Boards
23-
version=1.1.0
23+
version=1.2.0
2424

2525
# Compile variables
2626
# -----------------

variants/feather_m0_express/variant.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ extern "C"
8484
#define PIN_LED2 PIN_LED_RXL
8585
#define PIN_LED3 PIN_LED_TXL
8686
#define LED_BUILTIN PIN_LED_13
87+
#define NEOPIXEL_BUILTIN (8u)
8788

8889
/*
8990
* Analog pins

0 commit comments

Comments
 (0)