peripheral 怎么實現BLE所說的低功耗,下面進行功能講解
程序燒寫進EVT測試板,運行結果和電流測試截圖如下
啟動后,廣播並且受到主機的掃描(打印受到掃描廣播包的主機的mac地址),廣播間隔設置的是50ms
// What is the advertising interval when device is discoverable (units of 625us, 80=50ms) #define DEFAULT_ADVERTISING_INTERVAL 80 uint16_t advInt = DEFAULT_ADVERTISING_INTERVAL; // Set advertising interval 設置廣播間隔 GAP_SetParamValue(TGAP_DISC_ADV_INT_MIN, advInt); GAP_SetParamValue(TGAP_DISC_ADV_INT_MAX, advInt);
uint8_t initial_advertising_enable = TRUE; //使能/關閉廣播,第三個參數1使能廣播,為0則關閉廣播 GAPRole_SetParameter(GAPROLE_ADVERT_ENABLED, sizeof(uint8_t), &initial_advertising_enable);
從運行功率來看,下圖的電流尖峰是無線收發的電流,尖峰間隔50ms,跟設置的50ms廣播間隔是一致的,電流的谷值約為7mA左右(運行電流+1mA(EVT板上的LED紅色燈珠))
開啟HAL SLEEP后,對比上圖可以發現,峰值電流沒有變化,谷值電流有7mA降低到1.5mA左右(1mA的LED燈珠電流)
如果仔細觀察,會發現原來間隔50ms變成了46ms,因為在系統空閑時,會調用,這個函數里面睡眠啟動2段睡眠,先sleep模式,再idle模式,到正常工作,因為sleep模式直接到工作模式,要5ms左右的晶振穩定時間,但是idle到工作模式,幾百us就足夠
* @param time - 喚醒的時間點(RTC絕對值) * * @return state. */ uint32_t CH58X_LowPower(uint32_t time) { #if(defined(HAL_SLEEP)) && (HAL_SLEEP == TRUE) uint32_t tmp, irq_status; SYS_DisableAllIrq(&irq_status); tmp = RTC_GetCycle32k(); if((time < tmp) || ((time - tmp) < 30)) { // 檢測睡眠的最短時間 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_RAM30K | RB_PWR_EXTEND); if(RTCTigFlag) // 注意如果使用了RTC以外的喚醒方式,需要注意此時32M晶振未穩定 { time += WAKE_UP_RTC_MAX_TIME; if(time > 0xA8C00000) { time -= 0xA8C00000; } RTC_SetTignTime(time); LowPower_Idle(); } HSECFG_Current(HSE_RCur_100); // 降為額定電流(低功耗函數中提升了HSE偏置電流) } else { return 3; } #endif return 0; }
睡眠控制的邏輯是開啟HAL SLEEP后Tmos會循環調用 CH58X_LowPower 函數,進到函數以后,會先進行參數判斷,輸入參數是RTC喚醒的絕對時間。
如果不想睡眠,可以在執行 睡眠函數前,直接return