转自:https://www.cnblogs.com/iini/p/9095551.html
SDK和Softdevice的区别是什么?怎么选择SDK和softdevice版本?芯片,SDK和softdevice有没有版本兼容问题?怎么理解SDK目录结构?SDK帮助文档在哪里?Softdevice帮助文档在哪里?如何选择某个SDK example以开始我们的BLE开发之旅?本文将对以上问题进行解答。
一般来说,推荐大家使用nRF5 SDK来开发Nordic nRF51/nRF52系列产品。从形式上来说,nRF5 SDK其实就是一个产品压缩包,如下:
除了nRF5 SDK,Nordic还针对某些特殊应用领域推出了一些专门的SDK,这些SDK和nRF5 SDK采用了相同的软件架构,相同的驱动和库,以及相同的编码风格。对开发者来说,只要熟悉了nRF5 SDK,这些特殊SDK上手也会比较快。Nordic提供了如下种类的特殊SDK:
nRF5 SDK for Mesh,用于开发蓝牙Mesh应用
nRF5 SDK for Thread and ZigBee,用于开发ZigBee应用或者Thread应用
nRF5 SDK HK,用于开发苹果homekit应用
Thingy SDK,用于开发Nordic Thingy传感器套件
nRFready Smart Remote 3,用于开发蓝牙语音电视机遥控器
nRFready Desktop 2,用于开发蓝牙或者2.4G的无线键盘和鼠标
如果你的应用是上面6种垂直应用,那么建议你选择上面的SDK,否则一律推荐使用nRF5 SDK。下面将对nRF5 SDK进行阐述。
1) nRF5 SDK是Nordic nRF5系列产品软件开发环境,Softdevice是Nordic蓝牙协议栈的名称,为了方便用户的使用,每一个版本的SDK都包含了该版本支持的所有softdevice,请到SDK根目录\components\softdevice目录查看具体支持的softdevice版本。
2)nRF5 SDK版本编号,nRF51 SDK v9.0.0,nRF51 SDK v10.0.0,nRF5 SDK v11.0.0, nRF5 SDK v12.0.0 …目前最新版是nRF5 SDK v15.0.0。之前nRF51和nRF52的SDK是分开的,现在Nordic把nRF51和nRF52的SDK统一到一个版本,即nRF5 SDK。这里顺带提一下,如果你需要使用多个版本nRF5 SDK,那么就会同时用到多个device family pack,请按照低版本先装高版本后装的顺序来安装(如果SDK例程报device family pack错误,请先完全卸载之前的device family pack,再按照由低到高的顺序重装一遍所有的pack)
3) Nordic一般推荐使用最新版的SDK,因为其功能最强大,考虑最周全,可靠性最好。比如nRF51系列,推荐使用SDK12.3.0(12.3.0已经是nRF51能支持的最高版本SDK了),nRF52系列推荐使用SDK15.0.0(15.0.0是目前的最新版,后续还会有更新)。但是最新版的SDK占用的Flash资源和RAM资源比较多,而且新版SDK为了兼容各种情况设计得也比较复杂。为了节省资源或者让应用看起来简洁,客户也可以使用某些老版本的SDK。比如nRF51,如果应用只是BLE从设备(BLE peripheral角色或者slave角色),那么也可以使用SDK9或者SDK10。再比如nRF52832,如果只需要明文DFU不需要签名DFU,那么可以使用SDK11。当然对于老用户来说,要不要升级SDK,一个原则:测试为王,只要你的应用测试下来没有任何问题,你的SDK就是稳定和可靠的,不需要升级SDK。当然,如果你要加入新SDK的功能和特性,那么就需要升级SDK了。请打开SDK根目录\documentation\release_notes.txt以查看最新版SDK的新功能和新特性。
4) Softdevice命名规则一。Softdevice包括两种底层协议栈:BLE和ANT,BLE包括两种角色:central和peripheral,因此需要给这些不同的协议栈类型命名。协议栈命名格式为Sxyz,其中
x – 表示协议栈的类型,1表示BLE协议栈,2表示ANT协议栈,3表示同时支持BLE和ANT
y – 表示BLE角色,1表示从设备,2表示主设备,3表示同时支持主设备和从设备
z – 表示芯片类型,0表示nRF51系列,2表示nRF52系列
比如S110,表示只支持从设备模式的nRF51 BLE协议栈
比如S130,表示既支持从设备模式又支持主设备模式的nRF51 BLE协议栈
比如S132,表示既支持从设备模式又支持主设备模式的nRF52 BLE协议栈
比如S212,表示nRF52只支持ANT协议栈
比如S332,表示nRF52既支持BLE协议栈又支持ANT协议栈,而且BLE协议栈既支持从设备模式又支持主设备模式
5)Softdevice命名规则二。大体上跟命名规则1相同,但是协议栈编号最后2位跟芯片型号一样,比如S140,代表这个协议栈专门用于nRF52840。
6)Softdevice版本编号,从1.0.0开始编号,然后2.0.0,3.0.0,…S110最新版本是8.0.0,S130最新版本是2.0.1,S132最新版本是6.0.0,S112最新版本是6.0.0,S140最新版本是6.0.0(S132/S112/S140版本后续还会升级)。
7)SDK和softdevice兼容性问题。不要查看兼容性表格,直接打开SDK,直接使用SDK里面的softdevice,肯定没有问题。比如S132 在SDK如下文件夹中:
8)芯片版本和SDK版本兼容性问题。如果你使用的是Nordic最新版芯片,就没有这个所谓的兼容性问题,直接下载最新版本的SDK即可。如果你不幸还有Nordic老版本芯片库存,那么只能使用某些老版本的SDK,具体请参考兼容性表格。之所以会有这个兼容性问题,是因为新版本SDK是为新版本芯片服务的,也就是说新版本SDK默认芯片以前的bug已经修复了,所以新版本SDK不会包含老版本芯片的workaround(补丁),导致老版本芯片运行在最新版本SDK上会有一些问题。
以SDK12.3.0为例,nRF5 SDK目录结构如下所示:
-components. 该目录包含了Nordic自己开发的SDK源代码,切记:在产品开发过程中,不要去修改该目录下的任何文件!components目录结构如下所示:
这里特别说明一下,每个版本的SDK都有与之配套的softdevice,他们都位于\components\softdevice目录下。非此目录下的softdevice版本需要经过移植才能用(有的版本连移植都不能用)。所以一定要用\components\softdevice目录下的softdevice,而不要使用官网其他地方下载的softdevice。\components\softdevice目录结构如下所示:
-examples. 该目录包含了丰富的应用示例,不仅包含BLE应用示例,也包含每个外设如何使用的示例,还包含bootloader示例代码。一般来说,开发过程中碰到的大部分问题,都可以在这个目录找到示例。examples目录结构如下所示:
客户用得最多的两个目录是:\ble_peripheral和\peripheral。\ble_peripheral目录包含了BLE作为从模式的应用示例,而\peripheral包含了所有外设应用示例。\ble_peripheral目录结构如下所示:
在Nordic SDK中,经常会碰到deprecated和experimental目录,他们的作用如下:
\deprecated,该目录的内容已被舍弃,并有新版本来替代他们。但为了兼容老产品,SDK还是将其保留下来,比如如下目录:components\drivers_nrf\twi_master\deprecated,如果你是新用户,切记不要使用\deprecated目录下的API。
\experimental 。SDK不断的有new feature/new example出现,有些new feature/new example推出来不久,还没有经过市场大规模验证,对此Nordic会在这些new feature/new example前面加一个前缀:experimental,比如:examples\ble_peripheral\experimental_ble_app_buttonless_dfu,碰到experimental一定要小心,里面有可能有bug,希望用户自己进行充分测试,以保证产品的质量。
再比如sd_ble_gatts_hvx API说明文档在头文件ble_gatts.h中:
再比如ble_advertising_init API说明文档在ble_advertising.h中:
2) Softdevice还有一份专门的spec,来阐述softdevice工作原理,资源占用情况,性能参数,使用注意事项等,建议大家一定要阅读该份spec。
S110 spec链接:http://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.softdevices51%2Fdita%2Fsoftdevices%2Fs110%2Fs110.html&cp=3_7_0
S130 spec链接:http://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.s130.sds%2Fdita%2Fsoftdevices%2Fs130%2Fs130sds.html&cp=3_7_2_0
S132 spec链接:http://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.s132.sds%2Fdita%2Fsoftdevices%2Fs130%2Fs130sds.html&cp=2_3_1_0
S112 spec链接:http://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.s112.sds%2Fdita%2Fsoftdevices%2Fs130%2Fs130sds.html&cp=2_3_0_0
S140 spec链接:http://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.s140.sds%2Fdita%2Fsoftdevices%2Fs130%2Fs130sds.html&cp=2_3_2_0
3) SDK还有在线帮助文档和离线帮助文档,两者一模一样,离线帮助文档就是通过在线帮助文档生成的,以方便网络不好的用户使用。你可以根据自己的情况选择其中一份帮助文档即可。离线版帮助文档可以到这里下载:http://developer.nordicsemi.com/nRF5_SDK/。
在线版帮助文档链接为:http://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.sdk%2Fdita%2Fsdk%2Fnrf5_sdk.html&cp=4_0。
展开帮助文档左边的目录,你会发现:帮助文档目录层级跟SDK目录层级是一一对应的。以SDK12.2.0为例,SDK帮助文档的目录层级与SDK自身的目录层级一一对应。
因此对SDK有任何疑问,可以直接去查对应的帮助文档说明,比如如果你想了解nRF5_SDK_12.2.0_f012efa\examples\peripheral\spi这个例子是干什么的,直接找到帮助文档对应的条目:http://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.sdk5.v12.2.0%2Fspi_master_example.html&cp=4_0_1_4_5_31,你就会明白这是一个告诉你如何使用SPI master的例子。再比如你想知道nRF5_SDK_12.2.0_f012efa\examples\dtm\direct_test_mode这个例子是不是讲如何进行DTM测试的,找到帮助文档相关条目说明:http://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.sdk5.v12.2.0%2Fble_sdk_app_dtm_serial.html&cp=4_0_1_4_4,你就会知道自己的猜测是对的。
其在线帮助文档链接为:http://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.sdk5.v12.2.0%2Fexamples.html&cp=4_0_1_4
比如你想了解” nRF5_SDK_12.2.0_f012efa\examples\ble_peripheral\ble_app_gls”这个例子是干什么的,找到该例子对应的帮助文档说明:http://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.sdk5.v12.2.0%2Fble_sdk_app_gls.html&cp=4_0_1_4_2_2_6。通过查看例子说明,你会发现这是一个标准的血糖仪例子,里面使用了bonding,而且bonding的时候,需要输入PIN码。看完这个例子说明,你就大概明白这个例子跟你的应用接不接近。如果你也需要使用带PIN码的bonding,那么就可以选择该例子作为基础来开始你的开发。
再比如nRF5_SDK_12.2.0_f012efa\examples\ble_peripheral\ble_app_uart,例子说明链接为:http://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.sdk5.v12.2.0%2Fble_sdk_app_nus_eval.html&cp=4_0_1_4_2_2_18
通过查看说明文档,我们知道这个例子是把蓝牙作为透传来使用的,如果你的应用就是把蓝牙作为一个透传模块来使用,那么你可以以这个例子为基础来开始你的开发。
通过一个一个例子的查看,相信你马上可以找到你需要的例子,然后在此基础上,开始你的BLE开发之旅。