27#include "kernel/logging.h"
70 IRQerrorLog(
"\r\n***Unexpected Peripheral interrupt [Boardcore]\r\n");
80 IRQerrorLog(
"\r\nUnexpected Peripheral interrupt EXTI0\r\n");
85 IRQerrorLog(
"\r\nUnexpected Peripheral interrupt EXTI1\r\n");
90 IRQerrorLog(
"\r\nUnexpected Peripheral interrupt EXTI2\r\n");
95 IRQerrorLog(
"\r\nUnexpected Peripheral interrupt EXTI3\r\n");
100 IRQerrorLog(
"\r\nUnexpected Peripheral interrupt EXTI4\r\n");
105 IRQerrorLog(
"\r\nUnexpected Peripheral interrupt EXTI5\r\n");
110 IRQerrorLog(
"\r\nUnexpected Peripheral interrupt EXTI6\r\n");
115 IRQerrorLog(
"\r\nUnexpected Peripheral interrupt EXTI7\r\n");
120 IRQerrorLog(
"\r\nUnexpected Peripheral interrupt EXTI8\r\n");
125 IRQerrorLog(
"\r\nUnexpected Peripheral interrupt EXTI9\r\n");
130 IRQerrorLog(
"\r\nUnexpected Peripheral interrupt EXTI10\r\n");
135 IRQerrorLog(
"\r\nUnexpected Peripheral interrupt EXTI11\r\n");
140 IRQerrorLog(
"\r\nUnexpected Peripheral interrupt EXTI12\r\n");
145 IRQerrorLog(
"\r\nUnexpected Peripheral interrupt EXTI13\r\n");
150 IRQerrorLog(
"\r\nUnexpected Peripheral interrupt EXTI14\r\n");
155 IRQerrorLog(
"\r\nUnexpected Peripheral interrupt EXTI15\r\n");
165 EXTI->PR = EXTI_PR_PR0;
166 asm volatile(
"bl _Z20EXTI0_IRQHandlerImplv");
177 EXTI->PR = EXTI_PR_PR1;
178 asm volatile(
"bl _Z20EXTI1_IRQHandlerImplv");
189 EXTI->PR = EXTI_PR_PR2;
190 asm volatile(
"bl _Z20EXTI2_IRQHandlerImplv");
201 EXTI->PR = EXTI_PR_PR3;
202 asm volatile(
"bl _Z20EXTI3_IRQHandlerImplv");
213 EXTI->PR = EXTI_PR_PR4;
214 asm volatile(
"bl _Z20EXTI4_IRQHandlerImplv");
225 asm volatile(
"bl _Z22EXTI9_5_IRQHandlerImplv");
236 asm volatile(
"bl _Z24EXTI15_10_IRQHandlerImplv");
248 if (EXTI->PR & EXTI_PR_PR5)
250 EXTI->PR = EXTI_PR_PR5;
251 EXTI5_IRQHandlerImpl();
253 else if (EXTI->PR & EXTI_PR_PR6)
255 EXTI->PR = EXTI_PR_PR6;
256 EXTI6_IRQHandlerImpl();
258 else if (EXTI->PR & EXTI_PR_PR7)
260 EXTI->PR = EXTI_PR_PR7;
261 EXTI7_IRQHandlerImpl();
263 else if (EXTI->PR & EXTI_PR_PR8)
265 EXTI->PR = EXTI_PR_PR8;
266 EXTI8_IRQHandlerImpl();
268 else if (EXTI->PR & EXTI_PR_PR9)
270 EXTI->PR = EXTI_PR_PR9;
271 EXTI9_IRQHandlerImpl();
283 if (EXTI->PR & EXTI_PR_PR10)
285 EXTI->PR = EXTI_PR_PR10;
286 EXTI10_IRQHandlerImpl();
288 else if (EXTI->PR & EXTI_PR_PR11)
290 EXTI->PR = EXTI_PR_PR11;
291 EXTI11_IRQHandlerImpl();
293 else if (EXTI->PR & EXTI_PR_PR12)
295 EXTI->PR = EXTI_PR_PR12;
296 EXTI12_IRQHandlerImpl();
298 else if (EXTI->PR & EXTI_PR_PR13)
300 EXTI->PR = EXTI_PR_PR13;
301 EXTI13_IRQHandlerImpl();
303 else if (EXTI->PR & EXTI_PR_PR14)
305 EXTI->PR = EXTI_PR_PR14;
306 EXTI14_IRQHandlerImpl();
308 else if (EXTI->PR & EXTI_PR_PR15)
310 EXTI->PR = EXTI_PR_PR15;
311 EXTI15_IRQHandlerImpl();
324 return P == GPIOA_BASE? 0 :
333#if (defined (STM32F427xx) || defined (STM32F437xx) || defined (STM32F429xx) || defined (STM32F439xx))
335 P == GPIOK_BASE? 10 :
345 return N==0? EXTI0_IRQn :
350 (N>=5&&N<=9)? EXTI9_5_IRQn :
363 return (0b1111 << ((N % 4) * 4));
372 FastInterruptDisableLock dLock;
374 RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN;
375 SYSCFG->EXTICR[int(gpioNum / 4)] |= exticrRegValue;
378 EXTI->IMR |= 1 << gpioNum;
383 EXTI->RTSR |= 1 << gpioNum;
389 EXTI->FTSR |= 1 << gpioNum;
392 NVIC_EnableIRQ(
static_cast<IRQn_Type
>(
GetEXTI_IRQn(gpioNum)));
393 NVIC_SetPriority(
static_cast<IRQn_Type
>(
GetEXTI_IRQn(gpioNum)), priority);
398 EXTI->RTSR &= ~(1 << gpioNum);
399 EXTI->FTSR &= ~(1 << gpioNum);
400 EXTI->IMR &= ~(1 << gpioNum);
405 FastInterruptDisableLock dLock;
407 SYSCFG->EXTICR[int(gpioNum / 4)] &= ~exticrRegMask;
417 EXTI->RTSR |= 1 << gpioNum;
418 EXTI->FTSR &= ~(1 << gpioNum);
422 EXTI->RTSR &= ~(1 << gpioNum);
423 EXTI->FTSR |= 1 << gpioNum;
427 EXTI->RTSR |= 1 << gpioNum;
428 EXTI->FTSR |= 1 << gpioNum;
constexpr unsigned GetEXTICR_register_mask(unsigned P, unsigned N)
void unexpectedInterrupt()
constexpr unsigned GetEXTICR_register_value(unsigned P, unsigned N)
void changeInterruptTrigger(unsigned int gpioPort, unsigned int gpioNum, InterruptTrigger trigger)
Changes interrupt trigger on an enabled interrupt.
void disableExternalInterrupt(unsigned int gpioPort, unsigned int gpioNum)
Disables external interrupts on the provided pin.
void __attribute__((weak)) EXTI0_IRQHandlerImpl()
constexpr unsigned ConvertGPIO_BASEtoUnsigned(unsigned P)
void Default_EXTI_Handler()
constexpr unsigned GetEXTI_IRQn(unsigned N)
void enableExternalInterrupt(unsigned int gpioPort, unsigned int gpioNum, InterruptTrigger trigger, unsigned int priority)
Enables external interrupts on the provided pin. Remember to set the GPIO to input mode!