uint8_t get_gpio_group_idx(OM_GPIO_Type *om_gpio) { uint8_t idx = 0xff; if (om_gpio == OM_GPIO0) { idx = 0; } else if (om_gpio == OM_GPIO1) { idx = 1; } return idx; } static void test_gpio_cb(void *om_gpio, drv_event_t event, void *int_status, void *gpio_data) { // om_printf("gpio trigger happens, int_status:%x, gpio_data:%x\r\n", (uint32_t)int_status, (uint32_t)gpio_data); uint8_t gpio_group_idx = get_gpio_group_idx(om_gpio); OM_LOG(OM_LOG_INFO, "gpio_group_idx = %d, int_status:%x, gpio_data:%x\r\n",gpio_group_idx, (uint32_t)int_status, (uint32_t)gpio_data); } static const pin_config_t pin_config[] = { {PAD_BUTTON_0, {PINMUX_GPIO_MODE_CFG}, PMU_PIN_MODE_PU, PMU_PIN_DRIVER_CURRENT_NORMAL}, {PAD_BUTTON_1, {PINMUX_GPIO_MODE_CFG}, PMU_PIN_MODE_PU, PMU_PIN_DRIVER_CURRENT_NORMAL}, }; static const gpio_config_t gpio_config[] = { {OM_GPIO0, PAD_BUTTON_0, GPIO_DIR_INPUT, LED_OFF_LEVEL, GPIO_TRIG_RISING_FAILING_EDGE}, {OM_GPIO1, PAD_BUTTON_1, GPIO_DIR_INPUT, LED_OFF_LEVEL, GPIO_TRIG_RISING_FAILING_EDGE}, }; drv_pin_init(pin_config, sizeof(pin_config) / sizeof(pin_config[0])); drv_gpio_init(gpio_config, sizeof(gpio_config) / sizeof(gpio_config[0])); // example: pin wakeup drv_pmu_wakeup_pin_set(PAD_BUTTON_0, PMU_PIN_WAKEUP_LOW_LEVEL); drv_pmu_wakeup_pin_set(PAD_BUTTON_1, PMU_PIN_WAKEUP_LOW_LEVEL); // trigger: both edge drv_gpio_register_isr_callback(OM_GPIO0, test_gpio_cb); drv_gpio_register_isr_callback(OM_GPIO1, test_gpio_cb); drv_pmu_wakeup_pin_register_callback(example_pin_wakeup_isr_handler); 注意: 1、drv_pmu_wakeup_pin_register_callback函数只能注册一次,drv_gpio_register_isr_callback可以注册多次,但也只针对不同的GPIO组。如果都属于OM_GPIO0组,那么也是只能注册一个,注册多个会以最后一次注册的为准。 2、get_gpio_group_idx函数是自己封装的,SDK默认没有这个函数。 那怎么区分gpio中断是哪一个引脚呢? 首先通过get_gpio_group_idx函数可以获取gpio组号,如果是gpio0,那么int_status显示的就是具体哪一个IO来的中断,其中一个bit对应一个IO,如果是gpio1组,那么int_status获取到的IO中断要加上32才是真正的中断IO。 比如: gpio_group_idx = 0, int_status:4, gpio_data:f70 这个 int_status:4,0000 0000 0000 0100 代表gpio2是中断引脚 gpio_group_idx = 1, int_status:4, gpio_data:0 这个int_status是4,那么转换为IO就是 2+32 = 34引脚 |