【已解决】【TuyaOS】配置按键时程序跑飞

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


sandia
Posts: 61

1)开发包全名 tuyaos-subdev-bt_3.9.0_phy6222_ble_ble-common_1.0.1.tar;
2)问题现象:使用hal配置按键短按,长按,长按抬起时运行程序跑飞;
3)复现流程:使用PHY622X_V1.8开发板烧录程序多次按按键即可复现(特别是在这几个地方:附图33处及69处);
4)发生时间:如图33处,69处;

6)相关图片资料:

69处.png
33处.png

代码见附件,主程序内只在tuya_init_last()运行了user_key_init()函数;
log见附件
大佬帮我看看

Attachments
Demo_map.txt
(1.3 MiB) Downloaded 118 times
程序运行log.TXT
(15.39 KiB) Downloaded 102 times
app_key.h
(2.03 KiB) Downloaded 120 times
app_key.c
(4.04 KiB) Downloaded 140 times
Last edited by sandia on 2023年 Dec 28日 18:56, edited 3 times in total.

Tags:
sandia
Posts: 61

Re: 【求助】【TuyaOS】配置按键时程序跑飞

用notepad修改完mk_hexf_bin.bat这个文件重新编译之后又会恢复成这样

Code: Select all

.\bin\material\PhyPlusKit_v2.5.2a.exe -c -p .\bin\Demo.hex -b ..\vendor\phy6222_ble\sdk\phy62xx-sdk-v3\example\OTA\slboot\bin\slboot.hex -m SN -v 6222
python .\bin\material\ooo_bin.py .\bin\Demo_phy6222.hex16
:pause
User avatar
逻辑的院子
Posts: 284
Contact:

Re: 【求助】【TuyaOS】配置按键时程序跑飞

如果是使用vscode编译,可以修改这个目录下的
.\software\TuyaOS\vendor\phy6222_ble\toolchain\templates\keil\bin\material\mk_hexf_bin.bat

sandia
Posts: 61

Re: 【求助】【TuyaOS】配置按键时程序跑飞

查到是init_config()这个函数,不过这个函数是main.c里面的呀

init_config.png
main.png
User avatar
逻辑的院子
Posts: 284
Contact:

Re: 【求助】【TuyaOS】配置按键时程序跑飞

SDK里面有提供常用的按键例程,位于app_key.c,可以直接使用这里的代码,如下图所示,有提供短按、长按功能

Snipaste_2023-12-27_15-16-01.jpg
sandia
Posts: 61

Re: 【求助】【TuyaOS】配置按键时程序跑飞

这个按键例程短按是按下就触发的,即长按的时候一定会触发一次短按,这个效果不是我想要的

User avatar
逻辑的院子
Posts: 284
Contact:

Re: 【求助】【TuyaOS】配置按键时程序跑飞

不需要某种情况只是不要处理上述中的某个case就可以

User avatar
逻辑的院子
Posts: 284
Contact:

Re: 【求助】【TuyaOS】配置按键时程序跑飞

功能描述

支持按下防抖,松开防抖,防抖参数可设定
支持单击,多次长按,释放,很容易扩展成双击,三击……

依赖条件

外部中断

定时器

设计细节

实现原理

Image

按下按键后,启动一个周期为 t 的定时器

如果按键不松开,依次到达 T1=tcount1, T2=tcount2, T3=t*count3 (release) 时间点

如果按键松开,可能会触发 release0, release1, release2

press0:可能是抖动,抛弃不用

release0:为了消抖和短按的响应及时,count1 设置较小(例如50ms),所以很难触发 release0

press1:按下按键累计时间到达 count1 设置的时间

release1:松开按键的时间处于 count1 和 count2 之间

press2:按下按键累计时间到达 count2 设置的时间

release2:松开按键的时间处于 count2 和 count3 之间

release:按下按键累计时间到达 count3 设置的时间,由于count3是最后一个count,所以即使按键没有释放,也认为按键释放,即按键超时释放

结构体

Code: Select all

typedef struct {
    UINT32_T count;
    UINT32_T check_idx;
    UINT32_T check_record;
    UINT32_T state;
} tal_key_inter_param_t;

typedef struct {
    UINT32_T pin; //按键对应的引脚
    tal_key_level_t valid_level; //有效电平
    UINT8_T  count_len; //按键状态数
    UINT32_T count_array[10]; //按键状态时间枚举
    tal_key_handler_t handler; //按键结果处理
    tal_key_inter_param_t inter; //内部变量,不用赋值
} tal_key_param_t;

使用场景

场景1

Code: Select all

//(1)定义静态全局变量
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,
};

//(2)初始化
tal_key_init(&key_press_param);

//(3)启动一个循环定时器(建议10ms),tal_key_timeout_handler() 放到定时器处理函数中
if(!tal_key_timeout_handler(&key_press_param)) {
    //停止循环定时器
}

//(4)实现 tal_key_get_pin_level() 
// Weak function instance
UINT32_T tal_key_get_pin_level(UINT32_T pin)
{
    //实现虚函数
}

//(5)在各种 state 中加上自定义处理功能即可
STATIC VOID_T app_key_handler(UINT32_T state)
{
//    TAL_PR_INFO("Key state: %d", state);
    switch(state)
    {
        //Short press
        case 1: {
        } break;
        
        //Long press
        case 2: {
        } break;
        
        //Long long press timeout
        case 3: {
        } break;
        
        //Short press release
        case 5: {
        } break;
        
        //Long press release
        case 6: {
        } break;
        
        default: {
        } break;
    }
} 
User avatar
joey_nobug
Posts: 143

Re: 【求助】【TuyaOS】配置按键时程序跑飞

sandia 2023年 Dec 27日 15:06

查到是init_config()这个函数,不过这个函数是main.c里面的呀
init_config.png
main.png

你这个定位不对啊,并不是在 init_config() 里啊,你搜索的这个是注释啊。 看前面你的截图,你要关注的是的 PC 寄存器的 0x1FFFD358 这个地址是在哪个函数里,如果没有这个范围可能是跑飞了,要再看 LR 寄存器的值 0x1102CAA9。 这几个值并不一定就直接能搜索到,要根据汇编中函数左侧的地址范围去判断

Talk is cheap, show me the code.
Post Reply