记录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={}; memset(&lbs_init_obj, , 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, , 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//
#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,并打印如下内容

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

方法:

工程窗口左边,在工程根目录左键点击,选择“Options for Target xxxxxx”,设置ram的起始地址和大小

ram原起始地址和大小为:

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

10. 重新编译下载调试。

配对手机,打开nRF Connect APP, 可以观察到添加的LED服务,并且可以通过手机控制开发板的led 亮灭

最新文章

  1. MySQL性能优化:索引
  2. SQL Server 2016 RC0 安装(超多图)
  3. poj 3280 Cheapest Palindrome
  4. Swift Swift中的反射
  5. COGS738 [网络流24题] 数字梯形(最小费用最大流)
  6. My Game --线段数据
  7. 向mysql数据库中插入大二进制文件和大文本
  8. Android软键盘隐藏,遮挡EidtText解决办法
  9. jQuery的jsonp跨域是这么回事.
  10. Qt使用默认浏览器打开网页
  11. 从ASP.NET的web1子界面刷新打开web1的web0父界面
  12. Spring 3.1 Environment Profiles--转载
  13. C++排序
  14. HDU 4121 Xiangqi (算是模拟吧)
  15. mac 搭建node 开发环境记录
  16. Java中next()和nextLine()
  17. 前端基于Canvas生成等值面的方案
  18. LeetCode--155--最小栈(java版)
  19. Struts2不扫描jar包中的action
  20. ReactNative WebView组件详解

热门文章

  1. RACTF-web C0llide?(js弱类型)
  2. Day07_品牌管理
  3. 老男孩Django笔记(非原创)
  4. PHP array_uintersect() 函数
  5. 4.26 ABC F I hate Matrix Construction 二进制拆位 构造 最大匹配
  6. 【mysql数据库优化】
  7. Ajax中关于xmlhttp.readyState的值及解释
  8. Android 布局的一些控件的补充和布局的补充(今儿没课)
  9. 打破你的认知!Java空指针居然还能这样玩,90%人不知道…
  10. 20、FlyWeight 享元模式