6627与6629 GPIO中断介绍

徽信管理团队 · 97次点击 · 4周前

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引脚




被收藏 0  ∙  0 赞  
加入收藏
点赞
0 回复  
善言善语 (您需要 登录 后才能回复 没有账号 ?)

请先登录网站