CH573 CH582 CH579 peripheral通用外設例子講解二 HAL SLEEP控制邏輯


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM