/***************************************************************************//** * @brief * GPIO even interrupt handler * * @details * This function is automatically called by the hardware upon incoming * interrupt generated by an even-numbered GPIO pin. ******************************************************************************/ void GPIO_EVEN_IRQHandler(void) { uint32_t flag; uint32_t system_mask = TD_GPIO_Hooks[TD_GPIO_SYSTEM_EVEN].mask; uint32_t user_mask = TD_GPIO_Hooks[TD_GPIO_USER_EVEN].mask; // Get interrupt bits flag = GPIO_IntGet() & TD_GPIO_EVEN_MASK & GPIO_IntGetEnabled(); // Acknowledge IRQ. // We acknowledge all IRQ read, for this IRQ (EVEN) and enabled // even if theses IRQ are not used (otherwise, it will infinitely reenter in this IRQ) GPIO_IntClear(flag); #ifdef WAKE_MAIN_LOOP_DEBUG tfp_printf("IO:0x%08X\r\n"); #endif // System hook set on odd IRQ if (TD_GPIO_Hooks[TD_GPIO_SYSTEM_EVEN].callback && (flag & system_mask)) { // Call the IRQ hook TD_GPIO_Hooks[TD_GPIO_SYSTEM_EVEN].callback(flag & system_mask); // Remember that this interrupt source has been processed flag &= ~system_mask; TD_WakeMainLoop(); } // User hook on even IRQ if (TD_GPIO_Hooks[TD_GPIO_USER_EVEN].callback && (flag & user_mask)) { // Call the IRQ hook TD_GPIO_Hooks[TD_GPIO_USER_EVEN].callback(flag & user_mask); TD_WakeMainLoop(); } }
/***************************************************************************//** * @brief * GPIO ODD interrupt handler. Interrupt handler clears all IF odd flags and * call the dispatcher passing the flags which triggered the interrupt. * ******************************************************************************/ void GPIO_ODD_IRQHandler(void) { uint32_t iflags; /* Get all odd interrupts. */ iflags = GPIO_IntGetEnabled() & 0x0000AAAA; /* Clean only even interrupts. */ GPIO_IntClear(iflags); GPIOINT_IRQDispatcher(iflags); }