@@ -51,7 +51,7 @@ static void mcu_setup_clocks(void)
5151 PM -> APBBSEL .reg = 0 ;
5252 PM -> APBCSEL .reg = 0 ;
5353 PM -> AHBMASK .reg |= (PM_AHBMASK_NVMCTRL );
54- PM -> APBAMASK .reg |= (PM_APBAMASK_PM | PM_APBAMASK_SYSCTRL | PM_APBAMASK_GCLK | PM_APBAMASK_RTC );
54+ PM -> APBAMASK .reg |= (PM_APBAMASK_PM | PM_APBAMASK_SYSCTRL | PM_APBAMASK_GCLK | PM_APBAMASK_RTC | PM_APBAMASK_EIC );
5555 PM -> APBBMASK .reg |= (PM_APBBMASK_NVMCTRL | PM_APBBMASK_PORT | PM_APBBMASK_USB );
5656 PM -> APBCMASK .reg |= (PM_APBCMASK_TCC0 | PM_APBCMASK_TCC1 | PM_APBCMASK_TCC2 | PM_APBCMASK_TC3 | PM_APBCMASK_TC4 | PM_APBCMASK_TC5 | PM_APBCMASK_TC6 | PM_APBCMASK_TC7 );
5757 PM -> APBCMASK .reg |= PM_APBCMASK_ADC ;
@@ -86,20 +86,31 @@ static void mcu_setup_clocks(void)
8686 while (GCLK -> STATUS .bit .SYNCBUSY )
8787 ;
8888
89- #if (SAMD21_EIC_MASK != 0 )
89+ #if (SAMD21_EIC_MASK != 0 ) && !defined(ARDUINO )
90+ // EIC->CTRL.bit.SWRST = 1;
91+ // while (EIC->STATUS.bit.SYNCBUSY || EIC->CTRL.bit.SWRST)
92+ // ;
93+
94+ NVIC_DisableIRQ (EIC_IRQn );
95+ NVIC_ClearPendingIRQ (EIC_IRQn );
96+ NVIC_SetPriority (EIC_IRQn , NVIC_INPUT_IRQ_Pri );
97+ NVIC_EnableIRQ (EIC_IRQn );
98+
9099 GCLK -> CLKCTRL .reg = (uint16_t )(GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_ID_EIC );
100+
91101 EIC -> CTRL .bit .ENABLE = 1 ;
92102 while (EIC -> STATUS .bit .SYNCBUSY )
93103 ;
104+
105+ EIC -> WAKEUP .reg = SAMD21_EIC_MASK ;
106+
94107 /*all external interrupts will be on pin change with filter*/
95- EIC -> CONFIG [0 ].reg = 0xbbbbbbbb ;
96- EIC -> CONFIG [1 ].reg = 0xbbbbbbbb ;
97- NVIC_SetPriority (EIC_IRQn , NVIC_INPUT_IRQ_Pri );
98- NVIC_ClearPendingIRQ (EIC_IRQn );
99- NVIC_EnableIRQ (EIC_IRQn );
108+ EIC -> CONFIG [0 ].reg = 0x33333333 ;
109+ EIC -> CONFIG [1 ].reg = 0x33333333 ;
100110 EIC -> EVCTRL .reg = 0 ;
101111 EIC -> INTFLAG .reg = SAMD21_EIC_MASK ;
102112 EIC -> INTENSET .reg = SAMD21_EIC_MASK ;
113+
103114#endif
104115 // ADC clock
105116 GCLK -> CLKCTRL .reg = GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK4 | GCLK_CLKCTRL_ID_ADC ;
@@ -147,37 +158,55 @@ static void mcu_setup_clocks(void)
147158static bool mcu_probe_isr_enabled ;
148159#endif
149160
161+ #ifndef ARDUINO
150162void EIC_Handler (void )
151163{
164+ uint32_t status = EIC -> INTFLAG .reg ;
165+
152166#if (LIMITS_EICMASK != 0 )
153- if (EIC -> INTFLAG . reg & LIMITS_EICMASK )
167+ if (status & LIMITS_EICMASK )
154168 {
155169 mcu_limits_changed_cb ();
156170 }
157171#endif
158172#if (CONTROLS_EICMASK != 0 )
159- if (EIC -> INTFLAG . reg & CONTROLS_EICMASK )
173+ if (status & CONTROLS_EICMASK )
160174 {
161175 mcu_controls_changed_cb ();
162176 }
163177#endif
164178#if (PROBE_EICMASK != 0 )
165- if (EIC -> INTFLAG . reg & PROBE_EICMASK && mcu_probe_isr_enabled )
179+ if (status & PROBE_EICMASK && mcu_probe_isr_enabled )
166180 {
167181 mcu_probe_changed_cb ();
168182 }
169183#endif
170184#if (DIN_IO_EICMASK != 0 )
171- if (EIC -> INTFLAG . reg & DIN_IO_EICMASK )
185+ if (status & DIN_IO_EICMASK )
172186 {
173187 mcu_inputs_changed_cb ();
174188 }
189+ #endif
190+ EIC -> INTFLAG .reg = status ;
191+ }
175192#endif
176193
177- EIC -> INTFLAG .reg = SAMD21_EIC_MASK ;
194+ #ifdef ARDUINO
195+ uint32_t findPin (EPortType port , uint32_t pin )
196+ {
197+ for (unsigned int i = 0 ; i < PINCOUNT_fn (); i ++ )
198+ {
199+ if (g_APinDescription [i ].ulPort == port && g_APinDescription [i ].ulPin == pin )
200+ {
201+ return i ;
202+ }
203+ }
204+ return -1 ;
178205}
179206#endif
180207
208+ #endif
209+
181210void MCU_ITP_ISR (void )
182211{
183212 static bool resetstep = false;
0 commit comments