Skip to content

Commit 625fd55

Browse files
committed
Merge branch 'master' of github.com:adafruit/ArduinoCore-samd
2 parents 965af33 + f5093b6 commit 625fd55

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+5102
-47
lines changed

boards.txt

+114-3
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ adafruit_feather_m0.build.core=arduino
3535
adafruit_feather_m0.build.extra_flags=-DARDUINO_SAMD_ZERO -D__SAMD21G18A__ {build.usb_flags}
3636
adafruit_feather_m0.build.ldscript=linker_scripts/gcc/flash_with_bootloader.ld
3737
adafruit_feather_m0.build.openocdscript=openocd_scripts/arduino_zero.cfg
38-
adafruit_feather_m0.build.variant=arduino_zero
38+
adafruit_feather_m0.build.variant=feather_m0
3939
adafruit_feather_m0.build.variant_system_lib=
4040
adafruit_feather_m0.build.vid=0x239A
4141
adafruit_feather_m0.build.pid=0x800B
@@ -121,7 +121,7 @@ adafruit_metro_m0.build.variant_system_lib=
121121
adafruit_metro_m0.build.vid=0x239A
122122
adafruit_metro_m0.build.pid=0x8013
123123
adafruit_metro_m0.bootloader.tool=openocd
124-
adafruit_metro_m0.bootloader.file=metro/samd21_sam_ba.bin
124+
adafruit_metro_m0.bootloader.file=metro/bootloader_uf2.bin
125125

