TI CC2541從機中新增電池服務
(1)電池服務的作用:
可以實時檢測配備電池的電量情況,可以提醒使用者及時更換電池或者充電.
(2)實現原理:
如果對微控制器有點基礎的就應該知道AD採集(將電壓值轉化成對應的數字值),所以需要我們設定對應的參考值,直觀就是設定電量100%和0%時對應的電壓值。
假設設定2V對應0%,3V對應100%,2V(為CC2541晶片工作電壓的最低值)時對應的AD值是BATT_ADC_LEVEL_2V,3V時對應的AD值為BATT_ADC_LEVEL_3V ,那麼AD值在
B-D直接的數值就代表電量從0到100%,這樣只要獲取當前的AD值進行數值比對就可以得到當前電量了,推薦BATT_ADC_LEVEL_2V值為:287,BATT_ADC_LEVEL_3V
#define HAL_ADC_CHN_VDD3 0x0f /* VDD/3 */十位的精確度。(hal_adc.h)
(3)在TI CC2541中實現
步驟一:在工程中新增hal_adc.c和hal_adc.h,這兩個檔案看名字就知道是關於AD的。
步驟二:在工程的PROFILES分類中新增battservice.c與battservice.h兩個檔案
步驟三:IAR設定中新增倆路徑(batt和HidDev)
這裡有人可能疑惑為什麼要新增HidDev,這是為了初期的編譯,其實這部分可以不用新增
步驟四:新增AD巨集
步驟五:修改程式碼
到這裡準備工作就做完了,下面就是對程式碼部分進行修改,
a)新增電池服務的標頭檔案(#include "battservice.h")到simpleBLEPeripheral.c中。
b)通過在simpleBLEPeripheral.c的SimpleBLEPeripheral_Init()函式中新增如下程式碼實現初始化電池電量服務,
- {
-
uint8 critical = DEFAULT_BATT_CRITICAL_LEVEL;
- Batt_SetParameter( BATT_PARAM_CRITICAL_LEVEL, sizeof (uint8 ), &critical );/* 設定預設臨界電量 */
- }
c)在檔案simpleBLEPeripheral.c中定義電池電量服務的回撥函式
- staticvoid BattCB(uint8 event)
- {
- if (event == BATT_LEVEL_NOTI_ENABLED)
- {
- if (gapProfileState == GAPROLE_CONNECTED)
- {
- //新增需要的服務程式碼
- }
- }
- elseif (event == BATT_LEVEL_NOTI_DISABLED)
- {
- //新增專案需求的服務程式碼
- }
- }
以上回調函式在battservice.c中的下面的函式裡面自動呼叫。
-
static bStatus_t battWriteAttrCB( uint16 connHandle, gattAttribute_t *pAttr,
uint8 *pValue, uint8 len, uint16 offset )
- staticvoid performPeriodicTask( void )
- {
- if ( gapProfileState == GAPROLE_CONNECTED )
- {
- // perform battery level check
- Batt_MeasLevel( ); //該函式定義在battservice.c檔案中
- }
- }