低功耗藍(lán)牙應(yīng)用對功耗要求越低越好,功耗越低電池續(xù)航時間就越長,用戶體驗就越好。當(dāng)你發(fā)現(xiàn)你板子功耗偏高時,建議按照如下步驟進(jìn)行自檢:
確認(rèn)理論功耗值。Bluetooth LE功耗跟廣播間隔或者連接間隔是成正比關(guān)系的,所以20ms連接間隔下的功耗幾乎是1s狀態(tài)下的50倍!,單純地問“1mA功耗高不高?”是沒有意義的,必須結(jié)合特定的應(yīng)用場景才有意義。不管是廣播還是連接,特定的使用場景會有一個理論功耗值,大家可以訪問網(wǎng)址: https://devzone.nordicsemi.com/power/,以獲得你的使用場景下理論功耗多少,比如連接模式下,每1秒鐘發(fā)20個字節(jié)的數(shù)據(jù)包,這種模式下理論功耗為:7.5uA
確定板子漏電流。如果板子包含的元器件比較多,那么也有可能是其他非nRF5元器件導(dǎo)致的高功耗,比如傳感器,codec,或者電路設(shè)計本身的問題等。為了確定高功耗是來自nRF5器件還是其他器件,根據(jù)自己的情況,有如下三個方法供你參考:一如果你的固件可以直接在Nordic官方DK上運行,那么你可以把你的固件直接下載到DK上,然后通過DK測量nRF5芯片的功耗,如果這個功耗正常,那么大電流應(yīng)該是由其他非nRF5元器件引起的;如果這個功耗偏高,那么大電流的確是由nRF5芯片固件引起的,此時請參考后續(xù)操作步驟說明。二如果你的固件不能在DK上直接運行,那么可以讓nRF5芯片進(jìn)入深度睡眠模式(System OFF模式),此時nRF5芯片功耗只有零點幾微安,nRF5芯片所有IO口將處于floating狀態(tài),此時再測量板子電流。如果板子電流恢復(fù)正常,那么大電流應(yīng)該是由nRF5芯片固件引起的;如果板子電流還是不正常,那么大電流應(yīng)該由其他非nRF5元器件引起的。關(guān)于如何進(jìn)入深度睡眠模式,你可以參考工程:SDK安裝目錄examplesperipheralram_retentionpca10040blankarm5_no_packs,或者參考ble_app_hrs工程中函數(shù):sleep_mode_enter。三如果你的板子太復(fù)雜,無法按照上面兩種方法來確定漏電流,那么只能將板子其他非必需元器件焊下來,只留下一個nRF5最小工作系統(tǒng),然后再測量此時的板子電流是否正常。
確定板子已經(jīng)退出J-Link模式。如果板子一直是電池供電,那么在某些情況下,即使程序下載完成而且運行正常,此時板子有可能還處在J-Link模式。J-Link模式下板子會有2mA左右的額外電流。要退出J-Link模式,有2種方式,一是給板子進(jìn)行上電復(fù)位,二是通過nrfjprog發(fā)出—reset指令(nRF52系列)或者—pinreset指令(nRF51系列),兩種方式都能讓板子退出J-Link模式,從而進(jìn)入應(yīng)用模式。
如果最終確認(rèn)大電流的確是由nRF5芯片引起的,那么幾乎可以肯定系統(tǒng)在進(jìn)入idle模式(System ON模式)之前,沒有關(guān)掉不需要的模塊。模塊沒有關(guān)掉,它就一直在耗電,從而導(dǎo)致功耗過大。Idle模式下,如下模塊會耗費比較多的電流,若允許建議全部關(guān)掉。
Idle模式。先說明一下什么是idle模式,所謂Idle模式,Nordic芯片手冊也稱為System ON模式,就是CPU可以不工作而外設(shè)可以繼續(xù)工作的一種低功耗模式。idle模式下,當(dāng)CPU和所有外設(shè)都不工作時,系統(tǒng)電流只有1.2uA左右。(注:除了idle模式,nRF5芯片還支持一種更低功耗的低功耗模式:sleep模式(Nordic芯片手冊稱為System OFF模式),sleep模式下,CPU和所有外設(shè)都強(qiáng)制關(guān)閉,所以功耗非常低:只有零點幾微安。由于sleep模式下,芯片無法發(fā)出廣播包或者與手機(jī)保持藍(lán)牙連接,所以sleep模式在Bluetooth LE應(yīng)用中運用得并不是很多)。Idle模式可以被任何中斷喚醒(sleep模式只能被IO口喚醒),所以idle模式在實際應(yīng)用中使用得比較多。在idle模式下,芯片仍然可以正常發(fā)出廣播或者與手機(jī)保持藍(lán)牙連接,所以大部分Bluetooth LE應(yīng)用都是工作在idle模式下,這樣既保持了Bluetooth LE功能又可以實現(xiàn)低功耗。有softdevice時進(jìn)入idle模式的函數(shù)是:
sd_app_evt_wait
無softdevice時進(jìn)入idle模式的代碼是:
__WFE(); // Clear the internal event register. __SEV(); __WFE();
這里我們順便把進(jìn)入sleep模式的函數(shù)也貼出來,供大家對比參考。有softdevice時進(jìn)入sleep模式的函數(shù)是:
sd_power_system_off
無softdevice時進(jìn)入sleep模式的代碼是:
// Enter System OFF and wait for wake up from GPIO detect signal. NRF_POWER->SYSTEMOFF = 0x1;
不管softdevice有沒有使能,idle模式下的電流都很低,只有1.2uA左右
UART/UARTE。由于UART需要實時檢測RX線上有沒有下降沿,所以一旦UART初始化成功,高頻時鐘將一直處于打開狀態(tài),從而導(dǎo)致UART模塊消耗的電流比較大,雖然UART模塊本身只需要55uA的工作電流,但是為了配合UART工作其他外設(shè)(比如時鐘電路)需要消耗250uA左右電流,因此普通UART需要消耗300多微安電流。Nordic還有一個增強(qiáng)型UART:UARTE,它是帶DMA功能的,而DMA還需要消耗額外的1~2mA電流,這樣UARTE工作的時候需要消耗1mA多電流。因此在進(jìn)入idle模式之前,強(qiáng)烈建議將UART關(guān)掉,以節(jié)省系統(tǒng)功耗。注:為了達(dá)到低功耗和實時性雙重目的,在設(shè)計UART通信的時候,我們經(jīng)常會額外再加2個GPIO口用來通知對方UART要傳送數(shù)據(jù)了。關(guān)閉uart的API為:nrf_drv_uart_uninit或者app_uart_close。
CLI/UART。如果你使用了CLI/UART模塊,請使用cli模塊自帶的uninit函數(shù)去關(guān)閉本模塊。當(dāng)cli模塊和RTOS結(jié)合一起使用的時候,經(jīng)常發(fā)現(xiàn)cli模塊關(guān)閉不徹底,從而導(dǎo)致idle模式下功耗還是很高(比如450uA左右),此時有可能需要多次調(diào)用nrf_cli_uninit這個函數(shù),從而確保cli/uart模塊真正被關(guān)閉了。
GPIOTE。GPIOTE中斷有兩種工作模式:高精度模式(hi_accuracy為true)和低精度模式(hi_accuracy為false)。hi_accuracy為true將使能IN event中斷;hi_accuracy為false將使能Port event中斷。IN event中斷功耗比Port event中斷高10~20uA(nRF51將高出幾百微安),因此如果應(yīng)用邏輯允許的話,那么建議使用低精度模式,即使用如下初始化語句:
GPIOTE_CONFIG_IN_SENSE_TOGGLE(false) //低功耗低精度IO口中斷模式
DMA。Nordic大部分外設(shè)都自帶DMA功能,如果DMA可以關(guān)閉的話(有些設(shè)備DMA是不能關(guān)閉的),用完DMA之后,記得把DMA關(guān)掉,否則會有1~2mA左右的功耗。使用ADC的時候尤其要注意這點。
FPU。每當(dāng)程序要執(zhí)行浮點數(shù)運算的時候,Cortex M4F會自動把FPU打開,F(xiàn)PU是耗能大戶,其將消耗7mA以上的電流。此種情況下,進(jìn)入idle模式之前必須手動關(guān)閉FPU,手動關(guān)閉FPU代碼如下所示:
/* Clear FPSCR register and clear pending FPU interrupts. This code is base on * nRF5x_release_notes.txt in documentation folder. It is necessary part of code when * application using power saving mode and after handling FPU errors in polling mode. */ __set_FPSCR(__get_FPSCR() & ~(FPU_EXCEPTION_MASK)); (void) __get_FPSCR(); NVIC_ClearPendingIRQ(FPU_IRQn);
Timer0/1/2/3/4。Timer的工作電流大概為5~50uA左右(nRF51功耗會更高),對低功耗應(yīng)用來說,已經(jīng)非常大了。如果你的定時精度要求不高,而且是毫秒的倍數(shù),那么強(qiáng)烈建議你使用app_timer來實現(xiàn)定時功能,app_timer的功耗只有0.2uA左右。
SPI/TWI/ADC等。在進(jìn)入idle模式之前,建議把SPI/TWI/ADC等模塊也uninit。大家可能會擔(dān)心反復(fù)init和uninit同一個模塊會不會有問題?這個不用擔(dān)心,目前還沒看到任何副作用。
ADC。最新的ADC驅(qū)動引入了一個宏:NRFX_SAADC_CONFIG_LP_MODE,如果你發(fā)現(xiàn)uninit ADC后,功耗還是很高,建議打開這個宏,再試一下,功耗有可能就降下來了。
帶DMA功能的UARTE。如果你的UART使用了DMA功能,測試時,發(fā)現(xiàn)大部分時候uninit UART后功耗都正常,偶爾會出現(xiàn)uninit后功耗降不下來的情況,請把這句話加在main函數(shù)的開始:*(volatile uint32_t*)(0x4007AC84) = 0x00000002;
還有一種電流異常情況:大部分芯片功耗是正常的,只有少部分芯片功耗是異常的。這種情況一般都跟IO口狀態(tài)有關(guān),如果碰到這種情況,建議對芯片每個IO口進(jìn)行重新初始化,或許問題就解決了。
若無特殊情況,避免使用輸入/NOPULL配置。輸入模式下,要不使用內(nèi)部上拉或下拉,要不使用外部的。
如果不知道該如何配置一個IO口在idle模式的狀態(tài),建議設(shè)為默認(rèn)狀態(tài),即Floating狀態(tài)。
已使用IO口。不管nRF51還是nRF52,尤其這些IO口被用作為其他外設(shè)比如IIC/SPI等,哪怕IO口之前已經(jīng)是確定狀態(tài),在進(jìn)入idle模式之前,建議對其再次進(jìn)行初始化,或許問題就解決了。
未使用IO口。這個問題好像只有nRF51802才有而且跟板子也有關(guān)系,在進(jìn)入sleep模式或者idle模式之前,對未使用的IO口進(jìn)行非floating初始化,即把它設(shè)為輸入上拉或者下拉,而不是默認(rèn)的Floating狀態(tài)。(其他芯片好像沒有發(fā)現(xiàn)這個問題)
審核編輯 黃宇
-
藍(lán)牙
+關(guān)注
關(guān)注
116文章
6030瀏覽量
173171 -
Nordic
+關(guān)注
關(guān)注
9文章
200瀏覽量
47923
發(fā)布評論請先 登錄
用第三方的dlp3010板子時遇到的幾個問題求解
AN53-微功耗高側(cè)MOSFET驅(qū)動器

ads1271損壞的原因有哪些?
aducm330刷寫編譯后的程序到板子以后,板子的調(diào)試接口便無法訪問,什么原因導(dǎo)致的?如何解決?
導(dǎo)致安規(guī)電容損壞的原因有哪些

TAS5715掃FFT在13K左右有個很高的尖峰是什么原因?
光纜無法做的原因有哪些
柵極驅(qū)動芯片選型低功耗原因
SD NAND SPI模式:如何實現(xiàn)低功耗運行

評論