记录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 亮灭

NRF52840 添加 led service的更多相关文章

  1. 你会在C#的类库中添加web service引用吗?

    本文并不是什么高深的文章,只是VS2008应用中的一小部分,但小部分你不一定会,要不你试试: 本人对于分布式开发应用的并不多,这次正好有一个项目要应用web service,我的开发环境是vs2008 ...

  2. C#:添加web service引用

    VS2012里是这样添加web service引用的:

  3. VS2010下创建WEBSERVICE,第二天 ----你会在C#的类库中添加web service引用吗?

    本文并不是什么高深的文章,只是VS2008应用中的一小部分,但小部分你不一定会,要不你试试: 本人对于分布式开发应用的并不多,这次正好有一个项目要应用web service,我的开发环境是vs2008 ...

  4. 【Tomcat】解决Eclipse无法添加Tomcat Service问题

    直接上图:今天因为弄Maven的时候,不小心把Tomcat7 Service 给弄没了,没法直接添加. 可以参照上图的结构进行 Download and Install...点击之后等待一会儿. 其实 ...

  5. 添加native service

    原文地址:http://blog.csdn.net/zhx6044/article/details/47342227 Native Service 其实就是一个 linux 守护进程,提供一些服务,不 ...

  6. centos php nginx 添加到service

    1. nginx A. # vi /etc/init.d/nginx B. #!/bin/sh # Comments to support chkconfig on RedHat Linux # ch ...

  7. 将php-fpm添加至service服务

    1. 使用命令:cd /usr/local/php/etc,进入etc目录,编辑 php-fpm.conf 文件,将 ;pid = run/php-fpm.pid  前面的分号去掉 2. 重启php- ...

  8. 将nginx添加至service服务

    一.问题描述: 无法用service命令启动nginx 二.问题分析: /etc/init.d/目录下缺少nginx默认启动脚本 三.问题解决: 在/etc/init.d/路径下添加脚本文件,名称为n ...

  9. linux添加zabbix service并开机自动启动

    最近有个数据库相关操作后需要重启操作系统,重启后发现zabbix监控一直没有数据,迷了半天原来zabbix压根就没有启动.想了半天决定把zabbix添加到系统服务,并设置开机启动. 1.按一定的规则编 ...

随机推荐

  1. 聊聊Django应用的部署和性能的那些事儿

    随着工作的深入,我越来越发现Python Web开发中有很多坑,也一直在羡慕AspNetCore和Go等的可执行文件部署和高性能,以及Spring生态的丰富,不过因为工作用了Django,生活还是要继 ...

  2. Apache HTTP Server 虚拟主机配置

    Apache HTTP Server 虚拟主机配置(三)     什么是虚拟主机 "虚拟主机"是指在一个机器上运行多个网站(比如:www.company1.com  和 www.c ...

  3. Zabbix-server自动发现,批量添加主机,并链接模板

    zabbix可以手动添加agent客户端,当主机数量比较多时,这时手工重复工作会大大增加.zabbix的自动发现功能可以帮我们解决这个问题. 准备条件: 1. 被监控主机都装上zabbix-agent ...

  4. Android中Activity的启动模式和使用场景

    一.为什么需要启动模式 在Android开发中,我们都知道,在默认的情况下,如果我们启动的是同一个Activity的话,系统会创建多个实例并把它们一一放入任务栈中.当我们点击返回(back)键,这些A ...

  5. Java的常用类——Object类、String类

    Java的JDK中提供给我们很多封装好的类就是Java API,可以直接调用. Java 的API(API: Application(应用) Programming(程序) Interface(接口) ...

  6. 报错:invalid operands to binary - (have ‘int’ and ‘char *’)

    //这个题是输入大写的一串字符,然后按A对应1...这个规律求乘积 char a[],b[]; scanf("%s",a); scanf("%s",b); in ...

  7. PDO::commit

    PDO::commit提交一个事务(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0) 说明 语法 bool PDO::commit ( void )高佣联盟 www.c ...

  8. bzoj 2225 [Spoj 2371]Another Longest Increasing

    这道题 连续上升的三元组 且已经按照第一维排好序了. 直接上CDQ分治即可 当然也是可以2-Dtree解决这个 问题 但是感觉nlog^2 比nsqrt(n)要快一些.. 算是复习一发CDQ分治吧 也 ...

  9. 使用ProxySQL实现MySQL Group Replication的故障转移、读写分离(一)

    导读: 在之前,我们搭建了MySQL组复制集群环境,MySQL组复制集群环境解决了MySQL集群内部的自动故障转移,但是,组复制并没有解决外部业务的故障转移.举个例子,在A.B.C 3台机器上搭建了组 ...

  10. 还分不清 Cookie、Session、Token、JWT?一篇文章讲清楚

    还分不清 Cookie.Session.Token.JWT?一篇文章讲清楚 转载来源 公众号:前端加加 作者:秋天不落叶 什么是认证(Authentication) 通俗地讲就是验证当前用户的身份,证 ...