Skip to content

Commit efc18dc

Browse files
authored
Merge pull request sipeed#7 from ReinForce-II/add_winterrupts
add winterrupts
2 parents cd48612 + ad0dfe4 commit efc18dc

File tree

4 files changed

+219
-87
lines changed

4 files changed

+219
-87
lines changed

cores/arduino/Common.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -132,9 +132,9 @@ unsigned long pulseInLong(pin_size_t pin, uint8_t state, unsigned long timeout);
132132
void shiftOut(pin_size_t dataPin, pin_size_t clockPin, BitOrder bitOrder, uint8_t val);
133133
pin_size_t shiftIn(pin_size_t dataPin, pin_size_t clockPin, BitOrder bitOrder);
134134

135-
void attachInterrupt(pin_size_t interruptNumber, voidFuncPtr callback, PinStatus mode);//TODO
136-
void attachInterruptParam(pin_size_t interruptNumber, voidFuncPtrParam callback, PinStatus mode, void* param);//TODO
137-
void detachInterrupt(pin_size_t interruptNumber);//TODO
135+
void attachInterrupt(pin_size_t interruptNumber, voidFuncPtr callback, PinStatus mode);
136+
void attachInterruptParam(pin_size_t interruptNumber, voidFuncPtrParam callback, PinStatus mode, void* param);
137+
void detachInterrupt(pin_size_t interruptNumber);
138138

139139
void setup(void);
140140
void loop(void);