126126
# Adafruit Circuit Playground M0
127127
# ------------------------------
@@ -150,4 +150,115 @@ adafruit_circuitplayground_m0.build.variant_system_lib=
150150
adafruit_circuitplayground_m0.build.vid=0x239A
151151
adafruit_circuitplayground_m0.build.pid=0x8018
152152
adafruit_circuitplayground_m0.bootloader.tool=openocd
153-
adafruit_circuitplayground_m0.bootloader.file=circuitplay/circuitplay_m0_samd21g18_sam_ba.bin
153+
adafruit_circuitplayground_m0.bootloader.file=circuitplay/bootloader_uf2.bin
154+
155+
adafruit_gemma_m0.name=Adafruit Gemma M0
156+
adafruit_gemma_m0.vid.0=0x239A
157+
adafruit_gemma_m0.pid.0=0x801C
158+
adafruit_gemma_m0.vid.1=0x239A
159+
adafruit_gemma_m0.pid.1=0x001C
160+
adafruit_gemma_m0.upload.tool=bossac
161+
adafruit_gemma_m0.upload.protocol=sam-ba
162+
adafruit_gemma_m0.upload.maximum_size=262144
163+
adafruit_gemma_m0.upload.use_1200bps_touch=true
164+
adafruit_gemma_m0.upload.wait_for_upload_port=true
165+
adafruit_gemma_m0.upload.native_usb=true
166+
adafruit_gemma_m0.build.mcu=cortex-m0plus
167+
adafruit_gemma_m0.build.f_cpu=48000000L
168+
adafruit_gemma_m0.build.usb_product="Gemma M0"
169+
adafruit_gemma_m0.build.usb_manufacturer="Adafruit"
170+
adafruit_gemma_m0.build.board=GEMMA_M0
171+
adafruit_gemma_m0.build.core=arduino
172+
adafruit_gemma_m0.build.extra_flags=-DCRYSTALLESS -DADAFRUIT_GEMMA_M0 -D__SAMD21E18A__ {build.usb_flags}
173+
adafruit_gemma_m0.build.ldscript=linker_scripts/gcc/flash_with_bootloader.ld
174+
adafruit_gemma_m0.build.openocdscript=openocd_scripts/arduino_zero.cfg
175+
adafruit_gemma_m0.build.variant=gemma_m0
176+
adafruit_gemma_m0.build.variant_system_lib=
177+
adafruit_gemma_m0.build.vid=0x239A
178+
adafruit_gemma_m0.build.pid=0x801C
179+
adafruit_gemma_m0.bootloader.tool=openocd
180+
adafruit_gemma_m0.bootloader.file=gemma/bootloader_uf2.bin
181+
182+
adafruit_trinket_m0.name=Adafruit Trinket M0
183+
adafruit_trinket_m0.vid.0=0x239A
184+
adafruit_trinket_m0.pid.0=0x801E
185+
adafruit_trinket_m0.vid.1=0x239A
186+
adafruit_trinket_m0.pid.1=0x001E
187+
adafruit_trinket_m0.upload.tool=bossac
188+
adafruit_trinket_m0.upload.protocol=sam-ba
189+
adafruit_trinket_m0.upload.maximum_size=262144
190+
adafruit_trinket_m0.upload.use_1200bps_touch=true
191+
adafruit_trinket_m0.upload.wait_for_upload_port=true
192+
adafruit_trinket_m0.upload.native_usb=true
193+
adafruit_trinket_m0.build.mcu=cortex-m0plus
194+
adafruit_trinket_m0.build.f_cpu=48000000L
195+
adafruit_trinket_m0.build.usb_product="Trinket M0"
196+
adafruit_trinket_m0.build.usb_manufacturer="Adafruit"
197+
adafruit_trinket_m0.build.board=TRINKET_M0
198+
adafruit_trinket_m0.build.core=arduino
199+
adafruit_trinket_m0.build.extra_flags=-DCRYSTALLESS -DADAFRUIT_TRINKET_M0 -D__SAMD21E18A__ {build.usb_flags}
200+
adafruit_trinket_m0.build.ldscript=linker_scripts/gcc/flash_with_bootloader.ld
201+
adafruit_trinket_m0.build.openocdscript=openocd_scripts/arduino_zero.cfg
202+
adafruit_trinket_m0.build.variant=trinket_m0
203+
adafruit_trinket_m0.build.variant_system_lib=
204+
adafruit_trinket_m0.build.vid=0x239A
205+
adafruit_trinket_m0.build.pid=0x801E
206+
adafruit_trinket_m0.bootloader.tool=openocd
207+
adafruit_trinket_m0.bootloader.file=trinket/bootloader_uf2.bin
208+
209+
adafruit_itsybitsy_m0.name=Adafruit ItsyBitsy M0
210+
adafruit_itsybitsy_m0.vid.0=0x239A
211+
adafruit_itsybitsy_m0.pid.0=0x800F
212+
adafruit_itsybitsy_m0.vid.1=0x239A
213+
adafruit_itsybitsy_m0.pid.1=0x000F
214+
adafruit_itsybitsy_m0.vid.2=0x239A
215+
adafruit_itsybitsy_m0.pid.2=0x8012
216+
adafruit_itsybitsy_m0.upload.tool=bossac
217+
adafruit_itsybitsy_m0.upload.protocol=sam-ba
218+
adafruit_itsybitsy_m0.upload.maximum_size=262144
219+
adafruit_itsybitsy_m0.upload.use_1200bps_touch=true
220+
adafruit_itsybitsy_m0.upload.wait_for_upload_port=true
221+
adafruit_itsybitsy_m0.upload.native_usb=true
222+
adafruit_itsybitsy_m0.build.mcu=cortex-m0plus
223+
adafruit_itsybitsy_m0.build.f_cpu=48000000L
224+
adafruit_itsybitsy_m0.build.usb_product="ItsyBitsy M0 Express"
225+
adafruit_itsybitsy_m0.build.usb_manufacturer="Adafruit"
226+
adafruit_itsybitsy_m0.build.board=ITSYBITSY_M0
227+
adafruit_itsybitsy_m0.build.core=arduino
228+
adafruit_itsybitsy_m0.build.extra_flags=-DCRYSTALLESS -DADAFRUIT_ITSYBITSY_M0 -D__SAMD21G18A__ {build.usb_flags}
229+
adafruit_itsybitsy_m0.build.ldscript=linker_scripts/gcc/flash_with_bootloader.ld
230+
adafruit_itsybitsy_m0.build.openocdscript=openocd_scripts/arduino_zero.cfg
231+
adafruit_itsybitsy_m0.build.variant=itsybitsy_m0
232+
adafruit_itsybitsy_m0.build.variant_system_lib=
233+
adafruit_itsybitsy_m0.build.vid=0x239A
234+
adafruit_itsybitsy_m0.build.pid=0x800F
235+
adafruit_itsybitsy_m0.bootloader.tool=openocd
236+
adafruit_itsybitsy_m0.bootloader.file=itsybitsy/samd21_sam_ba.bin
237+
238+
239+
adafruit_pirkey.name=Adafruit pIRkey
240+
adafruit_pirkey.vid.0=0x239A
241+
adafruit_pirkey.pid.0=0x801E
242+
adafruit_pirkey.vid.1=0x239A
243+
adafruit_pirkey.pid.1=0x001E
244+
adafruit_pirkey.upload.tool=bossac
245+
adafruit_pirkey.upload.protocol=sam-ba
246+
adafruit_pirkey.upload.maximum_size=262144
247+
adafruit_pirkey.upload.use_1200bps_touch=true
248+
adafruit_pirkey.upload.wait_for_upload_port=true
249+
adafruit_pirkey.upload.native_usb=true
250+
adafruit_pirkey.build.mcu=cortex-m0plus
251+
adafruit_pirkey.build.f_cpu=48000000L
252+
adafruit_pirkey.build.usb_product="pIRKey"
253+
adafruit_pirkey.build.usb_manufacturer="Adafruit"
254+
adafruit_pirkey.build.board=PIRKEY
255+
adafruit_pirkey.build.core=arduino
256+
adafruit_pirkey.build.extra_flags=-DCRYSTALLESS -DADAFRUIT_PIRKEY -D__SAMD21E18A__ {build.usb_flags}
257+
adafruit_pirkey.build.ldscript=linker_scripts/gcc/flash_with_bootloader.ld
258+
adafruit_pirkey.build.openocdscript=openocd_scripts/arduino_zero.cfg
259+
adafruit_pirkey.build.variant=pirkey
260+
adafruit_pirkey.build.variant_system_lib=
261+
adafruit_pirkey.build.vid=0x239A
262+
adafruit_pirkey.build.pid=0x801E
263+
adafruit_pirkey.bootloader.tool=openocd
264+
adafruit_pirkey.bootloader.file=pirkey/bootloader_uf2.bin
8 KB
Binary file not shown.
9.8 KB
Binary file not shown.
20 KB
Binary file not shown.

