【求助】泰凌微tuyaosask 休眠如何快速唤醒中断

蓝牙 BLE设备、蓝牙 MESH设备、蓝牙 Beacon设备、Sub-G设备等


jinyuan
Posts: 56

能否将中断和唤醒的初始化相关的接口贴出?

leslieli
Posts: 87

Re: 【求助】泰凌微tuyaosask 休眠如何快速唤醒中断

jinyuan 2024年 Jan 9日 16:43

首先 检查一下初始化的流程有没有问题,可以参考 app_key.c中的app_key_init函数。
其次 目前只支持2路的中断处理, 是否是因为初始化了多个中断导致后面的初始化失败?
如果要增加支持中断的数量可以修改宏 BOARD_GPIO_IRQ_NUM(留意内存空间的使用)

只有2个也进不了中断函数 只能唤醒但是无法进入中断函数 我试了 只要是 allow_sleep 用pad起来后 虽然能唤醒 但是进不了中断的

leslieli
Posts: 87

Re: 【求助】泰凌微tuyaosask 休眠如何快速唤醒中断

[/code]

jinyuan 2024年 Jan 9日 17:00

能否将中断和唤醒的初始化相关的接口贴出?

Code: Select all

***********************************************************************
 ********************* constant ( macro and enum ) *********************
 **********************************************************************/
#define APP_KEY_PIN user_switch1_key_port

/***********************************************************************
 ********************* struct ******************************************
 **********************************************************************/


/***********************************************************************
 ********************* variable ****************************************
 **********************************************************************/
STATIC TIMER_ID app_key_timer_id = NULL;

STATIC VOID_T app_key_handler(UINT32_T state);
STATIC tal_key_param_t key_press_param = {
    .pin = APP_KEY_PIN,
    .valid_level = TUYA_KEY_LEVEL_LOW,
    .count_len = 3,
    .count_array = {5, 300, 500},
    .handler = app_key_handler,
};

/***********************************************************************
 ********************* function ****************************************
 **********************************************************************/




STATIC VOID_T app_key_handler(UINT32_T state)
{
   TAL_PR_INFO("Key state: %d", state);
    switch (state) {
        //Short press
        case 1: {
             key1_process();
        } break;

    //Long press
    case 2: {
        tuya_ble_device_factory_reset();
        tuya_ble_disconnect_and_reset_timer_start();
    } break;

    //Long long press timeout
    case 3: {
         tuya_ble_device_factory_reset();
        tuya_ble_disconnect_and_reset_timer_start();
    } break;

    //Short press release
    case 5: {
        key1_process();
    } break;

    //Long press release
    case 6: {
         tuya_ble_device_factory_reset();
        tuya_ble_disconnect_and_reset_timer_start();
    } break;

    default: {
    } break;
}
}

UINT32_T tal_key_get_pin_level(UINT32_T pin)
{
    // Weak function instance
    TUYA_GPIO_LEVEL_E level = TUYA_GPIO_LEVEL_LOW;
    tal_gpio_read(pin, &level);
    return level;
}

STATIC VOID_T app_key_irq_cb(VOID_T *args)
{
    TUYA_GPIO_LEVEL_E level = TUYA_GPIO_LEVEL_LOW;
    tal_gpio_read(APP_KEY_PIN, &level);

if (level == TUYA_GPIO_LEVEL_LOW) {
    tal_sw_timer_start(app_key_timer_id, 10, TAL_TIMER_CYCLE);
}
}

STATIC VOID_T app_key_timeout_handler(TIMER_ID timer_id, VOID_T *arg)
{
    if (!tal_key_timeout_handler(&key_press_param)) {
        tal_sw_timer_stop(app_key_timer_id);
    }
}

VOID_T app_key_init(VOID_T)
{
    TUYA_GPIO_BASE_CFG_T gpio_cfg = {
        .mode = TUYA_GPIO_PULLUP,
        .direct = TUYA_GPIO_INPUT,
        .level = TUYA_GPIO_LEVEL_HIGH,
    };
    TUYA_GPIO_IRQ_T gpio_irq = {
        .mode = TUYA_GPIO_IRQ_FALL,
        .cb = app_key_irq_cb,
        .arg = NULL,
    };

tal_gpio_init(APP_KEY_PIN, &gpio_cfg);
tal_gpio_irq_init(APP_KEY_PIN, &gpio_irq);
tal_gpio_irq_enable(APP_KEY_PIN);

tal_key_init(&key_press_param);

tal_sw_timer_create(app_key_timeout_handler, NULL, &app_key_timer_id);
}



Code: Select all

OPERATE_RET tuya_init_third(VOID_T)
{

TUYA_WAKEUP_SOURCE_BASE_CFG_T wakeup_cfg = {
    .source = TUYA_WAKEUP_SOURCE_GPIO,
    .wakeup_para.gpio_param.gpio_num = user_switch1_key_port,
    .wakeup_para.gpio_param.level = TUYA_GPIO_LEVEL_LOW,
};
tkl_wakeup_source_set(&wakeup_cfg);
app_key_init();
user_valve_init();
user_rain_init();
user_flow_init();
user_led_init();
TAL_PR_DEBUG("flow_cnt=%d", flow_cnt);

return OPRT_OK;
}

这个是

jinyuan
Posts: 56

Re: 【求助】泰凌微tuyaosask 休眠如何快速唤醒中断

您好, 休眠唤醒后无法进入中断是因为唤醒后初始化失败,核心原因涉及几个变量在休眠后内存没有跟随外设重置而重置。

请在 tkl_gpio.c中对:
tkl_gpio_irq 、irq_pin、irq_idx 三个变量添加 attribute_no_ret_bss 该字段修饰。

如下所示:
attribute_no_ret_bss STATIC TUYA_GPIO_IRQ_T tkl_gpio_irq[BOARD_GPIO_IRQ_NUM] = {
{0, NULL, NULL},
{0, NULL, NULL}
};
attribute_no_ret_bss STATIC TKL_IRQ_PIN_T irq_pin[BOARD_GPIO_IRQ_NUM] = {
{0, 0, 0},
{0, 0, 0}
};
attribute_no_ret_bss STATIC UINT8_T irq_idx = 0;

Post Reply