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

NDK Configuration 开发指南

1. 背景介绍

ndk 添加一套配置系统sdk_config.h一方面方便用户进行开发,另一方面是为了方便管理不同芯片平台,本章主要介绍sdk_config的含义,以及使用注意的事项。

2. 配置解释和说明

image

configuration overview

如上图采用 KEIL MDK 自带的 configuration wizard 的功能,NDK 适配了一套自己 sdk 配置功能表项,依次是Soc PlatformRTOSBLE ResourceBLE Security ManagerBLE ServicesFlash KVStore AreaFLash Map

2.1 Soc Platform 配置介绍

soc platform 主要配置芯片的时钟、电源、串口 log 以及低功耗相关的 feature,具体如下图所示。

image

soc platform configuration

  1. Chip Power Mode 选择芯片的供电模式,默认采用 DCDC 模式,用户也可以选择 LDO 模式,具体选择那个方案取决于硬件方案的设计

  2. System Clock 选择系统时钟,默认是 32M,也可选择 48M,一般低功耗偏向于使用 32M 方案

  3. APB1 和 APB2 选择时钟分频,一般不需要要修改,除非为了某种特定的低功耗方案进行适配

  4. 32K Low-Speed Clock Source 选择低速 32K 的时钟源,依次为 ACT32KXTLRCL

    • 低功耗 xtl 需要外接晶体,蓝牙连接功耗低

    • 低功耗 rcl 不需要外接晶体,蓝牙连接功耗高

    • active 32K 运用于非低功耗模式,一般是主机或者多连接的场景

  5. Force Calib RCL Clock 选择是否校准 rcl 时钟,蓝牙相关的工程不需要手动勾选,controller 会自动根据场景选择校准

  6. Enable UART Log 选择串口输出 log,上图 P16 串口引脚默认是 **107x QFN32 **核心板

  7. Enable RTT Log 选择 jlink rtt 输出 log

  8. Enable RAM Function 此功能是通过把调度相关的部分代码编译到 RAM 加速运行和减少功耗,缺点需要牺牲一些 ram

  9. Remap Vector Table to SRAM 此功能是把中断向量表映射到 ram 上面,可以加速中断响应或者适配一些场景

  10. Enable Flash LDO 选择 是否使用内部 LDO 给予 flash 供电,默认勾上(功耗低一点)

  11. Enable Auto Power Optimization 此功能使能意味着软件会会定时(默认是300ms,可以自行修改)通过 ADC 读取芯片温度,根据温度动态优化芯片内部电源模块,从而达到最优功耗。注意:定时读取温度本身也会增加功耗,5分钟的间隔大约增加 200na 的平均电流

  12. Enable Low Power Mode 勾选意味着选择低功耗模式,芯片会在空闲状态下自动进入低功耗模式

2.2 RTOS 配置介绍

此配置选项,选择和操作系统相关的配置,注意是定时线程的栈大小,优先级,以及支持的队列的个数(参考 freertos 了解定时器的队列)

image

rtos configuration

2.2.1 Timer Thread

此选项卡用来选择定时器线程相关的参数配置,freertos 定时器是通过一个线程来实现的,可配的参数如下

  • Use freertos sofware timer 使用软件定时器

  • Timer thread priority 设置软件定时的优先级

  • Support maximun number of timer queue length 支持最大命令队列,一般一个定时所有的操作需要 4-5个queue,详情参考 freertos

  • Timer Thread stack size 设置定时栈的大小,word 对齐,128 意味着栈大小是 512 octets

建议定时相关的函数,采用 nimble 重新封装的 API,函数的接口定义在nimble_npl.h,相比于 freertos 原生的 API,nimble 定时的回调函数最终是在 ble host thread 回调的,由于 ble host thread 的线程栈比较大,意味着定时器回调函数可以安全调用蓝牙 host 相关的任意 API,不会溢出。

void ble_npl_callout_init(struct ble_npl_callout *co, struct ble_npl_eventq *evq, ble_npl_event_fn *ev_cb, void *ev_arg);

// 初始化一个定时器
ble_npl_callout_init(&ble_hs_stop_terminate_tmo, nimble_port_get_dflt_eventq(),
                         ble_hs_stop_terminate_timeout_cb, NULL);

// 启动一个定时器
ble_npl_callout_reset(&ble_hs_stop_terminate_tmo,
                              ble_npl_time_ms_to_ticks32(BLE_HOST_STOP_TIMEOUT_MS));
// 关闭当前的定时器
ble_npl_callout_stop(&ble_hs_stop_terminate_tmo);

2.2.2 BLE Host Thread

蓝牙调度都是基于这个线程实现的,可以配置优先级和线程栈的大小,栈的大小也是4个字节对齐的。

场景

线程栈大小推荐值

备注

不支持配对加密

252 - 300 words

实际的栈大小还和用户的操作有关系

支持配对加密

400 - 500 words