bootloaders/gemma/bootloader_uf2.bin

8 KB
Binary file not shown.
9.79 KB
Binary file not shown.
20 KB
Binary file not shown.

bootloaders/metro/bootloader_uf2.bin

8 KB
Binary file not shown.
9.78 KB
Binary file not shown.
20 KB
Binary file not shown.
Binary file not shown.
Binary file not shown.
8 KB
Binary file not shown.
9.79 KB
Binary file not shown.
20 KB
Binary file not shown.

cores/arduino/SERCOM.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -652,16 +652,20 @@ void SERCOM::initClockNVIC( void )
652652
clockId = GCM_SERCOM3_CORE;
653653
IdNvic = SERCOM3_IRQn;
654654
}
655+
#if defined(SERCOM4)
655656
else if(sercom == SERCOM4)
656657
{
657658
clockId = GCM_SERCOM4_CORE;
658659
IdNvic = SERCOM4_IRQn;
659660
}
661+
#endif
662+
#if defined(SERCOM5)
660663
else if(sercom == SERCOM5)
661664
{
662665
clockId = GCM_SERCOM5_CORE;
663666
IdNvic = SERCOM5_IRQn;
664667
}
668+
#endif
665669

666670
if ( IdNvic == PendSV_IRQn )
667671
{

cores/arduino/WInterrupts.c

+82-41
Original file line numberDiff line numberDiff line change
@@ -62,57 +62,86 @@ void attachInterrupt(uint32_t pin, voidFuncPtr callback, uint32_t mode)
6262
#else
6363
EExt_Interrupts in = digitalPinToInterrupt(pin);
6464
#endif
65-
if (in == NOT_AN_INTERRUPT || in == EXTERNAL_INT_NMI)
66-
return;
65+
if (in == NOT_AN_INTERRUPT) return;
6766

6867
if (!enabled) {
6968
__initialize();
7069
enabled = 1;
7170
}
7271

73-
// Enable wakeup capability on pin in case being used during sleep
74-
EIC->WAKEUP.reg |= (1 << in);
72+
if (in == EXTERNAL_INT_NMI) {
73+
EIC->NMIFLAG.bit.NMI = 1; // Clear flag
74+
switch (mode) {
75+
case LOW:
76+
EIC->NMICTRL.bit.NMISENSE = EIC_NMICTRL_NMISENSE_LOW;
77+
break;
7578

76-
// Assign pin to EIC
77-
pinPeripheral(pin, PIO_EXTINT);
79+
case HIGH:
80+
EIC->NMICTRL.bit.NMISENSE = EIC_NMICTRL_NMISENSE_HIGH;
81+
break;
7882

79-
// Assign callback to interrupt
80-
callbacksInt[in] = callback;
83+
case CHANGE:
84+
EIC->NMICTRL.bit.NMISENSE = EIC_NMICTRL_NMISENSE_BOTH;
85+
break;
8186

82-
// Look for right CONFIG register to be addressed
83-
if (in > EXTERNAL_INT_7) {
84-
config = 1;
85-
} else {
86-
config = 0;
87-
}
87+
case FALLING:
88+
EIC->NMICTRL.bit.NMISENSE = EIC_NMICTRL_NMISENSE_FALL;
89+
break;
8890

89-
// Configure the interrupt mode
90-
pos = (in - (8 * config)) << 2;
91-
switch (mode)
92-
{
93-
case LOW:
94-
EIC->CONFIG[config].reg |= EIC_CONFIG_SENSE0_LOW_Val << pos;
95-
break;
91+
case RISING:
92+
EIC->NMICTRL.bit.NMISENSE = EIC_NMICTRL_NMISENSE_RISE;
93+
break;
94+
}
9695

97-
case HIGH:
98-
EIC->CONFIG[config].reg |= EIC_CONFIG_SENSE0_HIGH_Val << pos;
99-
break;
96+
// Assign callback to interrupt
97+
callbacksInt[EXTERNAL_INT_NMI] = callback;
10098

101-
case CHANGE:
102-
EIC->CONFIG[config].reg |= EIC_CONFIG_SENSE0_BOTH_Val << pos;
103-
break;
99+
} else { // Not NMI, is external interrupt
104100

105-
case FALLING:
106-
EIC->CONFIG[config].reg |= EIC_CONFIG_SENSE0_FALL_Val << pos;
107-
break;
101+
// Enable wakeup capability on pin in case being used during sleep
102+
EIC->WAKEUP.reg |= (1 << in);
108103

109-
case RISING:
110-
EIC->CONFIG[config].reg |= EIC_CONFIG_SENSE0_RISE_Val << pos;
111-
break;
112-
}
104+
// Assign pin to EIC
105+
pinPeripheral(pin, PIO_EXTINT);
106+
107+
// Look for right CONFIG register to be addressed
108+
if (in > EXTERNAL_INT_7) {
109+
config = 1;
110+
} else {
111+
config = 0;
112+
}
113+
114+
// Configure the interrupt mode
115+
pos = (in - (8 * config)) << 2;
116+
switch (mode)
117+
{
118+
case LOW:
119+
EIC->CONFIG[config].reg |= EIC_CONFIG_SENSE0_LOW_Val << pos;
120+
break;
121+
122+
case HIGH:
123+
EIC->CONFIG[config].reg |= EIC_CONFIG_SENSE0_HIGH_Val << pos;
124+
break;
125+
126+
case CHANGE:
127+
EIC->CONFIG[config].reg |= EIC_CONFIG_SENSE0_BOTH_Val << pos;
128+
break;
129+
130+
case FALLING:
131+
EIC->CONFIG[config].reg |= EIC_CONFIG_SENSE0_FALL_Val << pos;
132+
break;
113133

114-
// Enable the interrupt
115-
EIC->INTENSET.reg = EIC_INTENSET_EXTINT(1 << in);
134+
case RISING:
135+
EIC->CONFIG[config].reg |= EIC_CONFIG_SENSE0_RISE_Val << pos;
136+
break;
137+
}
138+
139+
// Enable the interrupt
140+
EIC->INTENSET.reg = EIC_INTENSET_EXTINT(1 << in);
141+
142+
// Assign callback to interrupt
143+
callbacksInt[in] = callback;
144+
}
116145
}
117146

