能否将中断和唤醒的初始化相关的接口贴出?
【求助】泰凌微tuyaosask 休眠如何快速唤醒中断
Re: 【求助】泰凌微tuyaosask 休眠如何快速唤醒中断
jinyuan 2024年 Jan 9日 16:43首先 检查一下初始化的流程有没有问题,可以参考 app_key.c中的app_key_init函数。
其次 目前只支持2路的中断处理, 是否是因为初始化了多个中断导致后面的初始化失败?
如果要增加支持中断的数量可以修改宏 BOARD_GPIO_IRQ_NUM(留意内存空间的使用)
只有2个也进不了中断函数 只能唤醒但是无法进入中断函数 我试了 只要是 allow_sleep 用pad起来后 虽然能唤醒 但是进不了中断的
Re: 【求助】泰凌微tuyaosask 休眠如何快速唤醒中断
[/code]
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;
}
这个是
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;