Nordic nRF5 SDK和softdevice 介绍和版本对应 11

https://www.cnblogs.com/iini/p/9095551.html

SDK和Softdevice 的区别,怎么选择SDK和Softdevice版本及版本兼容问题

Nordic目前有2套完全独立的SDK:nRF SDK和nRF Connect SDK,一般来说,开发板nRF51/52推荐使用nRF5 SDK,开发nRF91/nRF53等新产品推荐使用nRF connect SDK   官网下载地址 https://www.nordicsemi.com/Software-and-Tools/Software/nRF5-SDK/Download#infotabs

除了nRF5 SDK,Nordic 还针对某些特殊应用推出了一些专门的SDK

1.nRF5 SDK for Mesh 用于开发蓝牙Mesh应用

2.nRF5 SDK for Thread and ZigBee  用于开发ZigBee应用或者Thread应用

3.nRF SDK HK 用于开发苹果home kit应用

4.Thingy SDK 用于开发Nodic Thingy传感器套件

5. nRFread Smart Remote 3用于开发蓝牙语音遥控器

6.nRFready Desktop 2用于开发蓝牙或者2.4 G的无限键盘和鼠标

如果你的应用是上面6种垂直应用,那么建议你选择上面的SDK,否则一律推荐使用nRF5SDK.

   1)Softdevice 是Nodic蓝牙协议栈的名称,每个SDK包中都包含该版本支持的协议栈  请到SDK根目录\components\softdevice

SDK官网下载地址为:https://www.nordicsemi.com/Software-and-Tools/Software/nRF5-SDK/Download#infotabs

     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.3.0。SDK9/10只支持nRF51系列芯片,SDK11/12同时支持nRF51和nRF52系列芯片而SDK13/14/15只支持nRF52系列芯片

3)Nodic一般推荐使用最新的SDK来开发你的应用,因为功能强大,考虑周全,可靠性最好,比如nRF系列,推荐使用SDK12.3

 nRF系列推荐使用SDK15.3  ,查看SDK新版本特性 在:SDK根目录\documentation\release_notes.txt

4)Softdevice 命名规则一,Softdevcie 包括两种底层协议栈:BLE 和ANT ,BLE包括两种角色central(又称master)和peripheral(又称Slave),为此需要给这类不同类型协议栈命名区分:

  比如S110,表示只支持从设备模式的nRF51 BLE协议栈

  比如S130,表示既支持设备模式又支持主设备模式的nRF51 BLE协议栈

  比如132,表示既支持从设备模式又支持主设备模式的nRF52BLE协议栈

  比如S212,表示nRF52 ANT协议栈

  比如S332,表示nRF既支持BLE协议栈又支持ANT协议栈,而且BLE协议栈既支持从设备模式又支持主设备模式

 Softdevice命令规则而,大体上更命名规则1相同,但是协议栈变化最后2位跟芯片型号一样,比如S140,代表这个协议栈专门用于nRF52840,S140协议栈是一个很大而全的协议栈,包含蓝牙所有功能

5)SDK和softdevice 兼容性问题,不要查看兼容性表格,直接打开SDK,直接使用SDK里面的softdevice ,肯定没问题

6)再完美的协议栈难免也会有bug 大家只需要下载版本号最后一位有变化的即可,比如6.1.1相比6.1.0,最后一个数字有升级,那么直接下载下来直接覆盖老的协议栈,如果有大的变化,比如7.0.0相比6.1.0这个属于大升级了,此时需要直接使用最新的版本SDK进行来开发,

S132协议栈最新版本查询页面:https://www.nordicsemi.com/Software-and-Tools/Software/S132/Download#infotabs

7)在Nordic SDK中,经常会碰到deprecated experimental目录,他们的作用如下:

\deprecated,该目录的内容已被舍弃,并有新版本来替代他们,但为了兼容老产品,SDK还是将其保留下来,比如如下目录:

components\drivers_nrf\twi_master\deprecated,如果你是新用户,切记不要使用\deprecated目录下的API

\experimental ,SDK不断有new feature/new example 出现,这些还没有经过市场大规模验证,对此Nodic会在这些new feature/new example前面加一个前缀:experimental,比如 :examples\ble_peripheral\experimental_ble_app_buttonless_dfu,碰到experimental一定要小心里面有可能有bug,希望用户自己进行充分测试,以保证产品的质量。

nRF52SDK和softdevice 帮助文档

1)不管是SDK还是softdevice自有API,建议首先查看SDK自带API说明,记住:API说明一般都放在头文件中,比如:softdevice_enable()API相关的头文件在Softdevice_handler.h中

