ble協(xié)議棧中關(guān)于低功耗處理sleep的問題

1.

??cfg.WakeUpTime?=?WAKE_UP_RTC_MAX_TIME;

??cfg.sleepCB?=?CH57X_LowPower;????//?啟用睡眠

這個(gè)WAKE_UP_RTC_MAX_TIME是不是作為CH57X_LowPower()函數(shù)的參數(shù)傳入了?還是在協(xié)議棧中做了別的處理

2.

u32?CH57X_LowPower(?u32?time?)

{

#if?(defined?(HAL_SLEEP))?&&?(HAL_SLEEP?==?TRUE)

??u32?tmp,?irq_status;


??SYS_DisableAllIrq(?&irq_status?);

??tmp?=?RTC_GetCycle32k();

??if?(?(?time?<?tmp?)?||?(?(?time?-?tmp?)?<?30?)?)

??{????//?檢測睡眠的最短時(shí)間

????SYS_RecoverIrq(?irq_status?);

????return?2;

??}

??RTC_SetTignTime(?time?);

??SYS_RecoverIrq(?irq_status?);

#if(?DEBUG?==?Debug_UART1?)??//?使用其他串口輸出打印信息需要修改這行代碼

??while(?(?R8_UART1_LSR?&?RB_LSR_TX_ALL_EMP?)?==?0?)

????__nop();

#endif

//?LOW?POWER-sleep模式

??if?(?!RTCTigFlag?)

??{

????LowPower_Sleep(?RB_PWR_RAM2K?|?RB_PWR_RAM16K?|?RB_PWR_EXTEND?);

#if?(defined?(DCDC_ENABLE))?&&?(DCDC_ENABLE?==?TRUE)

????PWR_DCDCCfg(?ENABLE?);

#endif

????time?+=?WAKE_UP_RTC_MAX_TIME;

????if(?time?>?0xA8C00000?)???time?-=?0xA8C00000;

????RTC_SetTignTime(?time?);

????LowPower_Idle();

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

??}

??else

??{

????return?3;

??}

#endif

??return?0;

}

這個(gè)函數(shù)中,執(zhí)行LowPower_Sleep()進(jìn)入睡眠,后邊?LowPower_Idle()函數(shù)是做什么用的?


這里的后面的LowPower_Idle 實(shí)際上是一個(gè)1ms 左右的延時(shí),是為了等待外部高頻晶體穩(wěn)定.

在以往的例程中,是通過delayus(1500) 來實(shí)現(xiàn),

但是為了進(jìn)一的降低功耗,后面使用了LowPower_Idle 休眠,

但是這可能引來了一個(gè)風(fēng)險(xiǎn):

1.在非RTC喚醒的情況下,后面由于傳參仍然是基于前面 調(diào)用

u32 CH57X_LowPower( u32 time ) 傳進(jìn)來的時(shí)間,可能導(dǎo)致 接下來進(jìn)入LowPower_Idle 中,直到 再一次產(chǎn)生喚醒條件


所以,你可以

1,將這部分替換為delayus(1500)?

或者:

2,LowPower_Idle? 之前的 RTC_SetTignTime( time ) 的time 根據(jù)當(dāng)前時(shí)間,而不是傳進(jìn)來的時(shí)間.


只有登錄才能回復(fù),可以選擇微信賬號(hào)登錄

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