4.用户指南
4.1.BLE特性
4.1.1.设备配置
设备配置在用户层提供,然后在SDK的应用层应用。在我们的BLE示例应用程序的上下文中,这样的配置以结构的形式定义,即亚博国际官网平台网址user_gapm_conf
,在各自user_config.h
文件。可以根据需要修改结构的成员。例如,GAP角色和蓝牙设备地址是可以在用户级别提供的两个配置项。
的代码片段user_config.h
的GAPM配置结构ble_app_barebone示例应用程序:
静态常量结构体gapm_configurationuser_gapm_conf={///设备角色:中心,外围,观察者,广播或所有角色。(@see enum gap_role).角色=GAP_ROLE_PERIPHERAL,///最大MTU。如果使用Legacy Pairing,则设置为23;如果使用Secure Connection,则设置为65;///如果应用程序需要,可以添加更多.max_mtu=23,///设备地址类型.addr_type=APP_CFG_ADDR_TYPE(USER_CFG_ADDRESS_MODE),///启用隐私时,重新生成随机私有地址前的持续时间.renew_dur=15000,// 15000 * 10ms = 150s是最小值/************************隐私配置************************ ////随机静态地址//注:地址应符合以下要求:// -地址的最高两位等于1,// -地址的剩余位不等于1,// -地址的剩余位不等于0。//如果使用{0x00, 0x00, 0x00, 0x00, 0x00}空地址,a//自动生成随机静态地址。.addr={0 x00,0 x00,0 x00,0 x00,0 x00,0 x00},///设备IRK用于生成可解析私有地址(LSB优先).惹恼={0 x00,0 x01,0 x02,0 x03,0 x04,0 x05,0 x06,0 x07,(,0 x09,0 x0a,0 x0b,0 x0c,0 x0d,0 x0e,0 x0f},/***************************** ATT数据库配置***************************** ////属性数据库配置(@see enum gapm_att_cfg_flag)/// 7 6 5 4 3 2 1 0/// +-----+-----+----+-----+-----+----+----+----+/// | DBG | rfu | sc | PCP | app_perm | name_perm |/// +-----+-----+----+-----+-----+----+----+----+/// -位[0-1]:对端设备的设备名写权限要求(@参见device_name_write_perm)/// -位[2-3]:对端设备外观写权限要求(@参见device_appearance write_perm)/// -[4]位:表示Slave首选连接参数存在/// - Bit [5]: GATT属性数据库中存在服务变更特性。/// -[6]位:保留/// -[7]位:开启调试模式.att_cfg=GAPM_MASK_ATT_SVC_CHG_EN,/// GAP服务启动句柄.gap_start_hdl=0,/// GATT服务启动句柄.gatt_start_hdl=0,/***************************************************数据包长度扩展配置(4.2)*************************************************** ////最大MPS.max_mps=0,///最大Tx octets (connInitialMaxTxOctets值,在4.2规范中定义).max_txoctets=251,///最大Tx时间(connInitialMaxTxTime值,在4.2规范中定义).max_txtime=2120,};
4.1.1.1.蓝牙设备地址类型
所有蓝牙设备都应该有一个蓝牙设备地址,该地址唯一地标识该设备与另一个蓝牙设备。
蓝牙设备地址可以在用户级别配置,如果USER_CFG_ADDRESS_MODE
是根据用户需要修改的(参见user_config.h
在ble_app_barebone,例如)。
蓝牙设备地址有两种类型:
公共(
APP_CFG_ADDR_PUB
)随机
随机设备地址可以是以下两种子类型之一:
静态的(
APP_CFG_ADDR_STATIC
)私人
反过来,私有设备地址可以是以下子类型之一:
APP_CFG_HOST_PRIV_RPA
:设备使用在BLE主机中生成的可解析私网地址运行APP_CFG_HOST_PRIV_NRPA
:设备运行在BLE主机中生成的不可解析的私有地址(不可连接设备)。APP_CFG_CNTL_PRIV_RPA_PUB
:设备使用BLE控制器生成的可解析私网地址运行。如果设备的解析列表为空,即没有绑定对等体,则设备将使用公网地址进行操作APP_CFG_CNTL_PRIV_RPA_RAND
:设备使用在BLE控制器中生成的可解析私有地址运行(与解析列表中是否存在绑定对等体无关)。
请注意
设备的公网地址类型ble_app_barebone设置示例应用程序USER_CFG_ADDRESS_MODE
国旗在user_config.h
.
#define USER_CFG_ADDRESS_MODE APP_CFG_ADDR_PUB
请注意
设备的公共地址ble_app_barebone设置示例应用程序CFG_NVDS_TAG_BD_ADDRESS
国旗在da1458x_config_advanced.h
.
#define CFG_NVDS_TAG_BD_ADDRESS {0x02, 0x00, 0x00, 0xCA, 0xEA, 0x80}
4.1.2.广告配置
可以通过advertise_configuration
结构(见user_config.h
在ble_app_barebone,例如):
非连通非定向情况下的广告模式
GAPM_ADV_NON_CONN
)和可连接无向(GAPM_ADV_UNDIRECT
)广告:GAP_NON_DISCOVERABLE
——Non-discoverableGAP_GEN_DISCOVERABLE
-一般可发现GAP_LIM_DISCOVERABLE
-有限的发现GAP_BROADCASTER_MODE
——广播
不可连接的非定向(
GAPM_ADV_NON_CONN
)和可连接无向(GAPM_ADV_UNDIRECT
)广告:ADV_ALLOW_SCAN_ANY_CON_ANY
-允许扫描和连接请求从任何设备ADV_ALLOW_SCAN_ANY_CON_WLST
—允许任何设备的扫描请求,只允许白名单设备的连接请求
在可连接定向广告的情况下,对等设备地址(
GAPM_ADV_DIRECT
或GAPM_ADV_DIRECT_LDC
)在可连接定向广告的情况下,对等设备地址类型(
GAPM_ADV_DIRECT
或GAPM_ADV_DIRECT_LDC
):0
——公共1
——随机
4.1.3.广告类型
支持以下4种广告类型:
- ADV_IND
-
可连接的非定向广告:从调用
app_easy_gap_undirected_advertise_start ()
API函数。 - ADV_DIRECT_IND
-
可连接定向广告:首先调用
app_easy_gap_directed_advertise_start ()
API功能,可选启用低占空比模式。 - ADV_NONCONN_IND
-
不可连接的非定向广告:从调用
app_easy_gap_non_connectable_advertise_start ()
API功能,无需任何扫描响应数据。的代码片段user_config.h意味着ADV_NONCONN_INDType将被使用:
///广告数据#define USER_ADVERTISE_DATA "\x03"\ADV_TYPE_COMPLETE_LIST_16BIT_SERVICE_IDS \ADV_UUID_DEVICE_INFORMATION_SERVICE///扫描响应数据#define USER_ADVERTISE_SCAN_RESPONSE_DATA "
- ADV_SCAN_IND
-
可扫描的非定向广告:首先调用
app_easy_gap_non_connectable_advertise_start ()
API功能,另外提供扫描响应数据。的代码片段user_config.h意味着ADV_SCAN_INDType将被使用:
///广告数据#define USER_ADVERTISE_DATA ("\x09"\ADV_TYPE_COMPLETE_LIST_16BIT_SERVICE_IDS \ADV_UUID_LINK_LOSS_SERVICE \ADV_UUID_IMMEDIATE_ALERT_SERVICE \ADV_UUID_TX_POWER_SERVICE \ADV_UUID_SUOTAR_SERVICE \\ \ x10ADV_TYPE_URI \“\ x16 \ x2F \ x2F \ x77 \ \表示就是x77 \ x77 \ x2E x69 \ x61 \ x6E \ \ x6F \ x72 \表示就是x61 \ x2E x67”)///扫描响应数据#define USER_ADVERTISE_SCAN_RESPONSE_DATA "\x0a"\ADV_TYPE_MANUFACTURER_SPECIFIC_DATA \ADV_DIALOG_MANUFACTURER_CODE \“DLG-BLE”
SDK BLE示例应用程序默认使用亚博国际官网平台网址ADV_IND键入(除)ble_app_non_con显示两个ADV_NONCONN_IND和ADV_SCAN_IND)。
举个例子,ble_app_barebone可以修改(见user_app_adv_start ()
函数(在上述BLE示例中)来演示任何其他广告类型。
4.1.4.广告数据更新
的app_easy_gap_update_adv_data ()
为了在应用程序运行时更新广告数据,可以调用API函数。为了更新扫描响应数据,也可以调用上述函数。
作为示例,请参见adv_data_update_timer_cb ()
回调函数中的ble_app_barebone示例应用程序。
4.1.5.应用程序定时器
为了在应用程序上下文中添加一次性计时器app_easy_timer ()
API函数可以被调用。为了重新启动已经添加的计时器,上述函数必须再次调用。其他相关的API函数有:
app_easy_timer_cancel ()
取消已编程的应用程序定时器app_easy_timer_modify ()
修改已编程的应用程序定时器app_easy_timer_cancel_all ()
取消所有已编程的应用程序计时器
作为一个例子,在ble_app_barebone示例应用程序中,添加了一个计时器user_app_adv_start ()
函数。一旦计时器到期,即在30秒内,adv_data_update_timer_cb ()
回调函数将被调用。在后者的上下文中,计时器被重新启动,以便每30秒更新一次广告数据。
4.1.6.应用层的BLE栈消息处理
发送到应用层的BLE堆栈消息通常由SDK的应用层处理,或者由app_task.c
或者由各自app_ <模块> _task.c
模块的任务。
控件在应用程序层中处理的消息示例app_task.c
模块。这些消息从BLE栈发送到应用层。
静态常量结构体ke_msg_handlerapp_gap_process_handlers[]={{GAPM_DEVICE_READY_IND,(ke_msg_func_t)gapm_device_ready_ind_handler},{GAPM_CMP_EVT,(ke_msg_func_t)gapm_cmp_evt_handler},{GAPC_CMP_EVT,(ke_msg_func_t)gapc_cmp_evt_handler},{GAPC_CONNECTION_REQ_IND,(ke_msg_func_t)gapc_connection_req_ind_handler},{GAPC_DISCONNECT_IND,(ke_msg_func_t)gapc_disconnect_ind_handler},{GAPC_GET_DEV_INFO_REQ_IND,(ke_msg_func_t)gapc_get_dev_info_req_ind_handler},{GAPC_SET_DEV_INFO_REQ_IND,(ke_msg_func_t)gapc_set_dev_info_req_ind_handler},{GAPM_PROFILE_ADDED_IND,(ke_msg_func_t)gapm_profile_added_ind_handler},{GAPM_ADV_REPORT_IND,(ke_msg_func_t)gapm_adv_report_ind_handler},{GAPC_PARAM_UPDATE_REQ_IND,(ke_msg_func_t)gapc_param_update_req_ind_handler},{GAPC_LE_PKT_SIZE_IND,(ke_msg_func_t)gapc_le_pkt_size_ind_handler},{GATTC_SVC_CHANGED_CFG_IND,(ke_msg_func_t)gattc_svc_changed_cfg_ind_handler},{GAPC_PEER_FEATURES_IND,(ke_msg_func_t)gapc_peer_features_ind_handler},#如果(BLE_APP_SEC){GAPC_SECURITY_IND,(ke_msg_func_t)gapc_security_ind_handler},# endif};
的应用程序层发送的消息低音概要文件。类中处理这些消息app_bass_task.c
文件。
静态常量结构体ke_msg_handlerapp_bass_process_handlers[]={{BASS_ENABLE_RSP,(ke_msg_func_t)bass_enable_rsp_handler},{BASS_BATT_LEVEL_UPD_RSP,(ke_msg_func_t)bass_batt_level_upd_rsp_handler},{BASS_BATT_LEVEL_NTF_CFG_IND,(ke_msg_func_t)bass_batt_level_ntf_cfg_ind_handler},{APP_BASS_TIMER,(ke_msg_func_t)app_bass_timer_handler},{APP_BASS_ALERT_TIMER,(ke_msg_func_t)app_bass_alert_timer_handler},};
如果在SDK的应用层中没有处理BLE堆栈消息(app_task.c
或app_ <模块> _task.c
),则可以在用户级别处理。这可以通过在SDK中调用的消息转发机制实现接球休息处理.
关于ble_app_peripheral作为一个例子,我们将继续概述如何启用和使用此机制:
应在用户级别添加处理函数。该函数可以处理应用层转发的任何消息(由用户决定哪些转发的消息将在用户级处理)。详细信息请参见
user_catch_rest_hndl ()
中的函数实现user_peripheral.c
)。为了方便消息转发机制,
app_process_catch_rest_cb
应定义于user_callback_config.h
(见#定义app_process_catch_rest_cbuser_catch_rest_hndl
在BLE示例中ble_app_peripheral)。
4.1.7.BLE事件回调
BLE事件可以通过回调函数在用户级处理。例如,user_app_connection ()
回调函数是否会在收到GAPC_CONNECTION_REQ_IND
事件(参见app_task.c
详情)。
的ble_app_barebone示例中注册了以下回调函数:
静态常量结构体app_callbacksuser_app_callbacks={.app_on_connection=user_app_connection,.app_on_disconnect=user_app_disconnect,.app_on_update_params_rejected=零,.app_on_update_params_complete=零,.app_on_set_dev_config_complete=default_app_on_set_dev_config_complete,.app_on_adv_nonconn_complete=零,.app_on_adv_undirect_complete=user_app_adv_undirect_complete,.app_on_adv_direct_complete=零,.app_on_db_init_complete=default_app_on_db_init_complete,.app_on_scanning_completed=零,.app_on_adv_report_ind=零,.app_on_get_dev_name=default_app_on_get_dev_name,.app_on_get_dev_appearance=default_app_on_get_dev_appearance,.app_on_get_dev_slv_pref_params=default_app_on_get_dev_slv_pref_params,.app_on_set_dev_info=default_app_on_set_dev_info,.app_on_data_length_change=零,.app_on_update_params_request=default_app_update_params_request,.app_on_generate_static_random_addr=default_app_generate_static_random_addr,.app_on_svc_changed_cfg_ind=零,.app_on_get_peer_features=零,#如果(BLE_APP_SEC).app_on_pairing_request=零,.app_on_tk_exch=零,.app_on_irk_exch=零,.app_on_csrk_exch=零,.app_on_ltk_exch=零,.app_on_pairing_succeeded=零,.app_on_encrypt_ind=零,.app_on_encrypt_req_ind=零,.app_on_security_req_ind=零,.app_on_addr_solved_ind=零,.app_on_addr_resolve_failed=零,.app_on_ral_cmp_evt=零,.app_on_ral_size_ind=零,.app_on_ral_addr_ind=零,# endif/ / (BLE_APP_SEC)};
上面的结构定义了要处理的某个事件:
通过默认处理程序或
由用户定义的处理程序或
它根本不会被处理(NULL条目)
的用户定义处理程序ble_app_barebone例如:user_app_connection ()
,user_app_disconnect ()
,user_app_adv_undirect_complete ()
等)在C源文件中定义user_barebone.c
.
举个例子user_app_adv_undirect_complete ()
当非直接可连接广告完成时将调用Callback。
的代码片段app_task.c
显示了user_app_adv_undirect_complete ()
Callback将被调用:
//无定向可连接广告结束情况下GAPM_ADV_UNDIRECT:{CALLBACK_ARGS_1(user_app_callbacks.app_on_adv_undirect_complete,参数->状态)}打破;
4.1.8.连接/断开与对端设备的连接
连接到对等设备本质上是一个BLE事件。断开与对等设备的连接也是如此。我们的BLE示例应用程序演示了用亚博国际官网平台网址户级别的连接/断开处理。
作为示例,请参见user_app_connection ()
中的回调函数ble_app_barebone.当与对等设备建立连接时,将通过类的相应条目调用上述函数user_app_callbacks
回调结构(在文件中定义)user_callback_config.h
)。
类似地,user_app_disconnect ()
当与对等设备断开连接时将调用回调函数。
用户应用程序代码流进来ble_app_barebone如下图所示:
4.1.9.通过L2CAP更新连接参数
当与对等设备建立连接时,可以根据需要更新连接参数。为此,app_easy_gap_param_update_start ()
调用API函数。
我们的BLE示例应用程序展示了如亚博国际官网平台网址何在用户级别启动连接参数更新。举个例子,inble_app_barebone
,在连接到对端设备时,有条件地添加应用定时器(如果已建立的连接的参数不是首选参数;有关详情,请参阅user_app_connection ()
功能)。如果添加了计时器,连接参数更新将通过param_update_request_timer_cb ()
回调函数(一旦计时器到期,即在10秒内)。
的代码片段user_config.h
的参数更新配置ble_app_barebone示例应用程序:
静态常量结构体connection_param_configurationuser_connection_param_conf={///连接间隔最小,以双槽测量(1.25ms)///使用宏MS_TO_DOUBLESLOTS将毫秒(ms)转换为双插槽.intv_min=MS_TO_DOUBLESLOTS(10),///最大连接间隔,以ble双槽测量(1.25ms)///使用宏MS_TO_DOUBLESLOTS将毫秒(ms)转换为双插槽.intv_max=MS_TO_DOUBLESLOTS(20.),///在连接事件中测量延迟.延迟=0,///监控超时以定时器单位(10ms)测量///使用宏MS_TO_TIMERUNITS将毫秒(ms)转换为计时器单位.time_out=MS_TO_TIMERUNITS(1250),///最小连接事件持续时间(1.25ms)///使用宏MS_TO_DOUBLESLOTS将毫秒(ms)转换为双插槽.ce_len_min=MS_TO_DOUBLESLOTS(0),///最大连接事件持续时间(1.25ms)///使用宏MS_TO_DOUBLESLOTS将毫秒(ms)转换为双插槽.ce_len_max=MS_TO_DOUBLESLOTS(0),};
4.1.10.LE数据包长度扩展
的app_easy_gap_set_data_packet_length ()
可以调用API函数来设置最大数据包长度。支持的最大长度是251个字节。另请参阅CFG_MAX_TX_PACKET_LENGTH
在da1458x_config_advanced.h
任何BLE示例应用程序的文件。亚博国际官网平台网址
应该强调的是app_easy_gap_get_peer_features ()
API函数之前被调用app_easy_gap_set_data_packet_length ()
,以确定对等设备是否也支持LE数据包长度扩展。
请注意
对于生产测试固件,支持的最大长度-用于测试TX/RX数据包,即当CFG_PRODUCTION_TEST
在prod_test
示例(参见MAX_PAYLOAD_LENGTH_BY_SPEC
和MIN_PAYLOAD_LENGTH_BY_SPEC
定义-当CFG_PRODUCTION_TEST
在中定义da1458x_scatter_config.h
) -是255个八位字节。在prod_test
的例子,CFG_PRODUCTION_TEST
是默认定义的。
4.1.11.蓝牙配置文件
4.1.11.1.蓝牙SIG配置文件
BLE示例应用程序展示了如何通过亚博国际官网平台网址中的适当定义在用户级别启用基于蓝牙SIG gatt的配置文件user_modules_config.h
和user_profiles_config.h
,并将相应的源文件添加到项目中。
作为一个例子,我们将继续概述如何PROXR在prox_reporter例子:
在
user_modules_config.h
,#定义EXCLUDE_DLG_PROXR (0)
已经被定义在
user_profiles_config.h
,#定义CFG_PRF_PXPR
已经被定义以下源文件已添加到项目中:
proxr.c
和proxr_task.c
组成PROXR配置文件的实现和可用< sdk_root_directory > \ sdk \ ble_stack \ profiles \ prox \ proxr \ src
,app_proxr.c
和app_proxr_task.c
是SDK应用层的实现吗PROXR都可以在< sdk_root_directory > \ sdk \ app_modules \ src \ app_proxr
.本质上讲,app_proxr.c
保存API函数,用户可以在其应用程序中调用这些函数app_proxr_task.c
保存命中的消息的函数处理程序PROXR的任务。
SDK支持以下蓝牙SIG配置文件/服务(参见表5细节):
邻近概况(监控角色)
邻近配置文件(报告者角色)
查找我配置文件(定位器角色)
查找我配置文件(目标角色)
健康温度计配置文件(收集器角色)
健康温度计配置文件(温度计角色)
设备信息服务(Client角色)
设备信息服务(服务器角色)
血压表(收集者角色)
血压概况(传感器作用)
时间配置文件(客户端角色)
时间配置文件(服务器角色)
心率配置文件(收集器角色)
心率表(传感器角色)
扫描参数配置(客户端角色)
扫描参数配置文件(服务器角色)
电池服务(客户端角色)
电池服务(服务器角色)
HID(设备角色)
HID引导(主机角色)
HID报告(主机角色)
葡萄糖谱(收集者角色)
葡萄糖谱(传感器作用)
运行速度和节奏配置文件(采集器角色)
运行速度和节奏配置文件(服务器角色)
循环速度和节奏配置文件(收集器角色)
循环速度和节奏配置文件(服务器角色)
循环电源配置文件(收集器角色)
循环电源配置文件(服务器角色)
位置和导航配置文件(采集器角色)
位置和导航配置文件(服务器角色)
警报通知配置文件(客户端角色)
警报通知配置文件(服务器角色)
电话警报状态配置文件(客户端角色)
电话警报状态配置文件(服务器角色)
债券管理服务(客户角色)
Bond Management Service(服务器角色)
Apple通知中心服务(客户端角色)
身体合成服务(客户角色)
身体合成服务(服务器角色)
体重秤服务(客户端角色)
体重秤服务(服务器角色)
用户数据服务(客户端角色)
用户数据服务(服务器角色)
通用属性配置文件服务(客户端角色)
4.1.11.2.自定义配置文件- GATT服务器角色
SDK提供了两个彼此相同的自定义配置文件(服务器角色),即CUSTS1和CUSTS2。CUSTS1和CUSTS2 api及其相应的实现在目录中< sdk_root_directory > \ sdk \ ble_stack \ profiles \习俗
.SDK应用层中与CUSTS1和custs2相关的api和实现分别在目录中< sdk_root_directory > \ sdk \ app_modules \ api
(app_customs.h
和app_customs_task.h
文件),< sdk_root_directory > \ sdk \ app_modules \ src \ app_custs
.
我们的两个BLE示例应用程序,即亚博国际官网平台网址ble_app_profile
和ble_app_peripheral
,展示如何在用户级别添加、启用和处理由三个服务组成的自定义配置文件。ble_app_profile
演示了如何添加自定义配置文件(为其服务及其特征用户定义的128位uuid)以及如何创建其数据库。ble_app_peripheral
构建在ble_app_profile
并演示了如何在用户级别为自定义配置文件添加一些基本功能。在本节的其余部分中,我们将重点讨论ble_app_peripheral
示例应用程序。
user_custs_config.c
,user_custs1_def.c
,user_custs1_impl.c
和user_peripheral.c
在用户级构建与自定义配置文件相关的逻辑:
user_custs_config.c
:定义自定义配置文件回调函数表(cust_prf_funcs []
数组),包含数据库创建函数,即。app_custs1_create_db ()
,在SDK的应用层调用user_custs1_def.c
:包含自定义概要数据库描述,本质上是三个服务的属性user_custs1_impl.c
定义了在属性访问时将被调用的用户逻辑处理程序user_peripheral.c
:包含user_catch_rest_hndl ()
类中定义的任何处理程序的Handler函数user_custs1_impl.c
,视情况而定(参见4.1.6节欲知更多有关user_catch_rest_hndl ()
)
4.1.11.3.suta接收方简介
SUOTAR配置文件允许由对等设备发起的空中软件更新。它由UUID由蓝牙SIG (0xFEF5)分配的SUOTAR服务组成。
ble_app_ota
是我们的BLE示例应用程序之一,它展示了如何添加、启亚博国际官网平台网址用和使用SUOTAR配置文件。SUOTAR的启用与DISS类似(参见部分4.1.11.1)。以下源文件被添加到项目中:
suotar.c
和suotar_task.c
SUOTAR配置文件是否实现并在目录中可用< sdk_root_directory > \ sdk \ ble_stack \ profiles \ suota \ suotar \ src
app_suotar.c
和app_suotar_task.c
目录中是否有SUOTAR和SDK应用层的实现< sdk_root_directory > \ sdk \ app_modules \ src \ app_suotar
4.1.11.4.关贸总协定-客户-角色配置文件- ANCS客户
ANCS Client是一个BLE示例应用程序,它演示了如何添加、启用和使用gatt -Client-角色配置文件。该应用程序在目录中可用< sdk_root_directory > \ \ target_apps \ misc \ ancs_client项目
.
-
-
在
user_profiles_config.h
: -
如果启用GATT和ANCS客户端
CFG_PRF_GATTC
和CFG_PRF_ANCC
分别定义,-
- 新增了ancs相关配置:
-
ANC_CFG_DROP_PREEXISTING_NTF
默认启用CFG_VERBOSE_LOG
默认禁用
-
在
-
- 以下源文件被添加到项目中:
-
ancc.c
和ancc_task.c
在< sdk_root_directory > \ sdk \ ble_stack \ profiles \ anc \﹐\ src
gatt_client.c
和gatt_client_task.c
在< sdk_root_directory > \ sdk \ ble_stack \ profiles \关贸总协定\ gatt_client \ src
app_ancc.c
和app_ancc_task.c
在< sdk_root_directory > \ sdk \ app_modules \ src \ app_ancc
app_gattc.c
和app_gattc_task.c
在< sdk_root_directory > \ sdk \ app_modules \ src \ app_gattc
请注意
ANCS代表苹果通知中心服务。ANCS仅适用于苹果设备。
4.1.12.安全
要向BLE应用程序添加安全功能,请定义CFG_APP_SECURITY
.支持多种安全方案,包括LE遗留配对、LE安全连接和链路层隐私。
ble_app_security是我们演示安全功能的BLE示例应用程序之一:亚博国际官网平台网址
CFG_APP_SECURITY
定义为da1458x_config_basic.h
以下与安全相关的源文件被添加到项目中:
app_security.c
和app_security_task.c
,两者都在。< sdk_root_directory > \ sdk \ app_modules \ src \ app_sec
可以根据用户的需要在用户级别配置安全功能(有关详细信息,请参阅
user_config.h
文件和部分4.1.12.1和部分4.1.12.2下图)
4.1.12.1.用户级安全配置
BLE安全性可以通过各自的可用选项在用户级别进行配置user_config.h
文件:
设备的I/O能力
带外(OOB)数据支持
身份验证需求
加密密钥大小
最低允许的安全级别(安全要求)
关键分发能力
根据用户的安全配置和对端设备的安全能力,可能会出现以下两种配对方式:
遗留配对- OOB
遗留配对-只是工作
遗留配对- Passkey入口
安全连接-只是工作
安全连接-密码输入
安全连接-数字比较
如果不使用上述方法,则安全功能将被设置为最低安全功能。
与对端设备相关的Bond数据可以存储到外部SPI Flash或I2C EEPROM存储器中:
#定义USER_CFG_APP_BOND_DB_USE_SPI_FLASH
用于SPI Flash(默认)#定义USER_CFG_APP_BOND_DB_USE_I2C_EEPROM
用于I2C EEPROM如果上面两个标志都没有定义,那么绑定数据将只缓存在应用程序RAM中。
#定义USER_CFG_BOND_DB_MAX_BONDED_PEERS
定义数据库中最大绑定数据槽数
user_config.h
还允许选择外围设备的寻址模式和隐私功能USER_CFG_ADDRESS_MODE
使用以下选项之一定义:
APP_CFG_ADDR_PUB
:外围设备是非私有的,使用公共地址操作。虽然它不声明隐私支持,但它可以在其BLE主机层中解析绑定对等体的随机可解析私有地址(RPA)。
设备的公共广播应设置为
CFG_NVDS_TAG_BD_ADDRESS
各自的旗帜da1458x_config_advanced.h
文件。此地址在电源周期内不会改变。
APP_CFG_ADDR_STATIC
:外围设备是非私有的,以RSA (Random Static Address)方式运行。虽然它不声明隐私支持,但它可以在其BLE主机层中解析绑定对等体的RPA。
RSA有三种配置方式:
如果
user_gapm_conf.addr_type
设置为有效的RSA,则将使用此RSA。此地址在电源周期内不会改变。如果
user_gapm_conf.addr_type
是无效的default_app_generate_static_random_addr
连接到app_on_generate_static_random_addr
在各自的user_callback_config.h
文件,然后在每个电源周期生成一个新的RSA。如果
user_gapm_conf.addr_type
是无效的default_app_generate_unique_static_random_addr
连接到app_on_generate_static_random_addr
在各自的user_callback_config.h
文件,则根据存储在OTP头中的信息生成唯一的设备RSA。此地址在电源周期内不会改变。
APP_CFG_HOST_PRIV_RPA
:外围设备是私有设备,使用在其BLE主机层生成的RPA进行操作。绑定对等体的RPA也可以在其BLE主机层进行解析。
身份信息:设备在配对过程中需要交换自己的身份信息。
应设置有效的IRK
user_gapm_conf.irk
和GAP_KDIST_IDKEY
将在USER_CFG_FEAT_RESP_KDIST
.设备将始终发送定义在的公共地址
CFG_NVDS_TAG_BD_ADDRESS
作为身份地址。Renew duration:设置生成新RPA的时间间隔
user_gapm_conf.renew_dur
.该字段控制RPA在重新生成之前的持续时间,以10毫秒为单位进行计数。的最小有效值renew_dur
= 15000(150秒),如果renew_dur
设置为小于15000,则BLE堆栈将自动将该值设置为15000。
APP_CFG_HOST_PRIV_NRPA
:该设备为私有设备,在其BLE主机层生成非rpa。此配置只能在不可连接的模式/过程中使用(例如,广播角色,不可连接的广告)。
APP_CFG_CNTL_PRIV_RPA_PUB
:外围设备为私有设备,使用其BLE控制器层生成的RPA进行操作。当设备与对等体绑定时,对等体的设备信息将存储在位于BLE控制器层的解析列表中。重新连接时,绑定对等体的RPA将在BLE控制器层自动解析,其身份将直接在外围设备的应用层使用。如果外设的解析列表为空(没有绑定设备),那么它将使用公共地址进行操作。
身份信息:设备在配对过程中需要交换自己的身份信息。
应设置有效的IRK
user_gapm_conf.irk
和GAP_KDIST_IDKEY
将在USER_CFG_FEAT_RESP_KDIST
.设备将始终发送定义在的公共地址
CFG_NVDS_TAG_BD_ADDRESS
作为身份地址。Renew duration:设置生成新RPA的时间间隔
user_gapm_conf.renew_dur
.该字段控制RPA在重新生成之前的持续时间,以10毫秒为单位进行计数。的最小有效值renew_dur
= 15000(150秒),如果renew_dur
设置为小于15000,则BLE堆栈将自动设置该值为15000。
APP_CFG_CNTL_PRIV_RPA_RAND
:外围设备为私有设备,使用其BLE控制器层生成的RPA进行操作。当设备与对等体绑定时,对等体的设备信息将存储在位于BLE控制器层的解析列表中。重新连接时,绑定对等体的RPA将在BLE控制器层自动解析,其身份将直接在外围设备的应用层使用。外围设备将使用RPA独立于绑定对等体的存在。
身份信息:设备在配对过程中需要交换自己的身份信息。
应设置有效的IRK
user_gapm_conf.irk
和GAP_KDIST_IDKEY
将在USER_CFG_FEAT_RESP_KDIST
.设备将始终发送定义在的公共地址
CFG_NVDS_TAG_BD_ADDRESS
作为身份地址。Renew duration:设置生成新RPA的时间间隔
user_gapm_conf.renew_dur
.该字段控制RPA在重新生成之前的持续时间,以10毫秒为单位进行计数。的最小有效值renew_dur
= 15000(150秒),如果renew_dur
设置为小于15000,则BLE堆栈将自动将值设置为15000。
控制器隐私模式设置为
USER_CFG_CNTL_PRIV_MODE
并且可以是下列值之一:APP_CFG_CNTL_PRIV_MODE_NETWORK
:外围设备将只接受来自绑定了RPA的对端设备的广告报文。APP_CFG_CNTL_PRIV_MODE_DEVICE
:外围设备将接受来自绑定的对等设备的广告数据包,这些设备既使用RPA地址,也使用非私有地址(Public, Random Static)。
除了上述配置之外,还可以在用户级别通过user_callback_config.h
,以便处理某些与安全相关的事件或操作,如下面的部分所述。
4.1.12.2.安全事件处理
在蓝牙低功耗应用程序的生命周期中可能会发生几个事件,需要以特定的方式处理这些事件。应用程序负责选择它应该处理哪些事件和操作,哪些应该留给默认SDK行为来处理。
SDK使用一种机制,为定义系统行为的每个事件或操作注册回调。C头文件user_callback_config.h
,它是用户应用程序的一部分,包含回调函数的注册。
在ble_app_security,提供了以下与安全相关的回调函数(派生自各自的user_callback_config.h
文件):
#如果(BLE_APP_SEC).app_on_pairing_request=default_app_on_pairing_request,.app_on_tk_exch=user_app_on_tk_exch,.app_on_irk_exch=零,.app_on_csrk_exch=default_app_on_csrk_exch,.app_on_ltk_exch=default_app_on_ltk_exch,.app_on_pairing_succeeded=default_app_on_pairing_succeeded,.app_on_encrypt_ind=零,.app_on_encrypt_req_ind=default_app_on_encrypt_req_ind,.app_on_security_req_ind=零,.app_on_addr_solved_ind=default_app_on_addr_solved_ind,.app_on_addr_resolve_failed=default_app_on_addr_resolve_failed,.app_on_ral_cmp_evt=default_app_on_ral_cmp_evt,.app_on_ral_size_ind=零,.app_on_ral_addr_ind=零,# endif/ / (BLE_APP_SEC)
请注意
上述回调函数将被有条件地调用,例如BLE_APP_SEC
设置为1(何时自动完成CFG_APP_SECURITY
定义为da1458x_config_basic.h
)。
请注意
项目的默认配置使用UART在Passkey Entry和Numeric Comparison配对方法的情况下显示临时密钥:
然而,如果
CFG_PRINTF
未定义或default_app_on_tk_exch
则Passkey的默认值为“123456”。在数值比较的每种情况下,确认值将被自动接受,因为在特定示例中没有实现键盘或Yes/No按钮。
在安全连接的情况下,LTK也将以UART打印,以便它可以与调试/嗅探工具一起使用。
当对端设备使用需要外设解析的可解析私有地址时,则app_easy_security_resolve_bdaddr ()
可以叫。app_easy_security_resolve_bdaddr ()
发送存储在BLE栈中的IRK,试图找到能解析对等体BD地址的IRK。如果地址解析成功,那么主机应用程序将收到一个.app_on_addr_solved_ind
事件。如果操作失败,则单击“下一步”.app_on_addr_resolve_failed
事件将被接收。
bond数据库的特定事件通过以下回调函数处理:
静态常量结构体app_bond_db_callbacksuser_app_bond_db_callbacks={.app_bdb_init=default_app_bdb_init,.app_bdb_get_size=default_app_bdb_get_size,.app_bdb_add_entry=default_app_bdb_add_entry,.app_bdb_remove_entry=零,.app_bdb_search_entry=default_app_bdb_search_entry,.app_bdb_get_stored_irks=default_app_bdb_get_stored_irks,};
上述结构定义了某个事件将由默认处理程序或用户定义的处理程序处理,或者根本不处理(NULL项)。缺省情况下,bond数据库实现在app_bond_db.c
.但是,绑定数据库的用户实现可以与上面的回调表挂钩。债券数据库的默认实现:
默认为5个绑定数据槽。
在每个有效的插槽中,根据绑定过程,绑定数据库存储密钥(ltk -包括EDIV和RandNB,远程IRK -包括对等体的身份,csrk),对等体的BD地址和一组标志。
当为对等设备添加绑定数据时,存储绑定数据的算法会检查绑定DB中是否存在该对等设备的旧条目。如果是,则更新旧表项,否则使用空槽位。如果数据库中没有空槽,则替换添加时间最早的槽。
已知对端设备的Bond数据可以使用不同类型(按槽位、按EDIV、按BD地址、按IRK等)进行搜索和/或删除。
app_bdb_get_stored_irks
可用于获取数据库中存储的所有irk。当对等端有一个随机的私有可解析地址需要解析时,这是有用的。
代码流ble_app_security对于用户的应用程序显示在图33和图34:
4.1.13.支持外设模式的白名单
此特性通过允许应用程序在运行时将设备添加到白名单中,从而在链路层隐私方面提供有限的功能外围
的角色。方便设备只允许被列入白名单的对端(远端)设备连接。当对端(远端)设备使用“公网地址”、“静态随机地址”和“可解析私有设备地址”时,该特性有效。SDK提供了管理白名单的API:
-
-
app_easy_whitelist.c
,保存API函数,该函数可由 -
用户在其应用程序中,以管理白名单。
-
的代码片段app_easy_whitelist.h
显示了白名单特性支持的操作:
///白名单操作类型类型定义枚举{///获取白名单大小。APP_WLIST_OP_GET_SIZE=GAPM_GET_WLIST_SIZE,///添加白名单设备。APP_WLIST_OP_ADD_DEV=GAPM_ADD_DEV_IN_WLIST,///从白名单中删除设备。APP_WLIST_OP_RMV_DEV=GAPM_RMV_DEV_FRM_WLIST,///清除白名单中所有设备。APP_WLIST_OP_CLEAR=GAPM_CLEAR_WLIST,}app_wlist_op_t;
请注意
有关白名单API的详细信息可以在API文档中找到。
4.1.13.1.如何使用白名单作为外设
的ADV_ALLOW_SCAN_ANY_CON_WLST
时必须选择广告策略外围
设备需要使用while列表。使用所选策略外围
设备只允许来自白名单对端设备的连接请求。
///广告过滤策略:/// - ADV_ALLOW_SCAN_ANY_CON_ANY:允许任何人的扫描和连接请求/// - ADV_ALLOW_SCAN_ANY_CON_WLST:允许扫描请求和连接请求///仅限白名单设备.adv_filt_policy=ADV_ALLOW_SCAN_ANY_CON_WLST,
该API支持以下白名单管理操作:
- 将对端设备地址加入“白名单”
app_easy_manage_wlist(APP_WLIST_OP_ADD_DEV,结构体bd_addraddr,app_wlist_addr_t类型)
- 从“白名单”中移除对端设备地址
app_easy_manage_wlist(APP_WLIST_OP_RMV_DEV,结构体bd_addraddr,app_wlist_addr_t类型)
- 清除“白名单”中所有对端设备地址
app_easy_manage_wlist(APP_WLIST_OP_CLEAR,结构体bd_addraddr,app_wlist_addr_t类型)
- 获取白名单大小
app_easy_manage_wlist(APP_WLIST_OP_GET_SIZE,结构体bd_addraddr,app_wlist_addr_t类型)
请注意
对端地址的类型必须为public或random。
///白名单地址类型类型定义枚举{///公共地址APP_WLIST_ADDR_PUBLIC=ADDR_PUBLIC,///随机地址APP_WLIST_ADDR_RANDOM=ADDR_RAND,}app_wlist_addr_t;
请注意
上述白名单管理操作的GAPM Command Complete事件消息在SDK的应用层不处理。它们可以在用户应用程序级别使用catch rest机制进行处理(参见4.1.6节如欲进一步了解user_catch_rest_hndl ()
)。
4.2.系统功能
4.2.1.蓝牙硬件配置
蓝牙协议栈的基本层是:
以上各层由SDK在3种不同的硬件设置中实现:
集成处理器
外部处理器
人机交互
描述了3种不同的硬件配置图35.
请注意
的GTL是通过串行接口(如UART、SPI、I2C)进行应用-主机通信的专有接口。
以下SDK BLE示例运行在集成处理器硬件配置:
ble_app_barebone
ble_app_profile
ble_app_peripheral
ble_app_security
ble_app_sleepmode
ble_app_ota
ble_app_all_in_one
prox_reporter
ble_app_noncon
aes
ancs_client
empty_peripheral_template
以下SDK BLE示例运行在外部处理器硬件配置:
prox_monitor_ext
prox_reporter_ext
empty_template_ext
以下SDK BLE示例运行在人机交互硬件配置:
人机交互
prod_test
4.2.2.睡眠模式
4.2.2.1.DA14585 / DA14586
支持以下睡眠模式:
唤醒时没有OTP副本的延长睡眠:应用程序代码和数据存储在RAM中。唤醒后没有OTP镜像,也没有从SPI / I2C / UART启动。
包含代码的RAM块将被保留。
包含保留数据的RAM块将被保留。
RAM块4总是被保留(它保存各种ROM数据变量)。
延长睡眠时间,唤醒时使用OTP副本:应用程序代码存储在OTP中。唤醒后,将进行OTP镜像。
包含代码的RAM块将不被保留。
包含保留数据的RAM块将被保留。
RAM块4总是被保留(它保存各种ROM数据变量)。
请注意
SDK假设代码由RO代码和数据加上非零初始化的RW数据组成。以以下摘自Keil项目地图文件的摘录为例:
……0x07fc4230 0x07fc4230 0x00000008数据RO 2778 .constdata app_diss_task。o 0x07fc4238 0x07fc4238 0x00000110数据RO 2869 .constdata da14585_586.lib(patch.o) 0x07fc4348 0x07fc4348 0x00000016数据RO 2893 .constdata da14585_586.lib(pll_vcocal_lut.o) 0x07fc435e 0x07fc435e 0x00000002 PAD 0x07fc4360 0x07fc4360 0x00000030数据RO 2930区域$$表编号$$obj.o0x07fc4390 0x07fc4390 0x00000004 Data RW 650 .data arch_system.o执行区域ER_PRODTEST (Exec base: 0x07fc4398, Load base: 0x07fc4394, Size: 0x00000000, Max: 0xffffffff, ABSOLUTE, UNINIT) ****没有分配给该执行区域的区段****执行区域ER_ZI (Exec base: 0x07fc4398, Load base: 0x07fc4394, Size: 0x00000648, Max: 0xffffffff, ABSOLUTE) Exec Addr Load Addr Size类型Attr Idx E section名称对象0x07fc4398 - 0x00000030 0 RW 1510 .bss i2c。阿……
的0 x07fc4390地址,它保存32位RW非零初始化数据,被认为是计算代码大小的一部分,由SDK计算。
请注意
可以自定义默认的休眠模式。在其他选项中,可以设置以下选项之一(参见app_default_sleep_mode在user_config.h):
ARCH_SLEEP_OFF:不睡觉
ARCH_EXT_SLEEP_ON:延长睡眠时间,起床时不带OTP副本
ARCH_EXT_SLEEP_OTP_COPY_ON:延长睡眠时间,并在醒来时提供OTP副本
举个例子,inble_app_sleepmode在广告状态下,系统进入延长睡眠状态,唤醒OTP副本。当处于连接状态时,在唤醒时进入无OTP复制的延长睡眠状态。
当系统处于连接状态或广告状态时,系统将从BLE定时器同步唤醒。
系统可能从配置为使用唤醒定时器的GPIO异步唤醒。异步唤醒仅在广告在预定义时间(例如30秒)后停止时启用。
深度睡眠:通常,不保留任何内容(所有RAM块都关闭电源)。系统从唤醒定时器(GPIO)或Power-On-Reset源唤醒,并调用引导代码。无法维持BLE连接。
参考prox_reporter作为一个例子,系统可以进入深度睡眠,简单地定义
CFG_APP_GOTO_DEEP_SLEEP
并从唤醒定时器(GPIO)或从Power-On-Reset引脚异步唤醒(参见user_proxr.h
详情)。
请注意
在进入休眠(上述任何一种模式)之前,系统时钟转换为低功耗时钟,其类型由用户通过CFG_LP_CLK定义(外部XTAL32K振荡器;内部RCX振荡器)。
4.2.2.2.DA14531
支持以下睡眠模式:
唤醒时没有OTP副本的延长睡眠:应用程序代码和数据存储在RAM中。唤醒后没有OTP镜像,也没有从SPI / I2C / UART启动。
包含代码的RAM块将被保留
包含保留数据的RAM块将被保留
RAM块3始终保留(它保存ROM数据变量)
延长睡眠时间,唤醒时使用OTP副本:应用程序代码存储在OTP中。唤醒后,OTP镜像发生。
包含代码的RAM块将不会被保留
包含保留数据的RAM块将被保留
RAM块3始终保留(它保存ROM数据变量)
请注意
可以自定义默认的休眠模式。其中,可以设置以下选项(参见app_default_sleep_mode在user_config.h):
ARCH_SLEEP_OFF:不睡觉
ARCH_EXT_SLEEP_ON:延长睡眠时间,起床时不带OTP副本
ARCH_EXT_SLEEP_OTP_COPY_ON:延长睡眠时间,并在醒来时提供OTP副本
举个例子,inble_app_sleepmode在广告状态下,系统进入延长睡眠状态,唤醒OTP副本。当系统处于连接状态时,唤醒时系统进入无OTP拷贝的延长睡眠状态。
当系统处于连接状态或广告状态时,系统将从BLE定时器同步唤醒。
如果配置为使用唤醒定时器,系统将从GPIO异步唤醒。异步唤醒仅在广告在预定义时间(例如30秒)后停止时启用。
深度睡眠:通常,不保留任何内容(所有RAM块都关闭电源)。系统从唤醒定时器(GPIO)或Power-On-Reset源唤醒,并调用引导代码。无法维持BLE连接。
关于prox_reporter作为一个例子,系统可以进入深度睡眠,简单地定义
CFG_APP_GOTO_DEEP_SLEEP
并从唤醒定时器(GPIO)、Power-On-Reset引脚、RTC报警或Timer1异步唤醒user_proxr.h
详情)。
请注意
在进入睡眠(上述任何一种模式)之前,系统时钟将切换为低功耗时钟,其类型由用户通过CFG_LP_CLK定义(外部XTAL32K振荡器;内部RCX振荡器)。
休眠:通常,不保留任何内容(所有RAM块都关闭电源)。应该注意的是,在休眠模式下没有可用的时钟。系统可能从以下GPIO引脚之一唤醒:
P0_1
P0_2
P0_3
P0_4
P0_5
在…的背景下prox_reporter,系统可以进入休眠模式,只需定义
CFG_APP_GOTO_HIBERNATION
(见user_proxr.h
详细信息)-系统将从P0_3唤醒(在用户级别可配置-参见user_periph_setup.h
详情)。
请注意
如果选择SysRAM1在地址0处重新映射,以便在从休眠状态唤醒后执行,则将保留SysRAM1。类似地,如果选择SysRAM3重新映射到地址0,以便在从休眠唤醒后执行,则将保留SysRAM3。
有状态休眠:RAM块应根据应用程序内存布局保留,例如,使用默认链接器脚本,RAM1和RAM3块应始终保留,RAM2块仅在保存状态代码和/或数据时保留。与上述休眠模式类似,系统可能从以下GPIO引脚之一唤醒:
P0_1
P0_2
P0_3
P0_4
P0_5
在…的背景下prox_reporter,系统可能进入有状态休眠(保留所有三个RAM块),通过定义
CFG_APP_GOTO_STATEFUL_HIBERNATION
(见user_proxr.h
详情)以及CFG_STATEFUL_HIBERNATION
(在项目设置中-请参阅3.2.5节详细信息)-系统将从P0_3唤醒(在用户级别可配置-参见user_periph_setup.h
详情)。
请注意
如果选择SysRAM1在地址0处重新映射,以便在从有状态休眠唤醒后执行,则将保留SysRAM1。如果SysRAM3被选择重新映射到地址0,以便在从有状态休眠唤醒后执行,则应该保留SysRAM3。
请注意
目前,有状态休眠只能与集成处理器硬件配置结合使用。此外,当设备与对端设备连接时(因为无法维持BLE连接)和/或存在预先安排的BLE或定时器事件时,不应调用允许设备进入状态休眠的API函数。
4.2.3.数据记录
可以通过UART接口记录数据以进行调试(通过调用arch_console.h
API,根据需要)。在我们的BLE示例应用程序的上下文中,可以通过定义启用数据记录亚博国际官网平台网址CFG_PRINTF
在各自的da1458x_config_basic.h
文件。此外,如果要将UART2用于数据记录,CFG_PRINTF_UART2
也应定义。
4.2.4.真随机数生成(TRNG)
随机数生成是可能的,利用以下方法之一:
C标准库随机函数,
stdlib \ rand.c
模块,或第三方ChaCha20模块
如果CFG_USE_CHACHA20_RAND
标志中定义da1458x_config_advanced.h
文件中,将使用ChaCha20模块。否则C标准库将生成任意随机数。
为了提高随机性,可以额外使用TRNG特征——随机种子生成的随机数随后将用于初始化要使用的上述两个随机数生成器中的任何一个。为此,CFG_TRNG
应在各自的da1458x_config_advanced.h
文件。
4.2.4.1.TRNG在DA14585/586
随机种子数字是通过从DA14585/586无线电模块捕获数据生成的。每次system_init ()
函数被调用时,将生成一个新的随机数种子。DA14585/586 TRNG机制在RAM中最多分配1024字节。用户可以减小这个缓冲区的大小。
请注意
CFG_TRNG
启用TRNG机制并选择TRNG缓冲区大小。需要注意的是,TRNG缓冲区大小和系统启动延迟之间存在权衡。随着缓冲区大小的增加,代码大小也会增加,而系统启动延迟会减少。另一方面,较小的缓冲区大小对系统启动延迟有负面影响,但会产生较小的代码大小。
4.2.4.2.TRNG在DA14531
随机种子从从RAM缓冲区的上电噪声中获取的熵中提取数字。每次设备上电,可以从至少448字节的未初始化RAM缓冲区生成单个全熵128位种子。
由于未初始化的RAM缓冲区始终驻留在RAM3块中,因此每次RAM3块关闭时都会触发TRNG机制。
一个简单的32位变量检查(trng_state_val
)用于定义RAM3块以前是否关闭。的trng_state_val
与一个神奇的32位值相比,0 x12348765
.如果没有匹配,则认为RAM3块包含未初始化的数据,并且可以运行TRNG机制。否则,不触发。一旦TRNG成功运行,种子号将被提供给C标准库随机函数或ChaCha20各自的函数。上述随机生成器的两种状态都保存在保留内存区域中,因此不需要每次都重新触发TRNG机制system_init ()
函数正在被调用。
请注意
简单地定义CFG_TRNG
足以启用TRNG机制。
请注意
的
trng_state_val
变量总是驻留在RAM3块中。虽然它的启动值被认为是随机的,不等于神奇的32位值,但这种情况发生的可能性很低。的
trng_state_val
变量已被放置故意在一个固定的内存地址中免费的区域
在ROM数据起始地址之前,0 x07fcb900
.
4.2.5.数据加密和解密
使用驻留的Crypto API可以实现基于aes的数据加密/解密< sdk_root_directory > \ sdk \ \ core_modules \加密平台
.Crypto API使用AES-128加密硬件块来加速执行AES加密所需的计算——对于解密,则应用基于sw的算法。应该注意的是,在BLE连接正在进行时可能会使用Crypto API。
我们的AES示例应用程序,在< sdk_root_directory > \ \ target_apps \ misc \ aes的项目
,展示了如何将Crypto API用于用户级的数据加密/解密。
最后但并非最不重要的是,知道以下AES变体是在SDK上下文中实现的:
AES-CBC
AES-CCM
AES-CMAC
4.2.6.用户数据存储
用户级的数据可以用外部存储设备存储,SPI Flash或I2C EEPROM。被认为要存储的数据类型包括但不限于bond数据(对于BLE安全应用程序)和软件映像(对于SUOTA应用程序)。我们支持前者,并在此背景下表明这一点ble_app_security示例应用程序,后者也支持并显示在上下文中ble_app_ota.
在用户级别,可以指示SPI Flash或I2C EEPROM是否用于数据存储目的。中提供正确的定义da1458x_config_basic.h
文件:
#定义CFG_SPI_FLASH_ENABLE
用于SPI Flash#定义CFG_I2C_EEPROM_ENABLE
用于I2C EEPROM
4.2.7.组织的记忆
4.2.7.1.DA14585 / DA14586
DA14585/DA14586具有以下内存块:
ROM: 128kb的ROM包含了BLE协议栈和引导码序列
OTP:一个64 kb的OTP内存,用于存储应用程序代码以及蓝牙低功耗配置文件。它还包含系统配置和校准数据。在上电/复位时,主引导代码(primary boot code, ROM)检查OTP是否被编程。如果是这种情况,OTP内容将被镜像到System RAM
系统RAM:四个RAM块,总共32 KB + 16 KB + 16 KB + 32 KB = 96 KB,用于在系统上电时镜像来自OTP或外部闪存的程序代码,以及在系统进入长时间睡眠之前根据需要保留数据。数据保留功能可以保证系统唤醒后安全、快速地配置BLE Core。当使用扩展睡眠模式时,每个单元都可以根据用户自己的应用需要打开/关闭电源,以保留数据。
4.2.7.2.DA14531
DA14531具有以下内存块:
ROM:一个144kb的ROM包含BLE协议栈、引导代码序列和一些已经转移到ROM空间的通用SDK代码4.2.11节详情),
OTP:一个32kb的OTP内存,用于存储应用程序代码以及蓝牙低功耗配置文件。它还包含系统配置和校准数据。在上电/复位时,主引导代码(primary boot code, ROM)检查OTP是否被编程。如果是这种情况,OTP内容将被镜像到System RAM
系统RAM:三个RAM块,共16kb + 12kb + 20kb = 48kb,用于在系统上电时镜像来自OTP或外部闪存的程序代码,以及在系统进入长时间睡眠之前保留所需的数据。数据保留功能可以保证系统唤醒后安全、快速地配置BLE Core。当使用延长睡眠模式时,每个单元都可以根据用户自己的应用程序需要在数据保留方面打开/关闭电源。
4.2.7.3.链接器文件包含在SDK中
需要一个脚本文件来指示链接器根据需要放置代码和数据。在ARM Keil工具链上下文中,这样的文件通常被称为散射文件。SDK包括DA14585/DA14586和DA14531的链接器文件,位于< sdk_root_directory > \ sdk \ common_project_files
.
SDK BLE示例应用程序使用前面提到的亚博国际官网平台网址默认链接器文件。当使用默认的链接器文件时,在过程中保留的RAM块的选择延长睡眠是自动完成的。
可以使用自定义链接器文件。要保留的RAM块的选择必须在用户级别完成。
在各自的da1458x_config_advanced.h
文件,CFG_CUSTOM_SCATTER_FILE
必须定义以保留RAM块。
请注意
DA14585/DA14586情况:第4个RAM块(最后一个RAM块)必须始终处于ON状态延长睡眠.最后一个RAM块包含ROM数据变量和与BLE控制器共享的内存部分。
请注意
DA14531的情况下:第3个RAM块(最后一个RAM块)必须始终打开延长睡眠.最后一个RAM块包含ROM数据变量和与BLE控制器共享的RAM部分。
4.2.8.系统事件/状态回调
我们的BLE示例应用程序以结构的亚博国际官网平台网址形式公开了许多回调函数(参见user_app_main_loop_callbacks
结构定义中各自的user_callback_config.h
文件)。这样的函数可以在主循环中调用,以便处理系统层面的某些事件。
目前提供的回调总结如下表:
# |
函数名 |
描述 |
时间限制 |
---|---|---|---|
1 |
app_on_init () |
在系统启动时调用。与应用程序初始化相关的应用程序任务可以在这里调用。 |
没有一个 |
2 |
app_on_ble_powered () |
BLE核心激活时调用。通常用于向在app_on_system_powered()中处理过的异步事件生成的内核任务发送消息。 注意:缺省情况下,系统唤醒时重新加载看门狗定时器并恢复。考虑看门狗定时器处理(保持运行、冻结、重新加载、恢复等)。 |
媒介 |
3. |
app_on_system_powered () |
如果系统域打开(处理器处于活动状态),而BLE核心可以处于睡眠模式,则调用。通常用于在用户级别处理异步事件。相应的isr应尽可能短,任何剩余的处理应在此时进行。注意:缺省情况下,系统唤醒时重新加载看门狗定时器并恢复。考虑看门狗定时器处理(保持运行、冻结、重新加载、恢复等)。 |
媒介 |
4 |
app_before_sleep () |
用于根据睡眠检查开始前的最新状态更新应用程序的状态。 |
媒介 |
5 |
app_validate_sleep () |
用于根据当前应用程序状态潜在地取消进入扩展睡眠模式(带或不带OTP复制)。BLE和Radio仍然断电,但其他部分的电源域保持活跃。 |
硬 |
6 |
app_going_to_sleep () |
在进入低功耗模式之前用于特定于应用程序的任务。 |
硬 |
7 |
app_resume_from_sleep () |
用于从低功耗模式退出后立即执行特定于应用程序的任务。 |
硬 |
4.2.9.处理器异常和中断请求
4.2.9.1.DA14585 / DA14586
支持以下处理器异常和中断请求(详细信息请参见da14585_586.h
以及相应的数据表):
NonMaskableInt_IRQn
HardFault_IRQn
SVCall_IRQn
PendSV_IRQn
SysTick_IRQn
BLE_WAKEUP_LP_IRQn
BLE_GEN_IRQn
UART_IRQn
UART2_IRQn
I2C_IRQn
SPI_IRQn
ADC_IRQn
KEYBRD_IRQn
BLE_RF_DIAG_IRQn
RFCAL_IRQn
GPIO0_IRQn
GPIO1_IRQn
GPIO2_IRQn
GPIO3_IRQn
GPIO4_IRQn
SWTIM_IRQn
WKUP_QUADEC_IRQn
PCM_IRQn
SRC_IN_IRQn
SRC_OUT_IRQn
DMA_IRQn
RESERVED21_IRQn
RESERVED22_IRQn
RESERVED23_IRQn
4.2.9.2.DA14531
支持以下处理器异常和中断请求(详细信息请参见da14531.h
以及相应的数据表):
NonMaskableInt_IRQn
HardFault_IRQn
SVCall_IRQn
PendSV_IRQn
SysTick_IRQn
BLE_WAKEUP_LP_IRQn
BLE_GEN_IRQn
UART_IRQn
UART2_IRQn
I2C_IRQn
SPI_IRQn
ADC_IRQn
KEYBRD_IRQn
BLE_RF_DIAG_IRQn
RF_CAL_IRQn
GPIO0_IRQn
GPIO1_IRQn
GPIO2_IRQn
GPIO3_IRQn
GPIO4_IRQn
SWTIM_IRQn
WKUP_QUADEC_IRQn
SWTIM1_IRQn
RTC_IRQn
DMA_IRQn
XTAL32M_RDY_IRQn
RESERVED21_IRQn
RESERVED22_IRQn
RESERVED23_IRQn
4.2.10.nvd
NVDS (Non-Volatile Data Storage)用于保存蓝牙设备地址等系统配置信息。
结构体nvds_data_struct{uint16_tlpclk_drift;//低功耗时钟计费uint8_tbd_address[6];//设备蓝牙地址uint16_tble_ca_timer_dur;//默认信道评估定时器持续时间uint8_tble_cra_timer_dur;//默认信道重估定时器持续时间uint8_tble_ca_min_rssi;//默认最小RSSI阈值uint8_tble_ca_nb_pkt;//默认接收的统计包数uint8_tble_ca_nb_bad_pkt;//移除通道所需的缺省坏包数};
的代码片段da1458x_config_advanced.h
的ble_app_barebone示例应用程序显示了NVDS结构体的值:
/****************************************************************************************************************//* NVDS配置*//* - CFG_NVDS_TAG_BD_ADDRESS默认bdaddress。如果bdaddress写在OTP报头中,这个*//*值被忽略*//* - CFG_NVDS_TAG_LPCLK_DRIFT低功耗时钟漂移。ppm的允许值为:*//* + drift_20ppm *//* + drift_30ppm *//* + drift_50ppm *//* + drift_75ppm *//* + drift_100ppm *//* + drift_150ppm *//* + drift_250ppm *//* + DRIFT_500PPM默认值(500ppm) *//* - CFG_NVDS_TAG_BLE_CA_TIMER_DUR信道评估定时器持续时间(10ms的倍数)*//* - CFG_NVDS_TAG_BLE_CRA_TIMER_DUR通道重评估定时器时间(CA定时器时间的倍数)*//* - CFG_NVDS_TAG_BLE_CA_MIN_RSSI最小RSSI阈值*//* - CFG_NVDS_TAG_BLE_CA_NB_PKT统计接收报文数*//* - CFG_NVDS_TAG_BLE_CA_NB_BAD_PKT删除一个通道所需的坏报文数*//****************************************************************************************************************/#define CFG_NVDS_TAG_BD_ADDRESS {0x02, 0x00, 0x00, 0xCA, 0xEA, 0x80}#定义CFG_NVDS_TAG_LPCLK_DRIFT漂移_500ppm#定义CFG_NVDS_TAG_BLE_CA_TIMER_DUR 2000#定义CFG_NVDS_TAG_BLE_CRA_TIMER_DUR#定义CFG_NVDS_TAG_BLE_CA_MIN_RSSI 0x40#define CFG_NVDS_TAG_BLE_CA_NB_PKT 100#define CFG_NVDS_TAG_BLE_CA_NB_BAD_PKT
4.2.11.ROM空间中的SDK模块(仅适用于DA14531)
多个SDK模块已经从SDK转移到DA14531ROM以节省RAM空间。如果用户做以下修改,这些模块可以在SDK空间中重新定义:
全局定义
__EXCLUDE_ROM_ * __
标记,以便在项目构建中包含SDK定义的模块。注释掉相应的ROM符号。
下面的列表包含了已经转移到ROM空间的SDK模块:
- arch_console.c
-
该模块默认放置在ROM空间中。它可以重新传输到RAM空间,如果标志
__EXCLUDE_ROM_ARCH_CONSOLE__
定义和各自的da14531_symbols.txtROM符号被注释掉。 - nvds.c
-
该模块默认放置在ROM空间中。它可以重新传输到RAM空间,如果标志
__EXCLUDE_ROM_NVDS__
定义和各自的da14531_symbols.txtROM符号被注释掉。 - chacha20.c
-
该模块默认放置在ROM空间中。它可以重新传输到RAM空间,如果标志
__EXCLUDE_ROM_CHACHA20__
定义和各自的da14531_symbols.txtROM符号被注释掉。 - prf.c
-
这个模块默认放在ROM空间中。它可以重新传输到RAM空间,如果标志
__EXCLUDE_ROM_PRF__
定义和各自的da14531_symbols.txtROM符号被注释掉。 - prf_utils.c
-
这个模块默认放在ROM空间中。它可以重新传输到RAM空间,如果标志
__EXCLUDE_ROM_PRF_UTILS__
定义和各自的da14531_symbols.txtROM符号被注释掉。 - diss_task.c
-
这两个模块默认放在ROM空间中。他们可以重新转移到RAM空间,如果标志
__EXCLUDE_ROM_DISS__
定义和各自的da14531_symbols.txtROM符号被注释掉。 - - bass_task.c
-
这两个模块默认放在ROM空间中。他们可以重新转移到RAM空间,如果标志
__EXCLUDE_ROM_BASS__
定义和各自的da14531_symbols.txtROM符号被注释掉。 - suotar_task.c
-
这两个模块默认放在ROM空间中。他们可以重新转移到RAM空间,如果标志
__EXCLUDE_ROM_SUOTAR__
定义和各自的da14531_symbols.txtROM符号被注释掉。 - custom_common.c
-
该模块默认放置在ROM空间中。它可以重新传输到RAM空间,如果标志
__EXCLUDE_ROM_CUSTOM_COMMON__
定义和各自的da14531_symbols.txtROM符号被注释掉。 - Custs1.c和custs1. task.c
-
这两个模块默认放在ROM空间中。他们可以重新转移到RAM空间,如果标志
__EXCLUDE_ROM_CUSTS1__
定义和各自的da14531_symbols.txtROM符号被注释掉。 - attm_db_128.c
-
该模块默认放置在ROM空间中。它可以重新传输到RAM空间,如果标志
__EXCLUDE_ROM_ATTM_DB_128__
定义和各自的da14531_symbols.txtROM符号被注释掉。 - app_task.c和app_entry_point.c
-
这3个模块默认放在ROM空间中。他们可以重新转移到RAM空间,如果标志
__EXCLUDE_ROM_APP_TASK__
定义和各自的da14531_symbols.txtROM符号被注释掉。 - app_utils.c
-
这个模块默认放在ROM空间中。它可以重新传输到RAM空间,如果标志
__EXCLUDE_ROM_APP_UTILS__
定义和各自的da14531_symbols.txtROM符号被注释掉。
除上述SDK代码/数据已转移到ROM外,还转移了以下项目:
;手臂图书馆的东西0 x07f233f3T__aeabi_ldivmod0 x07f2343fT__aeabi_llsr0 x07f2343fT_ll_ushift_r0 x07f23461T__aeabi_uldivmod
;一些SDK数据;(控制通过__EXCLUDE_ROM_APP_TASK__)0 x07f23ee0Dapp_gap_process_handlers;(控制通过__EXCLUDE_ROM_GAP_CFG_DATA__)0 x07f23f60Dgap_cfg_user_var_struct
警告
如果prf.c被排除在ROM空间之外,那么diss.c,bass.c和suotar.c如果应用程序使用各自的BLE配置文件,则必须从ROM中排除。
请注意
建议在项目构建中排除/包括任何上述ROM后,使项目干净。
4.2.12.动态无线电TX功率控制(仅适用于DA14531)
DA14531可以在运行时调整无线电发射输出功率。例如,在BLE应用环境中,广告期间可能需要全功率,但是,一旦DA14531连接到对等设备,功率可以设置为较低的值,旨在减少电流/功耗。一旦DA14531与对端设备断开连接,无线电发射输出功率可能会恢复到初始值。
为了实现前面提到的用例,CFG_ENHANCED_TX_PWR_CTRL
应在项目(C/ c++)设置中定义,如图36.
然后,使用rf_pa_pwr_adv_set()和rf_pa_pwr_conn_set() API函数—参见详细信息rf_531.h
,居住在< sdk_root_directory > \ sdk \ \ core_modules \射频\ api的平台
-应相应地调用。