实际的栈大小还和用户的操作有关系

2.2.3 Total heap size

Total heap size 主要由下面的对象消耗的,用户可以不必太关心细节,可以勾选 Enable OS Malloc Fail Hook进行内存检测,如果不够 log 会打印 malloc failed,自行进行删减,默认的工程一般都是稍有余量

Total Heap

unit

IDLE Thread STACK

size*4

Timer Thread STACK

size*4

BLE Host Thread STACK

size*4

OS 相关的对象的使用,例如实例化定时器的个数,信号量的个数

\

BLE ATT GATT entry 等,一般服务越多,支持的角色,就需要的越多

\

BLE Host buffer,Host 使用的部分 buf,也是占用 Total heap size

\

目前单连接的丛机,不需要配对,最小的 Total heap size 大约是 4096 octets

2.2.4 Hook function

  1. Enable OS Idle Hook,调度进入 IDLE 线程后给予用户回调函数

  2. Enable OS Tick Hook,调度进入 Tick 更新后给予用户回调函数

  3. Enable OS Malloc Fail Hook,Malloc 内存失败后给予用户回调函数

2.3 BLE Resource

image

rtos configuration

  1. Support maximun number of BLE Master Link,controller 支持 master 链路的数量,如果设备支持主机功能需要指定数量,上图是 0 表示不支持主机

  2. Support maximun number of BLE Slave Link,controller 支持 slave 链路的数量,如果设备支持丛机功能需要指定数量,上图为 1 表示支持1个链路的丛机

  3. GAP 角色定义

    • Support gap broadcaster role

    • Support gap central role

    • Support gap observser role

    • Support gap peripheral role

  4. buffer 相关

​ buffer 相关的话题比较大,且关系相互关联,这儿简单给一个配置矩阵让大家参考

buffer

Default(single peripheral)

Support Central

Support Security Manger

Support High Throughput

Multiple connection(2 主 3 丛)

Support acl buffer counts receiving data from controller

5

10

24

Support acl buffer receiving data from controller

27

251 (>=65)

251

64

Support hci events counts

4

16

Support hci discardable events counts

0

5 (>=5)

Support l2cap buffer counts

4

Support l2cap buffer size

120

BLE Controller RF RX Buffer Number

16

8

8

16

BLE Controller RF TX Buffer Number

16

8

8

8

注意:多连接的配置涉及到 ram 资源和吞吐率的平衡,低于2主3丛的配置都可以使用2主3丛的推荐配置(若吞吐率达不到要求,请联系 panchip FAE)

  1. controller 相关

  • LE Controller Packet Encrypt Time 如果支持配对建议写到 300us,否则写 100us

  • BLE Controller More Data Number 表示一次蓝牙连接事件最大的模式,芯片支持最大个数是 6

  • BLE Controller WhiteList Number 表示白名单列表的数目,根据实际却设置,默认是 1

  • BLE Controller Resolving List Number 表示可解析地址的数目

  • BLE Controller Master Link Margin 设置设备作为主机,连接不同丛机之间的最小距离

  1. Use Chip unique Mac Address

    使用芯片的出厂的 mac 地址

  2. TX power

    支持范围是 -40 到 9dbm,最小步长是1dbm,如果需要设置 0 以下,可以通过 text Editor 收到修改如下图

image

tx power configuration

  1. BLE Timing Debug

    可以通过GPIO 口 分析蓝牙调度的时序

2.4 BLE Security Manger

image

如上图所示 SM 把设置支持的 feature 以及能力通过配置文件进行展示了,具体含义参考蓝牙 core spec ,这儿解释几个SDK 中的概念

  1. Support persist store key 存储 key 到 flash 上面,意味着设备断电上电也能记住之前配对的设备

  2. Support maximun store bonded devices 支持最大的 bonding 数目,这个数目越大需要的 Key-Value-Store 的区域大小也需要的也越大

  3. Support maximun store bonded device’s cccd 支持最大bonding 设备的 cccd,根据实现项目来

  4. Support host software rpa feature 支持 host 生成 privacy adv 功能

2.5 Flash KVStore Area

SDK 添加了开源 flash manger 的算法,用于数据存储。默认 Bluetooth 所有 key 都是的存储,读取,删除相关的操作都是基于这个算法。用户也可以存储自己的数据。

  1. Start Address 默认在107 芯片是在 0x7800,详情参考 章节

  2. Number of Flash Sectors flash 的存储算法是乒乓操作的,值设置 2 意味着,有效存储是1个 sector,大约可以存储1个设备的配对绑定所有信息。

2.6 Flash Map

image

  1. Support BootLoader 如勾上则必须下载 BootLoader 估计才能正常运行

  2. Flash Image Size 选择正确的 flash 的大小,这儿主要用来编译限制提醒用的

  3. Support Back-up area in OTA model OTA 升级是否需要备份区,用户根据升级模式自行选择