找回密码
 立即注册

微信扫码登录

查看: 261|回复: 2

[BLE SDK] 硬件进入deep_retention_16k模式,唤醒源问题

[复制链接]

3

主题

3

回帖

35

积分

英勇黄铜

积分
35
发表于 2024-11-1 18:41:47 | 显示全部楼层 |阅读模式
Information
说明:   建议参照本版块置顶帖内容输入必要信息
芯片型号: 8258
SDK及版本: -
本帖最后由 wx_5701358130 于 2024-11-1 18:42 编辑

void sensor_deep_sleep()
{
    run_state = SWITCH_SCAN;
    // bls_ll_setAdvEnable(BLC_ADV_DISABLE);
    int ret = cpu_sleep_wakeup(DEEPSLEEP_MODE_RET_SRAM_LOW16K,  PM_WAKEUP_PAD | PM_WAKEUP_TIMER, clock_time() + 200 * CLOCK_16M_SYS_TIMER_CLK_1S);
    printf("16K:%d\r\n", ret);
    for (u8 i = 0; i < KEY_NUM; i ++)
    {
        if(gpio_read(key_list))

            continue;
        cpu_set_gpio_wakeup (key_list, 1, 1);  // reverse stuck key pad wakeup level

        bls_pm_setWakeupSource(PM_WAKEUP_PAD);  //gpio PAD wakeup deesleep
        cpu_sleep_wakeup(DEEPSLEEP_MODE_RET_SRAM_LOW16K,  PM_WAKEUP_PAD | PM_WAKEUP_TIMER, clock_time() + 10 * CLOCK_16M_SYS_TIMER_CLK_1S);
    }
   
}
void sensor_suspend(void)
{
    int ret = cpu_sleep_wakeup(SUSPEND_MODE, PM_WAKEUP_TIMER, 500 * 1000);
    printf("suspend:%d\r\n", ret);
}
调用:
void ble_stk_sleep_callback()
{
    if (SWITCH_BROADCAST == run_state)
    {
        // 数据广播模式发送完成后进入深度睡眠
        if (++msg_send_count >= MSG_SEND_PACKET_NUM)
        {
            sensor_suspend();
            sensor_deep_sleep();
        }
    }
}
代码如上,我设置了六个独立按键IO口作为唤醒源,低电平唤醒。进入低功耗时,调用cpu_sleep_wakeup函数的返回值为STATUS_GPIO_ERR_NO_ENTER_PM 时,翻转卡键的唤醒电平状态进入睡眠。我交替的去按下按键,会出现芯片睡眠以后,IO口无法唤醒,只能通过定时器200s唤醒

image.png









48

主题

122

回帖

535

积分

版主

积分
535
发表于 2024-11-4 11:05:48 | 显示全部楼层
Weixin Image_20241104110413.png

这里顺序错了。先设置唤醒PAD,再进入睡眠。

点评

下面有补上了,这是一个独立按键,低电平有效,所以按下是低电平才唤醒。我这里的逻辑是,如果第一次进入失败,就把对应的io口唤醒电平反转,再进入一次睡眠。   发表于 2024-11-4 14:28
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Telink forum ( 沪ICP备17008231号-1 )

GMT+8, 2024-12-22 02:35 , Processed in 0.120330 second(s), 24 queries .

Powered by Telink 隐私政策

泰凌微电子版权所有 © 。保留所有权利。 2024

快速回复 返回顶部 返回列表