7110|17

252

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

【nRF52840 DK测评】自定义BLE服务 [复制链接]

 
本帖最后由 jj1989 于 2018-12-8 17:08 编辑

前言

上一篇文章介绍了上手nRF52840需要的一些准备工作,通过对官方SDK例程的学习,我想你对BLE的应用应该有了初步了解。那如何在现有代码的基础上添加自己的BLE服务呢?接下来我将以官方例程模版,带你一步步添加自己的BLE服务。


准备工作

首先按照以下顺序操作,完成相关固件的烧录。

  1. demo:SDK15.0.2中examples/ble_peripheral/ble_app_template
  2. 这里使用gcc-arm-none-eabi进行编译,所以需要先安装好交叉编译工具链,并在sdk中的Makefile.posix文件中,配置其所在路径。
  3. 终端中执行make命令,等待程序编译完成,如下图所示。
    4. 然后执行make flash_softdevice命令,烧录蓝牙协议栈到开发版。
    5. 最后执行make flash命令,烧录应用程序到开发版。烧录完成后,芯片将自动复位重启,此时可以看到LED1开始闪烁,表明程序已经跑起来了。
  4. 手机打开light blue软件,连接名为Nordic_Template的设备,如下图。
    可以看到除了显示广播数据外,无其它服务。接下来我们将添加一个自定义的服务。

添加服务

首先来看services_init函数,

/**@brief Function for initializing services that will be used by the application.
 */
static void services_init(void)
{
    ret_code_t         err_code;
    nrf_ble_qwr_init_t qwr_init = {0};

    // Initialize Queued Write Module.
    qwr_init.error_handler = nrf_qwr_error_handler;

    err_code = nrf_ble_qwr_init(&m_qwr, &qwr_init);
    APP_ERROR_CHECK(err_code);

    /* YOUR_JOB: Add code to initialize the services used by the application.
       ble_xxs_init_t                     xxs_init;
       ble_yys_init_t                     yys_init;

       // Initialize XXX Service.
       memset(&xxs_init, 0, sizeof(xxs_init));

       xxs_init.evt_handler                = NULL;
       xxs_init.is_xxx_notify_supported    = true;
       xxs_init.ble_xx_initial_value.level = 100;

       err_code = ble_bas_init(&m_xxs, &xxs_init);
       APP_ERROR_CHECK(err_code);

       // Initialize YYY Service.
       memset(&yys_init, 0, sizeof(yys_init));
       yys_init.evt_handler                  = on_yys_evt;
       yys_init.ble_yy_initial_value.counter = 0;

       err_code = ble_yy_service_init(&yys_init, &yy_init);
       APP_ERROR_CHECK(err_code);
     */
}

这里注释已经写得较清楚,在这里添加相应的代码即可添加蓝牙服务。这里我们添加一个128位UUID的服务,服务包含一个characteristic,其属性为notify。将实现的功能为当开发板的key1按键状态发生变化时,通知APP。代码如下:

static void services_init(void)
{
    ret_code_t         err_code;
    nrf_ble_qwr_init_t qwr_init = {0};

    // Initialize Queued Write Module.
    qwr_init.error_handler = nrf_qwr_error_handler;

    err_code = nrf_ble_qwr_init(&m_qwr, &qwr_init);
    APP_ERROR_CHECK(err_code);

    //key state service
    ble_key_state_init_t    key_state_init;
    memset(&key_state_init,0,sizeof(key_state_init));
    key_state_init.data_handler = NULL;
    err_code = ble_key_state_init(&m_key_state,&key_state_init);
    APP_ERROR_CHECK(err_code);
}

具体代码的实现,可以参考SDK中的examples/ble_peripheral/ble_app_uart这个例程。

调试

接下来编译、烧录并运行,打开JLinkRTTClient,查看输出日志,出现Fatal error。如下图:

表示程序运行出错,但日志不够详细,没给出出错的原因。此时可开启DEBUG宏,然后重新编译、烧录运行,现在日志很详细了,指出了出错的原因,如下图:
提示main.c 的296行报错,错误类型为 NRF_ERROR_NO_MEM。这里添加了服务,需要设置UUID的数量,我们添加了一个服务,所以需要宏NUS_BASE_UUID设置为1。 再次编译、烧录运行,提示RAM的起始地址需要修改。如下图:
由于我们添加的服务,会单独使用一部分内存,使得留给应用程序的内存空间将减少。根据日志提示,在链接文件中修改好RAM起始地址和大小,然后再次编译并运行。此时开发版LED1开始闪烁,程序终于跑起来了,输出日志如下图:
蓝牙正在进行快速广播。 此时通过手机链接到开发版,可以看到我们刚刚添加的服务。如下图:


总结

本文简单讲解了如何添加自定义的BLE服务,具体的操作可以参考ble_app_uart例程。下一篇将介绍如何将按键状态发送给手机。

此内容由EEWORLD论坛网友jj1989原创,如需转载或用于商业用途需征得作者同意并注明出处
此帖出自无线连接论坛

最新回复

谢谢分享   详情 回复 发表于 2020-11-9 21:07
点赞 关注(1)
 

回复
举报

252

帖子

0

TA的资源

一粒金砂(高级)

沙发
 
