// common interrupt handler STATIC void EXTI_Handler(uint port) { uint32_t bits = MAP_GPIOIntStatus(port, true); MAP_GPIOIntClear(port, bits); // might be that we have more than one Pin interrupt pending // therefore we must loop through all of the 8 possible bits for (int i = 0; i < 8; i++) { uint32_t bit = (1 << i); if (bit & bits) { pin_obj_t *self = (pin_obj_t *)pin_find_pin_by_port_bit(&pin_cpu_pins_locals_dict, port, bit); mp_obj_t _callback = mpcallback_find(self); mpcallback_handler(_callback); } } }
// common interrupt handler STATIC void EXTI_Handler(uint port) { uint32_t bits = MAP_GPIOIntStatus(port, true); MAP_GPIOIntClear(port, bits); // might be that we have more than one pin interrupt pending // therefore we must loop through all of the 8 possible bits for (int i = 0; i < 8; i++) { uint32_t bit = (1 << i); if (bit & bits) { pin_obj_t *self = (pin_obj_t *)pin_find_pin_by_port_bit(&pin_board_pins_locals_dict, port, bit); if (self->irq_trigger == (PYB_PIN_FALLING_EDGE | PYB_PIN_RISING_EDGE)) { // read the pin value (hoping that the pin level has remained stable) self->irq_flags = MAP_GPIOPinRead(self->port, self->bit) ? PYB_PIN_RISING_EDGE : PYB_PIN_FALLING_EDGE; } else { // same as the triggers self->irq_flags = self->irq_trigger; } mp_irq_handler(mp_irq_find(self)); // always clear the flags after leaving the user handler self->irq_flags = 0; } } }
//***************************************************************************** // // Called by the NVIC as a result of GPIO port S interrupt event. For this // application GPIO port S pin 2 is the interrupt line for the MPU9150 // //***************************************************************************** void GPIOSIntHandler(void) { uint32_t ui32Status; ui32Status = MAP_GPIOIntStatus(GPIO_PORTS_BASE, true); // // Clear all the pin interrupts that are set // MAP_GPIOIntClear(GPIO_PORTS_BASE, ui32Status); // // Check which GPIO caused the interrupt event. // if(ui32Status & GPIO_PIN_2) { // // The MPU9150 data ready pin was asserted so start an I2C transfer // to go get the latest data from the device. // MPU9150DataRead(&g_sMPU9150Inst, MotionCallback, &g_sMPU9150Inst); } }