2)Softdevice还有一份专门的spec,来阐述softdevice工作原理,资源占用情况,性能参数,使用注意事项等,建议大家一定要阅读该份spec

S132 spec:https://infocenter.nordicsemi.com/index.jsp?topic=%2Fsds_s132%2FSDS%2Fs1xx%2Fs130.html&cp=3_4_1_0

3)SDK还有在线帮助文档和离线帮助文档,两者一模一样,离线帮助文档就是通过在线帮助文档生成的,以方便网络不好的用户使用。你可以根据自己的情况选择其中一份帮助文档即可,帮助文档链接:https://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.sdk5.v15.3.0%2Fexamples.html&cp=5_1_4

因此对于SDK有任何疑问,可以直接查对应的帮助文档,比如你想了解nRF5_SDK安装目录\examples\peripheral\spi这个例子是干什么的,直接找到帮助文档对应的条目:https://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.sdk5.v15.3.0%2Fspi_master_example.html&cp=5_1_4_6_37,你就会明白这是一个告诉你如何使用SPI master的例子

再比如你想知道nRF5_SDK_15.2.0_9412b96\examples\dtm\direct_test_mode这个例子是不是讲如何进行DTM测试的,找到帮助文档相关条目说明:https://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.sdk5.v15.3.0%2Fble_sdk_app_dtm_serial.html&cp=5_1_4_5,你就会知道自己的猜测是对的

SDK 例子开发

Nordic nRF5 SDK包含了丰富实用例子,一般来说,我们的应用都是基于其中一个例子来开发的

比如你想了解” nRF5_SDK安装目录\examples\ble_peripheral\ble_app_gls”这个例子是干什么的,找到该例子对应的帮助文档说明:https://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.sdk5.v15.3.0%2Fble_sdk_app_gls.html&cp=5_1_4_2_2_11,通过查看例子说明,你会发现这是一个标准的血糖仪例子,里面使用了bonding,而且bonding的时候,需要输入PIN码,并支持LESC模式。看完这个例子说明,你就大概明白这个例子跟你的应用接不接近,如果你也需要使用带PIN码的bonding,那么就可以选择该例子作为基础来开始你的开发。

再比如nRF5_SDK安装目录\examples\ble_peripheral\ble_app_uart,例子说明链接为:https://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.sdk5.v15.3.0%2Fble_sdk_app_nus_eval.html&cp=5_1_4_2_2_24