118147
/*
@@ -125,13 +154,16 @@ void detachInterrupt(uint32_t pin)
125154
#else
126155
EExt_Interrupts in = digitalPinToInterrupt(pin);
127156
#endif
128-
if (in == NOT_AN_INTERRUPT || in == EXTERNAL_INT_NMI)
129-
return;
157+
if (in == NOT_AN_INTERRUPT) return;
130158

131-
EIC->INTENCLR.reg = EIC_INTENCLR_EXTINT(1 << in);
159+
if(in == EXTERNAL_INT_NMI) {
160+
EIC->NMICTRL.bit.NMISENSE = 0; // Turn off detection
161+
} else {
162+
EIC->INTENCLR.reg = EIC_INTENCLR_EXTINT(1 << in);
132163

133-
// Disable wakeup capability on pin during sleep
134-
EIC->WAKEUP.reg &= ~(1 << in);
164+
// Disable wakeup capability on pin during sleep
165+
EIC->WAKEUP.reg &= ~(1 << in);
166+
}
135167
}
136168

137169
/*
@@ -154,3 +186,12 @@ void EIC_Handler(void)
154186
}
155187
}
156188
}
189+
190+
/*
191+
* NMI Interrupt Handler
192+
*/
193+
void NMI_Handler(void)
194+
{
195+
if (callbacksInt[EXTERNAL_INT_NMI]) callbacksInt[EXTERNAL_INT_NMI]();
196+
EIC->NMIFLAG.bit.NMI = 1; // Clear interrupt
197+
}

0 commit comments

Comments
 (0)