開啟低功耗后,藍(lán)牙設(shè)備不能找到,麻煩大佬們幫我看下哪兒沒設(shè)置對sleep = true 然后符號設(shè)為HAL_SLEEP = 1

HAL.h增加:

#define LED_BLINK_EVENT? ? ? ?0x0001

#define HAL_KEY_EVENT? ? ? ? ?0x0002

#define HAL_REG_INIT_EVENT? ? 0x2000

#define HAL_TEST_EVENT? ? ? ? 0x4000

#define HAL_SLEEP_EVENT? ? ? ?0x4003

#define HAL_ADV_START_EVENT? ?0x4004

? ?

MCU.c增加:

?if(events & HAL_TEST_EVENT)

? ? {

? ? ? ? tmos_start_task(halTaskID, HAL_SLEEP_EVENT, MS1_TO_SYSTEM_TIME(2000));? // 模擬一定時間后sleep休眠


? ? ? ? uint8_t? initial_advertising_enable = FALSE;? ? ? ? //關(guān)廣播

? ? ? ? GAPRole_SetParameter(GAPROLE_ADVERT_ENABLED, sizeof(uint8_t), &initial_advertising_enable);


? ? ? ? tmos_stop_task(halTaskID, HAL_REG_INIT_EVENT);? //默認(rèn)2分鐘一次的校準(zhǔn)先暫停

? ? ? ? //為了更好掌握代碼邏輯,建議所有TMOS事件在此暫停,喚醒后再安排事件。


? ? ? ? return events ^ HAL_TEST_EVENT;

? ? }

? ? if(events & HAL_SLEEP_EVENT)? ? //MCU在此事件中休眠和喚醒,喚醒后立即校準(zhǔn)RF,再開藍(lán)牙廣播

? ? {

? ? ? ? sys_safe_access_enable();

? ? ? ? R8_CK32K_CONFIG &= ~(RB_CLK_INT32K_PON | RB_CLK_XT32K_PON); //關(guān)閉32K晶振電源,更省電

? ? ? ? sys_safe_access_disable();


? ? ? ? LowPower_Sleep(RB_PWR_RAM30K | RB_PWR_RAM2K); //保留24+2K的SRAM的供電


? ? ? ? sys_safe_access_enable();

? ? ? ? R8_CK32K_CONFIG |= RB_CLK_INT32K_PON;? ? ? ?//32K電源打開,供TMOS系統(tǒng)使用

? ? ? ? sys_safe_access_disable();


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


? ? ? ? DelayMs(5);? ? ?//這里建議給一定的延時,延時足夠到下方的打印能正常就好

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


? ? ? ? tmos_set_event(halTaskID, HAL_REG_INIT_EVENT);? ? ? //先校準(zhǔn)RF,再開廣播

? ? ? ? tmos_start_task(halTaskID, HAL_ADV_START_EVENT, 80);


? ? ? ? return events ^ HAL_SLEEP_EVENT;

? ? }


主程序:

int flag_gpio_int = 0;

__HIGH_CODE

__attribute__((noinline))

void Main_Circulation()

{

? ? while(1)

? ? {

? ? ? ? {

? ? ? ? ? ? TMOS_SystemProcess();

? ? ? ? ? ? if(flag_gpio_int){? ? ? ? //根據(jù)GPIO中置的標(biāo)志變量來安排事件

? ? ? ? ? ? ? ? flag_gpio_int = 0;

? ? ? ? ? ? ? ? tmos_start_task(halTaskID, HAL_TEST_EVENT, 160);

? ? ? ? ? ? ? ? PRINT("main_flag\n");

? ? ? ? ? ? }

? ? ? ? }

? ? }

}


/*********************************************************************

?* @fn? ? ? main

?*

?* @brief? ?主函數(shù)

?*

?* @return? none

?*/

int main(void)

{

? ? GPIOA_ModeCfg(GPIO_Pin_14, GPIO_ModeIN_PU);

? ? ? ? GPIOB_ITModeCfg(GPIO_Pin_14, GPIO_ITMode_FallEdge); // 下降沿喚醒

? ? ? ? PFIC_EnableIRQ(GPIO_A_IRQn);

? ? ? ? PWR_PeriphWakeUpCfg(ENABLE, RB_SLP_GPIO_WAKE, Long_Delay);

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

? ? PWR_DCDCCfg(ENABLE);

#endif

? ? SetSysClock(CLK_SOURCE_PLL_60MHz);

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

? ? GPIOA_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU);

? ? GPIOB_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU);

#endif

#ifdef DEBUG

? ? GPIOA_SetBits(bTXD1);

? ? GPIOA_ModeCfg(bTXD1, GPIO_ModeOut_PP_5mA);

? ? UART1_DefInit();

#endif

? ? PRINT("%s\n", VER_LIB);

? ? CH58X_BLEInit();

? ? MyBsp_Init();

? ? HAL_Init();

? ? GAPRole_PeripheralInit();

? ? HidDev_Init();

? ? HidEmu_Init();

? ? Main_Circulation();

}

__INTERRUPT

__HIGH_CODE

void GPIOA_IRQHandler(void)

{

? ? static uint8_t int_num = 0;? ? //按一下PB4休眠,再按一下喚醒


? ? GPIOA_ClearITFlagBit(GPIO_Pin_14);

? ? if(!int_num){

? ? ? ? flag_gpio_int = 1;? ? //置標(biāo)志,主循環(huán)中查標(biāo)志并安排事件

? ? ? ? int_num = 1;

? ? }

? ? else {

? ? ? ? int_num = 0;

? ? }

}



您好,是使用的CH582嗎,請將下圖中的代碼給注釋掉。image.png


你好,已經(jīng)注釋掉的


串口打印截個圖看看,檢查有沒有打印advertising...,沒有廣播出來,BLE主機(jī)端是搜索不到的。

在代碼里不手動調(diào)用休眠的情況下,是配置HAL_SLEEP=1就好;不過您代碼里有手動調(diào)用休眠,那么可以先將HAL_SLEEP=1去掉,按代碼邏輯里調(diào)用LowPower_Sleep去管理何時休眠,查看是否正常。

這段代碼應(yīng)用場景只適合在僅GPIO喚醒的場合下使用,所以在休眠前關(guān)掉了所有32K時鐘R8_CK32K_CONFIG &= ~(RB_CLK_INT32K_PON | RB_CLK_XT32K_PON),TMOS也是停止運行了。您可以把關(guān)閉32K時鐘的代碼去掉看是否會有休眠異常。


你好,我去掉了hal_sleep=1,然后注釋掉了32K時鐘,按鍵能顯示出藍(lán)牙設(shè)備了,但是連接不上


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

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