CH582M central 進入低功耗(sleep)后用IO口喚醒會搜不到設備只能重啟才能恢復

CH582M的central項目,進入低功耗(sleep)用IO口喚醒多數(shù)情況都會搜不到設備


進入低功耗(sleep)用以下函數(shù)

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

HSECFG_Current(HSE_RCur_100); ? ? ? ? ? ? ? ? // 降為額定電流(低功耗函數(shù)中提升了HSE偏置電流)


用IO口喚醒后,就搜不到任何設備,一直打印找不到設備

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

Discovering...


重新調(diào)用?GAPRole_CentralStartDiscovery函數(shù)也不行,只能重啟才能恢復。


請問喚醒后需要什么條件才能正常掃描設備?

? ????


熱門產(chǎn)品 : USB3.0 HUB控制器:CH634

__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); // 上升沿觸發(fā)

? ?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); ? ? ? ? ? ? ? ? // 降為額定電流(低功耗函數(shù)中提升了HSE偏置電流)

? ? ? ? ? ? ? DelayMs(5);

? ? ? ? ? ? ? PRINT("wake.. \n");

? ? ? ? }

? ? }

}

在示例程序central_main.c基礎上增加Sleep操作,使用DEMO板測試,喚醒后要過幾十秒后才能搜到設備。假如sleep之前先關掉掃描,喚醒后調(diào)用GAPRole_CentralStartDiscovery,有可能一直都搜不到設備



書寫外部中斷GPIO喚醒時,參考一下PM的例程。

開啟睡眠如圖操作:

1.png

在使用藍牙工作時,通過TMOS系統(tǒng)去處理相應的任務,不建議在Main_Circulation中操作。這里提供一份TMOS的說明文檔參考:

WCH TMOS用法詳解 - debugdabiaoge - 博客園 (cnblogs.com)


你好,我通過TMOS系統(tǒng)去處理任務并打開HAL_SLEEP還是有問題,也是喚醒后要幾十秒后才能搜到設備。HAL_SLEEP好像只能降低功耗。假如用戶暫時不用該產(chǎn)品,產(chǎn)品進入深度睡眠,通過按鍵能夠喚醒產(chǎn)品繼續(xù)使用。具體要怎么處理才是正確的。謝謝!




#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); ? ? ? ? ? ? ? ? // 降為額定電流(低功耗函數(shù)中提升了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); // 上升沿觸發(fā)

? ?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();


? ? }

}




可以調(diào)用shutdown看看是否滿足你的需求,

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


你好,LowPower_Shutdown喚醒后會復位,小程序還好,實際做復雜的產(chǎn)品的時候每次sleep喚醒后復位很多狀態(tài)都要重新獲取。另外LowPower_Halt和LowPower_Idle睡眠后功耗又太高了。通過LowPower_Sleep睡眠目前最理想,功耗達標,就是喚醒后central 掃描容易異常


那么一般是不建議自己去調(diào)用睡眠的,可以使用我們協(xié)議棧的睡眠,想要功耗低,在主機代碼中關閉掃描,此時只有一個2分鐘一次校準任務,功耗是非常低的,想要使用的時候再打開掃描就可以了。


只有登錄才能回復,可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频