cores/arduino/WInterrupts.c

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
#include <gd32vf103.h>
2+
#include <stdlib.h>
3+
#include "pins_arduino.h"
4+
5+
typedef struct _handler_list_t {
6+
uint8_t pinId;
7+
void* handler;
8+
PinStatus mode;
9+
void* param;
10+
struct _handler_list_t* next;
11+
} handler_list_t;
12+
13+
static handler_list_t* handler_list = 0;
14+
15+
static void attachInterruptInternal(handler_list_t* ptr, uint8_t pinId,
16+
void* callback, PinStatus mode, void* param) {
17+
eclic_irq_enable(PIN_MAP[pinId].irqn, 0, 0);
18+
gpio_exti_source_select(pinId >> 4, pinId & 0xF);
19+
if (mode == RISING) {
20+
exti_init(pinId & 0xF, EXTI_INTERRUPT, EXTI_TRIG_RISING);
21+
}
22+
else if (mode == FALLING) {
23+
exti_init(pinId & 0xF, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
24+
}
25+
else if (mode == CHANGE) {
26+
exti_init(pinId & 0xF, EXTI_INTERRUPT, EXTI_TRIG_BOTH);
27+
}
28+
else if (mode == RISING) {
29+
exti_init(pinId & 0xF, EXTI_INTERRUPT, EXTI_TRIG_NONE);
30+
}
31+
exti_interrupt_flag_clear(pinId & 0xF);
32+
exti_interrupt_enable(pinId & 0xF);
33+
ptr->handler = callback;
34+
ptr->pinId = pinId;
35+
ptr->mode = mode;
36+
ptr->param = param;
37+
}
38+
39+
void attachInterrupt(pin_size_t pinId, voidFuncPtr callback, PinStatus mode) {
40+
attachInterruptParam(pinId, (voidFuncPtrParam)callback, mode, 0);
41+
}
42+
43+
void attachInterruptParam(
44+
pin_size_t pinId, voidFuncPtrParam callback, PinStatus mode, void* param) {
45+
if (pinId >= VARIANT_GPIO_NUM) {
46+
return;
47+
}
48+
if (callback == 0) {
49+
return;
50+
}
51+
if (handler_list == 0) {
52+
handler_list = calloc(1, sizeof(handler_list_t));
53+
attachInterruptInternal(handler_list, pinId, callback, mode, 0);
54+
handler_list->next = 0;
55+
return;
56+
}
57+
handler_list_t* ptr = handler_list;
58+
handler_list_t* previousPtr = handler_list;
59+
while (ptr != 0) {
60+
if (ptr->pinId == pinId) {
61+
attachInterruptInternal(ptr, pinId, callback, mode, 0);
62+
return;
63+
}
64+
previousPtr = ptr;
65+
ptr = ptr->next;
66+
}
67+
previousPtr->next = calloc(1, sizeof(handler_list_t));
68+
ptr = previousPtr->next;
69+
attachInterruptInternal(ptr, pinId, callback, mode, 0);
70+
ptr->next = 0;
71+
return;
72+
}
73+
74+
void detachInterrupt(pin_size_t pinId) {
75+
if (handler_list == 0) {
76+
return;
77+
}
78+
if (handler_list->pinId == pinId) {
79+
if (handler_list->next == 0) {
80+
free(handler_list);
81+
handler_list = 0;
82+
return;
83+
}
84+
else {
85+
handler_list_t* ptr = handler_list;
86+
handler_list = handler_list->next;
87+
free(ptr);
88+
return;
89+
}
90+
}
91+
handler_list_t* ptr = handler_list->next;
92+
handler_list_t* previousPtr = handler_list;
93+
while (ptr != 0) {
94+
if (ptr->pinId == pinId) {
95+
previousPtr->next = ptr->next;
96+
free(ptr);
97+
return;
98+
}
99+
previousPtr = ptr;
100+
ptr = ptr->next;
101+
}
102+
return;
103+
}
104+
105+
static void generic_IRQHandler(void) {
106+
handler_list_t* ptr = handler_list;
107+
while (ptr != 0) {
108+
if (exti_interrupt_flag_get(ptr->pinId & 0xF)) {
109+
if (ptr->param == 0) {}
110+
else {
111+
((void (*)(void*))(ptr->handler))(ptr->param);
112+
}
113+
exti_interrupt_flag_clear(ptr->pinId & 0xF);
114+
break;
115+
}
116+
ptr = ptr->next;
117+
}
118+
return;
119+
}
120+
121+
void __attribute__((interrupt)) EXTI0_IRQHandler(void) { generic_IRQHandler(); }
122+
void __attribute__((interrupt)) EXTI1_IRQHandler(void) { generic_IRQHandler(); }
123+
void __attribute__((interrupt)) EXTI2_IRQHandler(void) { generic_IRQHandler(); }
124+
void __attribute__((interrupt)) EXTI3_IRQHandler(void) { generic_IRQHandler(); }
125+
void __attribute__((interrupt)) EXTI4_IRQHandler(void) { generic_IRQHandler(); }
126+
void __attribute__((interrupt)) EXTI5_9_IRQHandler(void) {
127+
generic_IRQHandler();
128+
}
129+
void __attribute__((interrupt)) EXTI10_15_IRQHandler(void) {
130+
generic_IRQHandler();
131+
}

variants/sipeed-longan-nano/pins_arduino.c

Lines changed: 84 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -85,90 +85,90 @@ const gd32v_pin_info_t PIN_MAP[VARIANT_GPIO_NUM] = {
8585
uint8 timer_channel; Timer channel, or 0 if none.
8686
uint8 adc_channel; Pin ADC channel, or ADCx if none.
8787
*/
88-
{&gpioa, &timer1, &adc0, 0, 0, 0}, /* PA0 */
89-
{&gpioa, &timer1, &adc0, 1, 1, 1}, /* PA1 */
90-
{&gpioa, &timer1, &adc0, 2, 2, 2}, /* PA2 */
91-
{&gpioa, &timer1, &adc0, 3, 3, 3}, /* PA3 */
92-
{&gpioa, 0, &adc0, 4, 0, 4}, /* PA4 */
93-
{&gpioa, 0, &adc0, 5, 0, 5}, /* PA5 */
94-
{&gpioa, &timer2, &adc0, 6, 0, 6}, /* PA6 */
95-
{&gpioa, &timer2, &adc0, 7, 1, 7}, /* PA7 */
96-
{&gpioa, &timer0, 0, 8, 0, 0}, /* PA8 */
97-
{&gpioa, &timer0, 0, 9, 1, 0}, /* PA9 */
98-
{&gpioa, &timer0, 0, 10, 2, 0}, /* PA10 */
99-
{&gpioa, &timer0, 0, 11, 3, 0}, /* PA11 */
100-
{&gpioa, 0, 0, 12, 0, 0}, /* PA12 */
101-
{&gpioa, 0, 0, 13, 0, 0}, /* PA13 */
102-
{&gpioa, 0, 0, 14, 0, 0}, /* PA14 */
103-
{&gpioa, 0, 0, 15, 0, 0}, /* PA15 */
104-
105-
{&gpiob, &timer2, &adc0, 0, 2, 8}, /* PB0 */
106-
{&gpiob, &timer2, &adc0, 1, 3, 9}, /* PB1 */
107-
{&gpiob, 0, 0, 2, 0, 0}, /* PB2 */
108-
{&gpiob, 0, 0, 3, 0, 0}, /* PB3 */
109-
{&gpiob, 0, 0, 4, 0, 0}, /* PB4 */
110-
{&gpiob, 0, 0, 5, 0, 0}, /* PB5 */
111-
{&gpiob, &timer3, 0, 6, 0, 0}, /* PB6 */
112-
{&gpiob, &timer3, 0, 7, 1, 0}, /* PB7 */
113-
{&gpiob, &timer3, 0, 8, 2, 0}, /* PB8 */
114-
{&gpiob, &timer3, 0, 9, 3, 0}, /* PB9 */
115-
{&gpiob, 0, 0, 10, 0, 0}, /* PB10 */
116-
{&gpiob, 0, 0, 11, 0, 0}, /* PB11 */
117-
{&gpiob, 0, 0, 12, 0, 0}, /* PB12 */
118-
{&gpiob, 0, 0, 13, 0, 0}, /* PB13 */
119-
{&gpiob, 0, 0, 14, 0, 0}, /* PB14 */
120-
{&gpiob, 0, 0, 15, 0, 0}, /* PB15 */
121-
122-
{&gpioc, 0, &adc0, 0, 0, 10}, /* PC0 */
123-
{&gpioc, 0, &adc0, 1, 0, 11}, /* PC1 */
124-
{&gpioc, 0, &adc0, 2, 0, 12}, /* PC2 */
125-
{&gpioc, 0, &adc0, 3, 0, 13}, /* PC3 */
126-
{&gpioc, 0, &adc0, 4, 0, 14}, /* PC4 */
127-
{&gpioc, 0, &adc0, 5, 0, 15}, /* PC5 */
128-
{&gpioc, 0, 0, 6, 0, 0}, /* PC6 */
129-
{&gpioc, 0, 0, 7, 0, 0}, /* PC7 */
130-
{&gpioc, 0, 0, 8, 0, 0}, /* PC8 */
131-
{&gpioc, 0, 0, 9, 0, 0}, /* PC9 */
132-
{&gpioc, 0, 0, 10, 0, 0}, /* PC10 */
133-
{&gpioc, 0, 0, 11, 0, 0}, /* PC11 */
134-
{&gpioc, 0, 0, 12, 0, 0}, /* PC12 */
135-
{&gpioc, 0, 0, 13, 0, 0}, /* PC13 */
136-
{&gpioc, 0, 0, 14, 0, 0}, /* PC14 */
137-
{&gpioc, 0, 0, 15, 0, 0}, /* PC15 */
138-
139-
{&gpiod, 0, 0, 0, 0, 0}, /* PD0 */
140-
{&gpiod, 0, 0, 1, 0, 0}, /* PD1 */
141-
{&gpiod, 0, 0, 2, 0, 0}, /* PD2 */
142-
{&gpiod, 0, 0, 3, 0, 0}, /* PD3 */
143-
{&gpiod, 0, 0, 4, 0, 0}, /* PD4 */
144-
{&gpiod, 0, 0, 5, 0, 0}, /* PD5 */
145-
{&gpiod, 0, 0, 6, 0, 0}, /* PD6 */
146-
{&gpiod, 0, 0, 7, 0, 0}, /* PD7 */
147-
{&gpiod, 0, 0, 8, 0, 0}, /* PD8 */
148-
{&gpiod, 0, 0, 9, 0, 0}, /* PD9 */
149-
{&gpiod, 0, 0, 10, 0, 0}, /* PD10 */
150-
{&gpiod, 0, 0, 11, 0, 0}, /* PD11 */
151-
{&gpiod, 0, 0, 12, 0, 0}, /* PD12 */
152-
{&gpiod, 0, 0, 13, 0, 0}, /* PD13 */
153-
{&gpiod, 0, 0, 14, 0, 0}, /* PD14 */
154-
{&gpiod, 0, 0, 15, 0, 0}, /* PD15 */
155-
156-
{&gpioe, 0, 0, 0, 0, 0}, /* PE0 */
157-
{&gpioe, 0, 0, 1, 0, 0}, /* PE1 */
158-
{&gpioe, 0, 0, 2, 0, 0}, /* PE2 */
159-
{&gpioe, 0, 0, 3, 0, 0}, /* PE3 */
160-
{&gpioe, 0, 0, 4, 0, 0}, /* PE4 */
161-
{&gpioe, 0, 0, 5, 0, 0}, /* PE5 */
162-
{&gpioe, 0, 0, 6, 0, 0}, /* PE6 */
163-
{&gpioe, 0, 0, 7, 0, 0}, /* PE7 */
164-
{&gpioe, 0, 0, 8, 0, 0}, /* PE8 */
165-
{&gpioe, 0, 0, 9, 0, 0}, /* PE9 */
166-
{&gpioe, 0, 0, 10, 0, 0}, /* PE10 */
167-
{&gpioe, 0, 0, 11, 0, 0}, /* PE11 */
168-
{&gpioe, 0, 0, 12, 0, 0}, /* PE12 */
169-
{&gpioe, 0, 0, 13, 0, 0}, /* PE13 */
170-
{&gpioe, 0, 0, 14, 0, 0}, /* PE14 */
171-
{&gpioe, 0, 0, 15, 0, 0}, /* PE15 */
88+
{&gpioa, &timer1, &adc0, 0, 0, 0, EXTI0_IRQn}, /* PA0 */
89+
{&gpioa, &timer1, &adc0, 1, 1, 1, EXTI1_IRQn}, /* PA1 */
90+
{&gpioa, &timer1, &adc0, 2, 2, 2, EXTI2_IRQn}, /* PA2 */
91+
{&gpioa, &timer1, &adc0, 3, 3, 3, EXTI3_IRQn}, /* PA3 */
92+
{&gpioa, 0, &adc0, 4, 0, 4, EXTI4_IRQn}, /* PA4 */
93+
{&gpioa, 0, &adc0, 5, 0, 5, EXTI5_9_IRQn}, /* PA5 */
94+
{&gpioa, &timer2, &adc0, 6, 0, 6, EXTI5_9_IRQn}, /* PA6 */
95+
{&gpioa, &timer2, &adc0, 7, 1, 7, EXTI5_9_IRQn}, /* PA7 */
96+
{&gpioa, &timer0, 0, 8, 0, 0, EXTI5_9_IRQn}, /* PA8 */
97+
{&gpioa, &timer0, 0, 9, 1, 0, EXTI5_9_IRQn}, /* PA9 */
98+
{&gpioa, &timer0, 0, 10, 2, 0, EXTI10_15_IRQn}, /* PA10 */
99+
{&gpioa, &timer0, 0, 11, 3, 0, EXTI10_15_IRQn}, /* PA11 */
100+
{&gpioa, 0, 0, 12, 0, 0, EXTI10_15_IRQn}, /* PA12 */
101+
{&gpioa, 0, 0, 13, 0, 0, EXTI10_15_IRQn}, /* PA13 */
102+
{&gpioa, 0, 0, 14, 0, 0, EXTI10_15_IRQn}, /* PA14 */
103+
{&gpioa, 0, 0, 15, 0, 0, EXTI10_15_IRQn}, /* PA15 */
104+
105+
{&gpiob, &timer2, &adc0, 0, 2, 8, EXTI0_IRQn}, /* PB0 */
106+
{&gpiob, &timer2, &adc0, 1, 3, 9, EXTI1_IRQn}, /* PB1 */
107+
{&gpiob, 0, 0, 2, 0, 0, EXTI2_IRQn}, /* PB2 */
108+
{&gpiob, 0, 0, 3, 0, 0, EXTI3_IRQn}, /* PB3 */
109+
{&gpiob, 0, 0, 4, 0, 0, EXTI4_IRQn}, /* PB4 */
110+
{&gpiob, 0, 0, 5, 0, 0, EXTI5_9_IRQn}, /* PB5 */
111+
{&gpiob, &timer3, 0, 6, 0, 0, EXTI5_9_IRQn}, /* PB6 */
112+
{&gpiob, &timer3, 0, 7, 1, 0, EXTI5_9_IRQn}, /* PB7 */
113+
{&gpiob, &timer3, 0, 8, 2, 0, EXTI5_9_IRQn}, /* PB8 */
114+
{&gpiob, &timer3, 0, 9, 3, 0, EXTI5_9_IRQn}, /* PB9 */
115+
{&gpiob, 0, 0, 10, 0, 0, EXTI10_15_IRQn}, /* PB10 */
116+
{&gpiob, 0, 0, 11, 0, 0, EXTI10_15_IRQn}, /* PB11 */
117+
{&gpiob, 0, 0, 12, 0, 0, EXTI10_15_IRQn}, /* PB12 */
118+
{&gpiob, 0, 0, 13, 0, 0, EXTI10_15_IRQn}, /* PB13 */
119+
{&gpiob, 0, 0, 14, 0, 0, EXTI10_15_IRQn}, /* PB14 */
120+
{&gpiob, 0, 0, 15, 0, 0, EXTI10_15_IRQn}, /* PB15 */
121+
122+
{&gpioc, 0, &adc0, 0, 0, 10, EXTI0_IRQn}, /* PC0 */
123+
{&gpioc, 0, &adc0, 1, 0, 11, EXTI1_IRQn}, /* PC1 */
124+
{&gpioc, 0, &adc0, 2, 0, 12, EXTI2_IRQn}, /* PC2 */
125+
{&gpioc, 0, &adc0, 3, 0, 13, EXTI3_IRQn}, /* PC3 */
126+
{&gpioc, 0, &adc0, 4, 0, 14, EXTI4_IRQn}, /* PC4 */
127+
{&gpioc, 0, &adc0, 5, 0, 15, EXTI5_9_IRQn}, /* PC5 */
128+
{&gpioc, 0, 0, 6, 0, 0, EXTI5_9_IRQn}, /* PC6 */
129+
{&gpioc, 0, 0, 7, 0, 0, EXTI5_9_IRQn}, /* PC7 */
130+
{&gpioc, 0, 0, 8, 0, 0, EXTI5_9_IRQn}, /* PC8 */
131+
{&gpioc, 0, 0, 9, 0, 0, EXTI5_9_IRQn}, /* PC9 */
132+
{&gpioc, 0, 0, 10, 0, 0, EXTI10_15_IRQn}, /* PC10 */
133+
{&gpioc, 0, 0, 11, 0, 0, EXTI10_15_IRQn}, /* PC11 */
134+
{&gpioc, 0, 0, 12, 0, 0, EXTI10_15_IRQn}, /* PC12 */
135+
{&gpioc, 0, 0, 13, 0, 0, EXTI10_15_IRQn}, /* PC13 */
136+
{&gpioc, 0, 0, 14, 0, 0, EXTI10_15_IRQn}, /* PC14 */
137+
{&gpioc, 0, 0, 15, 0, 0, EXTI10_15_IRQn}, /* PC15 */
138+
139+
{&gpiod, 0, 0, 0, 0, 0, EXTI0_IRQn}, /* PD0 */
140+
{&gpiod, 0, 0, 1, 0, 0, EXTI1_IRQn}, /* PD1 */
141+
{&gpiod, 0, 0, 2, 0, 0, EXTI2_IRQn}, /* PD2 */
142+
{&gpiod, 0, 0, 3, 0, 0, EXTI3_IRQn}, /* PD3 */
143+
{&gpiod, 0, 0, 4, 0, 0, EXTI4_IRQn}, /* PD4 */
144+
{&gpiod, 0, 0, 5, 0, 0, EXTI5_9_IRQn}, /* PD5 */
145+
{&gpiod, 0, 0, 6, 0, 0, EXTI5_9_IRQn}, /* PD6 */
146+
{&gpiod, 0, 0, 7, 0, 0, EXTI5_9_IRQn}, /* PD7 */
147+
{&gpiod, 0, 0, 8, 0, 0, EXTI5_9_IRQn}, /* PD8 */
148+
{&gpiod, 0, 0, 9, 0, 0, EXTI5_9_IRQn}, /* PD9 */
149+
{&gpiod, 0, 0, 10, 0, 0, EXTI10_15_IRQn}, /* PD10 */
150+
{&gpiod, 0, 0, 11, 0, 0, EXTI10_15_IRQn}, /* PD11 */
151+
{&gpiod, 0, 0, 12, 0, 0, EXTI10_15_IRQn}, /* PD12 */
152+
{&gpiod, 0, 0, 13, 0, 0, EXTI10_15_IRQn}, /* PD13 */
153+
{&gpiod, 0, 0, 14, 0, 0, EXTI10_15_IRQn}, /* PD14 */
154+
{&gpiod, 0, 0, 15, 0, 0, EXTI10_15_IRQn}, /* PD15 */
155+
156+
{&gpioe, 0, 0, 0, 0, 0, EXTI0_IRQn}, /* PE0 */
157+
{&gpioe, 0, 0, 1, 0, 0, EXTI1_IRQn}, /* PE1 */
158+
{&gpioe, 0, 0, 2, 0, 0, EXTI2_IRQn}, /* PE2 */
159+
{&gpioe, 0, 0, 3, 0, 0, EXTI3_IRQn}, /* PE3 */
160+
{&gpioe, 0, 0, 4, 0, 0, EXTI4_IRQn}, /* PE4 */
161+
{&gpioe, 0, 0, 5, 0, 0, EXTI5_9_IRQn}, /* PE5 */
162+
{&gpioe, 0, 0, 6, 0, 0, EXTI5_9_IRQn}, /* PE6 */
163+
{&gpioe, 0, 0, 7, 0, 0, EXTI5_9_IRQn}, /* PE7 */
164+
{&gpioe, 0, 0, 8, 0, 0, EXTI5_9_IRQn}, /* PE8 */
165+
{&gpioe, 0, 0, 9, 0, 0, EXTI5_9_IRQn}, /* PE9 */
166+
{&gpioe, 0, 0, 10, 0, 0, EXTI10_15_IRQn}, /* PE10 */
167+
{&gpioe, 0, 0, 11, 0, 0, EXTI10_15_IRQn}, /* PE11 */
168+
{&gpioe, 0, 0, 12, 0, 0, EXTI10_15_IRQn}, /* PE12 */
169+
{&gpioe, 0, 0, 13, 0, 0, EXTI10_15_IRQn}, /* PE13 */
170+
{&gpioe, 0, 0, 14, 0, 0, EXTI10_15_IRQn}, /* PE14 */
171+
{&gpioe, 0, 0, 15, 0, 0, EXTI10_15_IRQn}, /* PE15 */
172172
};
173173

174174

variants/sipeed-longan-nano/pins_arduino.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ typedef struct _gd32v_pin_info_t
5555
uint8_t gpio_bit;
5656
uint8_t timer_channel;
5757
uint8_t adc_channel;
58+
IRQn_Type irqn;
5859
} gd32v_pin_info_t;
5960

6061
#define VARIANT_GPIO_NUM (80)

0 commit comments

Comments
 (0)