通过查看说明文档,我们知道这个例子是把蓝牙作为透传来使用的,如果你的应用就是把蓝牙作为一个透传模块来使用,那么你可以以这个例子为基础来开始你的开发

 

 

 

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是使用Nordic nRF5 SDK创建新的BLE服务的详细示例: 1. 首先,在nRF5 SDK中打开“examples\ble_peripheral\ble_app_template”示例。 2. 在“ble_app”文件夹中,打开“ble_srv_common.h”文件。此文件包含了一些常用的BLE服务定义,你可以通过阅读该文件来了解BLE服务的实现方式。 3. 在“ble_app”文件夹中,打开“ble_srv_common.c”文件。此文件包含了一些常用的BLE服务实现代码,你可以通过阅读该文件来了解BLE服务的实现方式。 4. 在“ble_app”文件夹中,创建一个新的文件夹,命名为“my_service”。 5. 在“my_service”文件夹中,创建一个新的文件,命名为“my_service.h”。在该文件中,你需要定义你的自定义BLE服务的UUID,以及相关的特性和属性等信息。例如: ``` #ifndef MY_SERVICE_H #define MY_SERVICE_H #include "ble.h" #include "ble_srv_common.h" #define BLE_UUID_MY_SERVICE 0x1234 // 自定义服务的UUID // 自定义服务的特性UUID #define BLE_UUID_MY_SERVICE_CHARACTERISTIC 0x5678 // 自定义服务的特性值结构体 typedef struct { uint8_t value; } ble_my_service_characteristic_t; // 自定义服务的事件结构体 typedef struct { ble_my_service_characteristic_t char_value; } ble_my_service_evt_t; // 自定义服务的事件句柄类型 typedef void (*ble_my_service_evt_handler_t) (ble_my_service_evt_t * p_evt); // 自定义服务的初始化函数 uint32_t ble_my_service_init(void); // 自定义服务的事件注册函数 void ble_my_service_evt_handler_register(ble_my_service_evt_handler_t evt_handler); #endif // MY_SERVICE_H ``` 6. 在“my_service”文件夹中,创建一个新的文件,命名为“my_service.c”。在该文件中,你需要实现你的自定义BLE服务的初始化、事件处理等功能。例如: ``` #include "my_service.h" static uint16_t m_service_handle; // 自定义服务的句柄 static ble_gatts_char_handles_t m_char_handles; // 自定义服务的特性句柄 static ble_my_service_evt_handler_t m_evt_handler; // 自定义服务的事件处理函数 // 自定义服务的事件回调函数 static void my_service_evt_handler(ble_evt_t const * p_ble_evt) { switch (p_ble_evt->header.evt_id) { case BLE_GAP_EVT_CONNECTED: break; case BLE_GAP_EVT_DISCONNECTED: break; case BLE_GATTS_EVT_WRITE: if (p_ble_evt->evt.gatts_evt.params.write.handle == m_char_handles.value_handle) { ble_my_service_evt_t evt; evt.char_value.value = p_ble_evt->evt.gatts_evt.params.write.data[0]; m_evt_handler(&evt); } break; default: break; } } // 自定义服务的事件注册函数 void ble_my_service_evt_handler_register(ble_my_service_evt_handler_t evt_handler) { m_evt_handler = evt_handler; } // 自定义服务的初始化函数 uint32_t ble_my_service_init(void) { uint32_t err_code; ble_uuid_t ble_uuid; ble_uuid128_t base_uuid = {BLE_UUID_MY_SERVICE_BASE}; // 生成自定义服务的UUID err_code = sd_ble_uuid_vs_add(&base_uuid, &ble_uuid.type); VERIFY_SUCCESS(err_code); ble_uuid.uuid = BLE_UUID_MY_SERVICE; // 添加自定义服务 err_code = sd_ble_gatts_service_add(BLE_GATTS_SRVC_TYPE_PRIMARY, &ble_uuid, &m_service_handle); VERIFY_SUCCESS(err_code); // 添加自定义服务的特性 ble_gatts_char_md_t char_md; memset(&char_md, 0, sizeof(char_md)); char_md.char_props.read = 1; char_md.char_props.write = 1; ble_gatts_attr_md_t attr_md; memset(&attr_md, 0, sizeof(attr_md)); attr_md.read_perm = BLE_GAP_CONN_SEC_MODE_OPEN; attr_md.write_perm = BLE_GAP_CONN_SEC_MODE_OPEN; attr_md.vloc = BLE_GATTS_VLOC_STACK; ble_uuid_t char_uuid; char_uuid.uuid = BLE_UUID_MY_SERVICE_CHARACTERISTIC; char_uuid.type = ble_uuid.type; ble_gatts_attr_t attr; memset(&attr, 0, sizeof(attr)); attr.p_uuid = &char_uuid; attr.p_attr_md = &attr_md; attr.init_len = sizeof(ble_my_service_characteristic_t); attr.max_len = sizeof(ble_my_service_characteristic_t); attr.p_value = NULL; err_code = sd_ble_gatts_characteristic_add(m_service_handle, &char_md, &attr, &m_char_handles); VERIFY_SUCCESS(err_code); // 注册事件回调函数 err_code = sd_ble_gap_appearance_set(BLE_APPEARANCE_GENERIC_TAG); VERIFY_SUCCESS(err_code); err_code = sd_ble_gap_device_name_set(&sec_mode, (const uint8_t *) DEVICE_NAME, strlen(DEVICE_NAME)); VERIFY_SUCCESS(err_code); err_code = sd_ble_gap_tx_power_set(BLE_GAP_TX_POWER_ROLE_ADV, m_adv_handle, TX_POWER); VERIFY_SUCCESS(err_code); err_code = sd_ble_gap_tx_power_set(BLE_GAP_TX_POWER_ROLE_SCAN_INIT, 0, TX_POWER); VERIFY_SUCCESS(err_code); err_code = sd_ble_gap_tx_power_set(BLE_GAP_TX_POWER_ROLE_CONN, 0, TX_POWER); VERIFY_SUCCESS(err_code); err_code = sd_ble_gap_ppcp_set(&ppcp); VERIFY_SUCCESS(err_code); return NRF_SUCCESS; } ``` 7. 在“main.c”文件中,包含“my_service.h”头文件,并在初始化函数中调用“ble_my_service_init()”函数来初始化你的自定义BLE服务。例如: ``` #include "my_service.h" int main(void) { uint32_t err_code; // 初始化BLE协议栈 ble_stack_init(); // 初始化GAP参数 gap_params_init(); // 初始化GATT参数 gatt_init(); // 初始化自定义服务 err_code = ble_my_service_init(); APP_ERROR_CHECK(err_code); // 启动广播 advertising_start(); // 进入主循环 for (;;) { idle_state_handle(); } } ``` 到此为止,我们已经完成了一个简单的自定义BLE服务的创建实例。你可以根据自己的需要修改“my_service.h”和“my_service.c”文件,来实现更加复杂的自定义BLE服务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值