Skip to content

Commit 5edc110

Browse files
committed
[sam] attachInterrupt() now works also on pins that belongs to PORTD
1 parent 3f105bc commit 5edc110

File tree

2 files changed

+22
-0
lines changed

2 files changed

+22
-0
lines changed

Diff for: build/shared/revisions.txt

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ ARDUINO 1.5.2 BETA - 2012.01.23
1616
* Extended command line build flags
1717

1818
[arduino core]
19+
* sam: attachInterrupt() now works also on pins that belongs to PORTD
1920
* sam: portOutputRegister() is now writeable.
2021
* sam: fixed issue on weak-symbol for some interrupt handlers
2122
* sam: fixed BSoD on some Windows machine (louismdavis)

Diff for: hardware/arduino/sam/cores/arduino/WInterrupts.c

+21
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ typedef void (*interruptCB)(void);
2323
static interruptCB callbacksPioA[32];
2424
static interruptCB callbacksPioB[32];
2525
static interruptCB callbacksPioC[32];
26+
static interruptCB callbacksPioD[32];
2627

2728
/* Configure PIO interrupt sources */
2829
static void __initialize() {
@@ -31,6 +32,7 @@ static void __initialize() {
3132
callbacksPioA[i] = NULL;
3233
callbacksPioB[i] = NULL;
3334
callbacksPioC[i] = NULL;
35+
callbacksPioD[i] = NULL;
3436
}
3537

3638
pmc_enable_periph_clk(ID_PIOA);
@@ -50,6 +52,12 @@ static void __initialize() {
5052
NVIC_ClearPendingIRQ(PIOC_IRQn);
5153
NVIC_SetPriority(PIOC_IRQn, 0);
5254
NVIC_EnableIRQ(PIOC_IRQn);
55+
56+
pmc_enable_periph_clk(ID_PIOD);
57+
NVIC_DisableIRQ(PIOD_IRQn);
58+
NVIC_ClearPendingIRQ(PIOD_IRQn);
59+
NVIC_SetPriority(PIOD_IRQn, 0);
60+
NVIC_EnableIRQ(PIOD_IRQn);
5361
}
5462

5563

@@ -77,6 +85,8 @@ void attachInterrupt(uint32_t pin, void (*callback)(void), uint32_t mode)
7785
callbacksPioB[pos] = callback;
7886
if (pio == PIOC)
7987
callbacksPioC[pos] = callback;
88+
if (pio == PIOD)
89+
callbacksPioD[pos] = callback;
8090

8191
// Configure the interrupt mode
8292
if (mode == CHANGE) {
@@ -156,6 +166,17 @@ void PIOC_Handler(void) {
156166
}
157167
}
158168

169+
void PIOD_Handler(void) {
170+
uint32_t isr = PIOD->PIO_ISR;
171+
uint32_t i;
172+
for (i=0; i<32; i++, isr>>=1) {
173+
if ((isr & 0x1) == 0)
174+
continue;
175+
if (callbacksPioD[i])
176+
callbacksPioD[i]();
177+
}
178+
}
179+
159180
#ifdef __cplusplus
160181
}
161182
#endif

0 commit comments

Comments
 (0)