CH582M central 进入低功耗(sleep)后用IO口唤醒会搜不到设备只能重启才能恢复

CH582M的central项目,进入低功耗(sleep)用IO口唤醒多数情况都会搜不到设备


进入低功耗(sleep)用以下函数

LowPower_Sleep(RB_PWR_RAM30K | RB_PWR_RAM2K); //只保留30+2K SRAM 供电

HSECFG_Current(HSE_RCur_100);                 // 降为额定电流(低功耗函数中提升了HSE偏置电流)


用IO口唤醒后,就搜不到任何设备,一直打印找不到设备

[10:24:28.501]收←◆Device not found...

Discovering...


重新调用 GAPRole_CentralStartDiscovery函数也不行,只能重启才能恢复。


请问唤醒后需要什么条件才能正常扫描设备?

      

__INTERRUPT

__HIGH_CODE

void GPIOB_IRQHandler(void)

{

    GPIOB_ClearITFlagBit(GPIO_Pin_4);

}


__HIGH_CODE

__attribute__((noinline))

void Main_Circulation()

{

   GPIOB_ModeCfg(GPIO_Pin_4, GPIO_ModeIN_PU);//touch key

   GPIOB_ITModeCfg(GPIO_Pin_4, GPIO_ITMode_RiseEdge); // 上升沿触发

   PFIC_EnableIRQ(GPIO_B_IRQn);

   PWR_PeriphWakeUpCfg(ENABLE, RB_SLP_GPIO_WAKE, Long_Delay);

    while(1)

    {

        TMOS_SystemProcess();

        if(( (GPIOB_ReadPortPin(GPIO_Pin_4)& GPIO_Pin_4) == 0))

        {

              PRINT("sleep.. \n");

              DelayMs(10);

              LowPower_Sleep(RB_PWR_RAM30K | RB_PWR_RAM2K); //只保留30+2K SRAM 供电

              HSECFG_Current(HSE_RCur_100);                 // 降为额定电流(低功耗函数中提升了HSE偏置电流)

              DelayMs(5);

              PRINT("wake.. \n");

        }

    }

}

在示例程序central_main.c基础上增加Sleep操作,使用DEMO板测试,唤醒后要过几十秒后才能搜到设备。假如sleep之前先关掉扫描,唤醒后调用GAPRole_CentralStartDiscovery,有可能一直都搜不到设备



书写外部中断GPIO唤醒时,参考一下PM的例程。

开启睡眠如图操作:

1.png

在使用蓝牙工作时,通过TMOS系统去处理相应的任务,不建议在Main_Circulation中操作。这里提供一份TMOS的说明文档参考:

WCH TMOS用法详解 - debugdabiaoge - 博客园 (cnblogs.com)


你好,我通过TMOS系统去处理任务并打开HAL_SLEEP还是有问题,也是唤醒后要几十秒后才能搜到设备。HAL_SLEEP好像只能降低功耗。假如用户暂时不用该产品,产品进入深度睡眠,通过按键能够唤醒产品继续使用。具体要怎么处理才是正确的。谢谢!




#define SYSTEM_KEY_EVENT       0x0001


tmosTaskID SysEventTaskID;

static tmosEvents SystemServer_ProcessEvent(tmosTaskID task_id, tmosEvents events)

{

    if(events & SYSTEM_KEY_EVENT)

    {

        if(( (GPIOB_ReadPortPin(GPIO_Pin_4)& GPIO_Pin_4) == 0))

        {

              PRINT("sleep.. \n");

            //  DelayMs(10);

              LowPower_Sleep(RB_PWR_RAM30K | RB_PWR_RAM2K); //只保留30+2K SRAM 供电

              HSECFG_Current(HSE_RCur_100);                 // 降为额定电流(低功耗函数中提升了HSE偏置电流)

             // DelayMs(5);

              PRINT("wake.. \n");

        }

        tmos_start_task( SysEventTaskID, SYSTEM_KEY_EVENT, MS1_TO_SYSTEM_TIME( 50 ));

        return events ^ SYSTEM_KEY_EVENT;

    }

}


__HIGH_CODE

__attribute__((noinline))

void Main_Circulation()

{

   GPIOB_ModeCfg(GPIO_Pin_4, GPIO_ModeIN_PU);//touch key

   GPIOB_ITModeCfg(GPIO_Pin_4, GPIO_ITMode_RiseEdge); // 上升沿触发

   PFIC_EnableIRQ(GPIO_B_IRQn);

   PWR_PeriphWakeUpCfg(ENABLE, RB_SLP_GPIO_WAKE, Long_Delay);

   SysEventTaskID = TMOS_ProcessEventRegister( SystemServer_ProcessEvent );

   tmos_start_task( SysEventTaskID, SYSTEM_KEY_EVENT, MS1_TO_SYSTEM_TIME( 50 ));

    while(1)

    {

        TMOS_SystemProcess();


    }

}




可以调用shutdown看看是否满足你的需求,

emobile_2022-07-25_15-16-59.png


你好,LowPower_Shutdown唤醒后会复位,小程序还好,实际做复杂的产品的时候每次sleep唤醒后复位很多状态都要重新获取。另外LowPower_Halt和LowPower_Idle睡眠后功耗又太高了。通过LowPower_Sleep睡眠目前最理想,功耗达标,就是唤醒后central 扫描容易异常


那么一般是不建议自己去调用睡眠的,可以使用我们协议栈的睡眠,想要功耗低,在主机代码中关闭扫描,此时只有一个2分钟一次校准任务,功耗是非常低的,想要使用的时候再打开扫描就可以了。


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