社区导航

 

搜索
查看: 2041|回复: 14

[原创] 【nRF52840 DK测评】自定义BLE服务

[复制链接]

268

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2018-12-8 16:51 | 显示全部楼层 |阅读模式
本帖最后由 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命令,等待程序编译完成,如下图所示。
    1.png
    4. 然后执行make flash_softdevice命令,烧录蓝牙协议栈到开发版。
    5. 最后执行make flash命令,烧录应用程序到开发版。烧录完成后,芯片将自动复位重启,此时可以看到LED1开始闪烁,表明程序已经跑起来了。
  4. 手机打开light blue软件,连接名为Nordic_Template的设备,如下图。
    2.PNG
    可以看到除了显示广播数据外,无其它服务。接下来我们将添加一个自定义的服务。

添加服务

首先来看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。如下图:

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


总结

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

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


回复

使用道具 举报

268

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-12-8 17:12 | 显示全部楼层
对于论坛的markdown模式已无力吐槽,各种格式混乱。同样的内容,两次发出来的格式不一样。
比如上面的序号。 屏幕快照 2018-12-08 下午5.10.40.png


回复

使用道具 举报

2620

TA的帖子

41

TA的资源

版主

Rank: 6Rank: 6

发表于 2018-12-8 21:26 | 显示全部楼层
表示看不懂    先给楼主顶一哈   👍

点评

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


回复

使用道具 举报

5

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2018-12-8 21:44 | 显示全部楼层
写的很详细,楼主辛苦了


回复

使用道具 举报

268

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-12-8 22:11 | 显示全部楼层
btty038 发表于 2018-12-8 21:26
表示看不懂    先给楼主顶一哈   👍

感谢帮顶。


回复

使用道具 举报

268

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-12-8 22:12 | 显示全部楼层
chenhuman 发表于 2018-12-8 21:44
写的很详细,楼主辛苦了



回复

使用道具 举报

9891

TA的帖子

133

TA的资源

管理员

Rank: 13Rank: 13Rank: 13Rank: 13

发表于 2018-12-8 22:59 来自手机 | 显示全部楼层
感谢分享写的很清楚明了。很抱歉论坛编辑器给你造成的不便。我们正在进行论坛改版中,新版预期采用新的编辑器,会对旧编辑器的问题进行调整。

点评

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


回复

使用道具 举报

268

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

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

期待,每次最痛苦的不是写文章,而是发帖的时候。每次都要编辑好几次,才能基本满足要求。


回复

使用道具 举报

1996

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

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

点评

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


回复

使用道具 举报

268

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-12-9 16:14 | 显示全部楼层
star_66666 发表于 2018-12-8 23:50
不错,空闲了,找时间仔细看看你的帖子,我也有个,还没时间研究呢,先支持一下了,,,,加油,,

嗯,一起研究。


回复

使用道具 举报

1370

TA的帖子

6

TA的资源

版主

Rank: 6Rank: 6

发表于 2018-12-9 21:00 | 显示全部楼层
持续关注,有空俺也学下52840

点评

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


回复

使用道具 举报

268

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-12-10 09:52 | 显示全部楼层
懒猫爱飞 发表于 2018-12-9 21:00
持续关注,有空俺也学下52840

做好弃用dialog的准备。

点评

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


回复

使用道具 举报

1370

TA的帖子

6

TA的资源

版主

Rank: 6Rank: 6

发表于 2018-12-10 16:44 | 显示全部楼层
jj1989 发表于 2018-12-10 09:52
做好弃用dialog的准备。

各家都在用^_^
专注智能产品的研究与开发,专注于电子电路的生产与制造……QQ:2912615383,电子爱好者群: void


回复

使用道具 举报

1996

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

发表于 2018-12-10 23:07 | 显示全部楼层
有空一起来


回复

使用道具 举报

1

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2019-11-13 14:35 | 显示全部楼层

有帮助,定一个



回复

使用道具 举报

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

关闭

站长推荐上一条 /7 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-2-27 03:31 , Processed in 0.391483 second(s), 16 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表