NRF52840 添加 led service


記錄NRF52840 添加LED service的流程,以及遇到的問題。

由於SDK中已經有了led service的.c和.h文件,因此只需要添加文件,並且調用相關函數即可。

 

注:編譯調試環境為keil5

 

1. 在main.c中包含ble_lbs.h頭文件

#include "ble_lbs.h" 

 

2. 將源文件添加到工程中。

工程窗口左邊,在nRF_BLE_Services目錄左鍵點擊,選擇"Add Existing Files To Group  nRF_BLE_Services", 選擇ble_lbs.c

 

3. sdk_config.h 中使能LBS 服務

打開sdk_config.h, 設置

#define BLE_LBS_ENABLED 1

 

4. 在 main.c中添加服務的數據結構作為全局靜態變量:

BLE_LBS_DEF(m_lbs);

 

5. 在services_init()中添加 lbs_init()

static void services_init(void) { qwr_init(); dis_init(); bas_init(); hids_init(); lbs_init(); }

 

6. 實現lbs_init()函數

static void lbs_init(void) { ret_code_t err_code; ble_lbs_init_t lbs_init_obj={0};  memset(&lbs_init_obj, 0, sizeof(lbs_init_obj)); lbs_init_obj.led_write_handler = ipl_led_write_handler; err_code = ble_lbs_init(&m_lbs, &lbs_init_obj); APP_ERROR_CHECK(err_code); }

 

static void ipl_led_write_handler( uint16_t handle, ble_lbs_t *p_lbs, unsigned char led_state ) { NRF_LOG_INFO( "handle = %x, state=%d\n",handle,led_state ); if( led_state ) { nrf_gpio_pin_set( LED_3 ); } else { nrf_gpio_pin_clear( LED_3 ); } }

 

7. 編譯工程,下載調試。

 

8. 調試打印,出現開發板一直重復RESET。

添加打印,發現是lbs_init()中出錯, err_code = 4 (NRF_ERROR_NO_MEM)

 

 err_code = ble_lbs_init(&m_lbs, &lbs_init_obj); NRF_LOG_INFO("ble_lbs_init = %d\n", err_code); APP_ERROR_CHECK(err_code);

 

該問題是由於系統沒有分配足夠的空間給服務引起的。需要修改私有服務的數量以及GATT_ATTR_TAB的大小

-> static void ble_stack_init(void) -> ret_code_t nrf_sdh_ble_default_cfg_set(uint8_t conn_cfg_tag, uint32_t * p_ram_start) ->

// Configure number of custom UUIDS. 設置定制的私有UUID數目
memset(&ble_cfg, 0, sizeof(ble_cfg)); ble_cfg.common_cfg.vs_uuid_cfg.vs_uuid_count = NRF_SDH_BLE_VS_UUID_COUNT; //修改私有UUID數量, SIG定義的共有任務不計入其中 ret_code = sd_ble_cfg_set(BLE_COMMON_CFG_VS_UUID, &ble_cfg, *p_ram_start); if (ret_code != NRF_SUCCESS) { NRF_LOG_ERROR("sd_ble_cfg_set() returned %s when attempting to set BLE_COMMON_CFG_VS_UUID.", nrf_strerror_get(ret_code)); } // Configure the GATTS attribute table.
memset(&ble_cfg, 0x00, sizeof(ble_cfg)); ble_cfg.gatts_cfg.attr_tab_size.attr_tab_size = NRF_SDH_BLE_GATTS_ATTR_TAB_SIZE; //修改GATTS_ATTR_TAB_SIZE大小 ret_code = sd_ble_cfg_set(BLE_GATTS_CFG_ATTR_TAB_SIZE, &ble_cfg, *p_ram_start); if (ret_code != NRF_SUCCESS) { NRF_LOG_ERROR("sd_ble_cfg_set() returned %s when attempting to set BLE_GATTS_CFG_ATTR_TAB_SIZE.", nrf_strerror_get(ret_code)); }

 

sdk_config.h中修改

// <o> NRF_SDH_BLE_GATTS_ATTR_TAB_SIZE - Attribute Table size in bytes. The size must be a multiple of 4. 
#ifndef NRF_SDH_BLE_GATTS_ATTR_TAB_SIZE #define NRF_SDH_BLE_GATTS_ATTR_TAB_SIZE 2048//1408
#endif

// <o> NRF_SDH_BLE_VS_UUID_COUNT - The number of vendor-specific UUIDs. 
#ifndef NRF_SDH_BLE_VS_UUID_COUNT #define NRF_SDH_BLE_VS_UUID_COUNT 5
#endif

 

9. 重新編譯,下載調試。

還是會一直RESET,並打印如下內容:

<warning> nrf_sdh_ble:Insufficient RAM allocated for the softDevice.

<warning> nrf_sdh_ble: Change the RAM start location from 0x20000010 to 0x200024E0

 

 

原因是,增加了UUID服務后,ram使用的空間也要增加,RAM的地址也要修改。一個ram大約是0x10,因此需要按照打印設置RAM的起始位置以及大小

 

方法:

工程窗口左邊,在工程根目錄左鍵點擊,選擇“Options for Target xxxxxx”,設置ram的起始地址和大小

ram原起始地址和大小為:

 

 

修改為打印希望修改的值:

 

 

注:SEGGER中修改方法:修改Options->Linker->Section Placement Macros(雙擊)->錯誤代碼中建議的內存值,保存並Rebuild

該圖片取自:https://blog.csdn.net/qq_26957203/article/details/90647808

10. 重新編譯下載調試。

配對手機,打開nRF Connect APP, 可以觀察到添加的LED服務,並且可以通過手機控制開發板的led 亮滅

 


免責聲明!

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



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