当前文档版本为 v0.8.0,您可以访问当前页面的 开发中 版本以获取最近可能的更新。

Bluetooth: Peripheral / Heart-rate Monitor

1 功能概述

此项目演示了蓝牙从机的功能,该工程专门暴露了HR (Heart Rate)GATT服务。

一旦设备连接上,它就会产生虚拟的心率值。

2 环境要求

  • board: 支持 BLE 的蓝牙设备

  • uart(option): 用来显示串口log

  • 测试软件: nRF Connect

3 编译和烧录

例程位置:

  1. zephyr\samples_panchip\bluetooth\peripheral_hr\clock_xtl

  2. zephyr\samples_panchip\bluetooth\peripheral_hr\clock_rcl

  3. zephyr\samples_panchip\bluetooth\peripheral_hr\clock_act

如上面例程的位置可以看出,HR demo 提供了3种不同的时钟配置的工程。

clock_xtl 表示使用外部的32768的晶振作为蓝牙的调度相关的时钟,低功耗方案。

clock_rcl 表示使用内部RCL 32K时钟作为蓝牙的时钟,这种方式主要应用于一些低成本的低功耗方案,相比于clock_xtl 该方法的缺点是连接状态下的功耗高。

注意:在rcl 工程中,由于温度和设电压的变化会导致时钟的偏移,可能导致连接状态断链,所以建议和数据如下

  1. 连接周期比较短,例如周期小于100ms,建议ppm 设置为1000ppm。

  2. 连接周期较长,例如周期为1S,建议ppm 设置为2000ppm。

  3. 1000ppm测试发现,小于1S的连接间隔的连接事件,大概率能够保持连接状态24+hour。

  4. 实际产品的方案中,建议添加自动重连的功能。

clock_act 表示使用内部的Active 32K时钟作为蓝牙的时钟,这种用于非低功耗的场景。

使用 ZAL 工具可以对其进行编译、烧录、打开 VS Code 调试等操作。关于 ZAL 工具的详细介绍请参考:Zephyr APP Launcher 工具介绍

4 配置文件说明

prj.conf 该配置文件配合当前工程的*.overlay,可以选择是否低功耗,以及低功耗模式下选择什么时钟进行计数,配置参数详细说明参考下方章节7 低功耗Config配置参数说明

5 演示说明

  1. 烧录完成后,设备自动启动蓝牙广播,可以在手机或抓包工具上获取如下信息:

    • Service UUID: 0x180D, 0x180A, 0x180F

    • Device Name: Zephyr Heartrate Sensor

  2. 当手机或其它主设备与其建立连接后,串口log 会显示连接信息,如下:

    Connected
    
  3. 此时,如果使能了Heart Rate Measurement,主机将收到温度数据,如下:

    image

    Peripheral HR 手机端 nRF Connect Service界面

    image

    Peripheral HR 手机端 nRF Connect Log界面

6 低功耗电流测试演示说明

  1. 如果需要测试最低电流的话,使用 samples_panchip\bluetooth\peripheral_hr\clock_xtl目录下的prj.conf文件默认配置。

  2. 打开samples_panchip\bluetooth\peripheral_hr\src中的main.c,将宏TEST_LOW_POWER_CURRENT_1S设置为1。使能后会使得 peripheral_hr 广播时为 1 秒周期间隔,同时连接上以后也会更新为 1 秒连接间隔。

  3. 使用 ZAL 工具重新编译下载程序。

  4. 然后使用电流测试工具观测电流,下图为 DCDC 模式 64M 主频广播电流:

    image

    Peripheral HR 功耗测量

  5. 注意在不同的系统时钟下、不同的发射功率下的平均电流是不同的。

7 低功耗Config配置参数说明

  • CONFIG_PM=y

    低功耗使能总开关

  • CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=32000

    CONFIG_SYS_CLOCK_TICKS_PER_SEC=32000

    这两个config一般需要设置为一样的,表示低功耗模式时,系统处于唤醒工作状态时对应的时钟工作频率,此处需要和实际工作频率对应上。

如果低功耗睡眠时和唤醒工作时的真实频率不一致的时候需要加一区别,一般情况下和低功耗时工作频率保持一致。

  • CONFIG_BT_CTLR_SLEEP_CLOCK_SOURCE=1

    低功耗时的睡眠时钟源选择:1表示是RCL(芯片内部的低速晶振,计数精度相对差一点);1也表示是XTL;在dts 文件中选择是XTL还是RCL,详情

    对比查看rcl.overlay 和 xtl.overlay

    2表示工作时使用ACT32K(此选项禁止低功耗模式)。

  • CONFIG_BT_CTLR_SLEEP_CLOCK_HZ=32000

    低功耗睡眠时的真实时钟频率:真实时钟需要使用者来告知zephyr,即使是XTL,可能是32000,也可能是32768,需要使用者告知来决定实际工作的处理。

  • CONFIG_BT_CTLR_SLEEP_TIMER_ACCURACY=5

    低功耗时的晶振精度:

    - 0: 500ppm

    - 1: 250ppm

    - 2: 150ppm

    - 3: 100ppm

    - 4: 75ppm

    - 5: 50ppm

    - 6: 30ppm

    - 7: 20ppm

    - 1000: 1000ppm

    - 2000: 2000ppm

    通过设置该参数可以影响Rx开窗时的Window大小,选择大的ppm, 对于精度差的晶振,可以对连接有一定改善,但同时也有可能影响功耗。

  • CONFIG_PM_ACT_XTL_CONVERT=n

    工作时ACT32K和低功耗睡眠时的32K转换使能,可以选择不同的唤醒工作基准时钟和睡眠基准时钟,该功能一般是开发人员使用。

8 RAM/Flash资源使用情况

xtl:

Memory region         Used Size  Region Size  %age Used
FLASH:      100900 B      256 KB     38.49%
SRAM:       32936 B       50 KB     64.33%

rcl:

Memory region         Used Size  Region Size  %age Used
FLASH:      101276 B      256 KB     38.63%
SRAM:       32968 B        50 KB     64.39%