对于论坛的markdown模式已无力吐槽,各种格式混乱。同样的内容,两次发出来的格式不一样。
比如上面的序号。
此帖出自无线连接论坛
 
 

回复

5802

帖子

44

TA的资源

版主

板凳
 
表示看不懂    先给楼主顶一哈   👍
此帖出自无线连接论坛

点评

感谢帮顶。  详情 回复 发表于 2018-12-8 22:11
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

4
 
写的很详细,楼主辛苦了
此帖出自无线连接论坛
 
 
 

回复

252

帖子

0

TA的资源

一粒金砂(高级)

5
 
btty038 发表于 2018-12-8 21:26
表示看不懂    先给楼主顶一哈   👍

感谢帮顶。
此帖出自无线连接论坛
 
 
 

回复

252

帖子

0

TA的资源

一粒金砂(高级)

6
 
chenhuman 发表于 2018-12-8 21:44
写的很详细,楼主辛苦了

此帖出自无线连接论坛
 
 
 

回复

1万

帖子

2853

TA的资源

管理员

7
 
感谢分享写的很清楚明了。很抱歉论坛编辑器给你造成的不便。我们正在进行论坛改版中,新版预期采用新的编辑器,会对旧编辑器的问题进行调整。
此帖出自无线连接论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身

点评

期待,每次最痛苦的不是写文章,而是发帖的时候。每次都要编辑好几次,才能基本满足要求。  详情 回复 发表于 2018-12-8 23:31
 
 
 

回复

252

帖子

0

TA的资源

一粒金砂(高级)

8
 
okhxyyo 发表于 2018-12-8 22:59
感谢分享写的很清楚明了。很抱歉论坛编辑器给你造成的不便。我们正在进行论坛改版中,新版预期采 ...

期待,每次最痛苦的不是写文章,而是发帖的时候。每次都要编辑好几次,才能基本满足要求。
此帖出自无线连接论坛
 
 
 

回复

1903

帖子

0

TA的资源

版主

9
 
不错,空闲了,找时间仔细看看你的帖子,我也有个,还没时间研究呢,先支持一下了,,,,加油,,
此帖出自无线连接论坛

点评

嗯,一起研究。  详情 回复 发表于 2018-12-9 16:14
 
 
 

回复

252

帖子

0

TA的资源

一粒金砂(高级)

10
 
star_66666 发表于 2018-12-8 23:50
不错,空闲了,找时间仔细看看你的帖子,我也有个,还没时间研究呢,先支持一下了,,,,加油,,

嗯,一起研究。
此帖出自无线连接论坛
 
 
 

回复

1371

帖子

6

TA的资源

版主

11
 
持续关注,有空俺也学下52840
此帖出自无线连接论坛

点评

做好弃用dialog的准备。  详情 回复 发表于 2018-12-10 09:52
个人签名专注智能产品的研究与开发,专注于电子电路的生产与制造……QQ:2912615383,电子爱好者群: void
 
 
 

回复

252

帖子

0

TA的资源

一粒金砂(高级)

12
 
懒猫爱飞 发表于 2018-12-9 21:00
持续关注,有空俺也学下52840

做好弃用dialog的准备。
此帖出自无线连接论坛

点评

各家都在用^_^  详情 回复 发表于 2018-12-10 16:44
 
 
 

回复

1371

帖子

6

TA的资源

版主

13
 
jj1989 发表于 2018-12-10 09:52
做好弃用dialog的准备。

各家都在用^_^
此帖出自无线连接论坛
个人签名专注智能产品的研究与开发,专注于电子电路的生产与制造……QQ:2912615383,电子爱好者群: void
 
 
 

回复

1903

帖子

0

TA的资源

版主

14
 
有空一起来
此帖出自无线连接论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

15
 

有帮助,定一个

此帖出自无线连接论坛
 
 
 

回复

37

帖子

0

TA的资源

禁止发言

16
 
okhxyyo 发表于 2018-12-8 22:59 感谢分享写的很清楚明了。很抱歉论坛编辑器给你造成的不便。我们正在进行论坛改版中,新版预期采 ...


对标nR*52840,售价:0.9$/pc  
SYD8821是盛芯微科技推出的高性能蓝牙超低功耗BLE5.0 SOC(RX 2.4mA @-94.5dBm灵敏度,TX 4.3mA @0dBm输出功率, MCU 50uA/MHz),集成了高性能射频收发机、64MHz ARM Cortex-M0处理器、512kB Flash存储器、160kB SRAM,以及丰富的数字接口,带有DMA功能。SYD8821片上集成了Balun无需阻抗匹配网络,无需外挂晶振负载电容,最大限度地节省BOM成本。此外,片上还集成了高效率DCDC降压转换器以实现超低功耗,适合用于高性能可穿戴、智能语音遥控器、智能家居MESH、透传等低功耗应用。

接收灵敏度-94.5dBm,发射功率最大4dBm,优异的抗干扰性能。

此帖出自无线连接论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

17
 

您好,请问在哪里可以下载到蓝牙协议栈的源码?

此帖出自无线连接论坛
 
 
 

回复

2618

帖子

0

TA的资源

纯净的硅(高级)

18
 

谢谢分享

此帖出自无线连接论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
快速回复 返回顶部 返回列表