CH571 蓝牙HID+轮询按键 程序不定时卡死/重启

如题,使用自制板,测试HID_Keyboard和HID_Mouse例程正常,移植到工程里,定时发送也正常,加入轮询按键发包就不正常,表现为快速按几下就容易重启,不能稳定复现。如果不启用休眠,就不那么容易,但还是会有重启/卡死现象。


按键处理逻辑如下:(在 uint16_t HidEmu_ProcessEvent(uint8_t task_id, uint16_t events) 中)

    static BOOL pressed = FALSE;
    if (events & START_REPORT_MOUSE_EVT) { // Mouse event
        if (!GPIOA_ReadPortPin(GPIO_K4)) {
            if (!pressed) {
                GPIOA_SetBits(GPIO_LED);
                hidEmuSendMouseReport(1, 0, 0);
                pressed = TRUE;
                PRINT("K4\n");
            }
        } else {
            if (pressed) {
                hidEmuSendMouseReport(0, 0, 0);
                pressed = FALSE;
                GPIOA_ResetBits(GPIO_LED);
            }
        }

        tmos_start_task(hidEmuTaskId, START_REPORT_MOUSE_EVT,
                MS1_TO_SYSTEM_TIME(100));
        return (events ^ START_REPORT_MOUSE_EVT);
    }


连接参数如下:

// Param update delay
#define START_PARAM_UPDATE_EVT_DELAY         12800

// HID idle timeout in msec; set to zero to disable timeout
#define DEFAULT_HID_IDLE_TIMEOUT             60000

// What is the advertising interval when device is discoverable (units of 625us, 80=50ms)
#define DEFAULT_ADVERTISING_INTERVAL         400

// Minimum connection interval (units of 1.25ms)
#define DEFAULT_DESIRED_MIN_CONN_INTERVAL    70

// Maximum connection interval (units of 1.25ms)
#define DEFAULT_DESIRED_MAX_CONN_INTERVAL    80

// Slave latency to use if parameter update request
#define DEFAULT_DESIRED_SLAVE_LATENCY        0

// Supervision timeout value (units of 10ms)
#define DEFAULT_DESIRED_CONN_TIMEOUT         500


急求解,卡了几天了....




另外说明,使用中断置位并在任务中发包也一样重启。。。


重启卡死现象并不一样。如果是芯片重启,打印复位状态寄存器查看复位原因;如果是卡死,可以看下是否进入hardfault,同时根据之前提供的PC指针打印的方法查看异常的原因。

其次使用PM例程,里面有睡眠通过GPIO唤醒,使用该GPIO测试是否会出现上述的异常情况。如果出现,请发送邮件至邮箱lpc@wch.cn,我们这里进行查看。



PM是好的,单独BLE键鼠也是好的,所有的复位都显示是RPOR,从来没有别的。。

HardFault基本不触发,触发也是看到是BLE库里面的函数出错,我也没法解决啊。。。


总结,重启概率是99%,不睡眠就不容易触发,睡眠越深,重启越快。有时候,重启后BLE还没连接,按下按键又重启了。测量供电电压均正常,低压中断配的2V3根本不触发。



PC指针的打印是有对应原因,优先查看对应的原因是什么,同时指向库里面的函数,查看是否有在什么时候主动调用了。

其次在测试HID例程中开启睡眠一般是通过宏开启,那么在你的代码中是否有跟例程调用的方式存在不一样,优先检查该点。

注意如果是使用Shutdown睡眠后唤醒是会复位的。

还存在问题的话,代码发送至lpc@wch.cn。


只有登录才能回复,可以选择微信账号登录