添加用户代码
开发者需要根据自己的需求,修改ble_app_example中相应的代码。
修改主函数
以下为典型的main.c文件的内容。
/**@brief Stack global variables for Bluetooth protocol stack. */
STACK_HEAP_INIT(heaps_table);
…
int main (void)
{
/** Initialize user peripherals. */
app_periph_init();
/** Initialize BLE Stack. */
ble_stack_init(&&m_app_ble_callback, &heaps_table);
// Main Loop
while (1)
{
/*
* Add Application code here, e.g. GUI Update.
*/
app_log_flush();
pwr_mgmt_schedule();
}
}
- STACK_HEAP_INIT(heaps_table)定义四个全局数组,供BLE协议栈作为Heap使用。开发者不可修改此定义,否则BLE协议栈无法正常运行。关于Heap的大小,参考配置custom_config.h与ble_basic_config.h的CFG_MAX_CONNECTIONS。
- 开发者可以在app_periph_init()中初始化外设。在开发调试阶段,该函数中的SYS_SET_BD_ADDR可用于设置临时的Public Address。该函数所在的user_periph_setup.c包含以下主要代码:
/**@brief Bluetooth device address. */
static const uint8_t s_bd_addr[SYS_BD_ADDR_LEN] = {0x11, 0x11, 0x11, 0x11,0x11, 0x11};
…
void app_periph_init(void)
{
SYS_SET_BD_ADDR(s_bd_addr);
bsp_log_init();
pwr_mgmt_mode_set(PMR_MGMT_SLEEP_MODE);
}
- 开发者应该在while(1) { }中添加Application的Main Loop代码,比如处理外部输入、更新GUI。
- 如果开发者使用App Log模块,则需要在Main Loop中调用app_log_flush()。这可以保证在系统进入Sleep状态之前,Logs被完整输出。关于App Log模块使用,参考输出调试Log。
- 需调用pwr_mgmt_shcedule()以实现自动功耗管理,降低系统功耗。
实现BLE业务逻辑
Application的BLE相关业务逻辑是通过GR5526 SDK中定义的若干BLE Events来驱动的。Application需要实现相应的BLE Event Handler,以获得BLE Stack的运行结果或者状态改变通知。由于BLE Event Handler是在BLE SDK IRQ的中断上下文(Interrupt Context)中被调用的,因此开发者不能在handler中执行比较耗时的操作,比如阻塞式函数调用、无限循环等;否则,将阻塞整个系统运行,导致BLE Stack和SDK BLE模块无法按照正常的时序运行。
BLE Events按照Common、GAP Management 、GAP Connection Control、Security Manager、L2CAP、GATT Common、GATT Server和GATT Client来分类,下表列出GR5526 SDK支持的所有BLE Events。
Event Type | Event | Note |
---|---|---|
Common | BLE_COMMON_EVT_STACK_INIT | BLE Stack init complete event. |
GAP Management |
BLE_GAPM_EVT_CH_MAP_SET | Channel Map Set complete event. |
BLE_GAPM_EVT_WHITELIST_SET | Whitelist Set complete event. | |
BLE_GAPM_EVT_PER_ADV_LIST_SET | Periodic Advertising List Set complete event. | |
BLE_GAPM_EVT_PRIVACY_MODE_SET | Privacy Mode for Peer Device Set complete event. | |
BLE_GAPM_EVT_LEPSM_REGISTER | LEPSM Register complete event. | |
BLE_GAPM_EVT_LEPSM_UNREGISTER | LEPSM Unregister complete event. | |
BLE_GAPM_EVT_DEV_INFO_GOT | Device Info Get event. | |
BLE_GAPM_EVT_ADV_START | Advertising Start complete event. | |
BLE_GAPM_EVT_ADV_STOP | Advertising Stop complete event. | |
BLE_GAPM_EVT_SCAN_REQUEST | Scan Request event. | |
BLE_GAPM_EVT_ADV_DATA_UPDATE | Advertising Data update event. | |
BLE_GAPM_EVT_SCAN_START | Scan Start complete event. | |
BLE_GAPM_EVT_SCAN_STOP | Scan Stop complete event. | |
BLE_GAPM_EVT_ADV_REPORT | Advertising Report event. | |
BLE_GAPM_EVT_SYNC_ESTABLISH | Periodic Advertising Synchronization Establish event. | |
BLE_GAPM_EVT_SYNC_STOP | Periodic Advertising Synchronization Stop event. | |
BLE_GAPM_EVT_SYNC_LOST | Periodic Advertising Synchronization Lost event. | |
BLE_GAPM_EVT_READ_RSLV_ADDR | Read Resolvable Address event. | |
GAP Connection Control |
BLE_GAPC_EVT_PHY_UPDATED | PHY Update event. |
BLE_GAPC_EVT_CONNECTED | Connected event. | |
BLE_GAPC_EVT_DISCONNECTED | Disconnected event. | |
BLE_GAPC_EVT_CONNECT_CANCEL | Connect Cancel event. | |
BLE_GAPC_EVT_AUTO_CONN_TIMEOUT | Auto Connect Timeout event. | |
BLE_GAPC_EVT_CONN_PARAM_UPDATED | Connect Parameter Updated event. | |
BLE_GAPC_EVT_CONN_PARAM_UPDATE_REQ | Connect Parameter Request event. | |
BLE_GAPC_EVT_PEER_NAME_GOT | Peer Name Get event. | |
BLE_GAPC_EVT_CONN_INFO_GOT | Connect Info Get event. | |
BLE_GAPC_EVT_PEER_INFO_GOT | Peer Info Get event. | |
BLE_GAPC_EVT_DATA_LENGTH_UPDATED | Data Length Updated event. | |
BLE_GAPC_EVT_DEV_INFO_SET | Device Info Set event. | |
BLE_GAPC_EVT_CONNECT_IQ_REPORT | Connection IQ Report info event. | |
BLE_GAPC_EVT_CONNECTLESS_IQ_REPORT | Connectionless IQ Report info event. | |
BLE_GAPC_EVT_LOCAL_TX_POWER_READ | Local transmit power read indication info event. | |
BLE_GAPC_EVT_REMOTE_TX_POWER_READ | Remote transmit power read indication info event. | |
BLE_GAPC_EVT_TX_POWER_CHANGE_REPORT | Transmit power change reporting info event. | |
BLE_GAPC_EVT_PATH_LOSS_THRESHOLD_REPORT | Path loss threshold reporting info event. | |
BLE_GAPC_EVT_RANGING_IND | Ranging indication event. | |
BLE_GAPC_EVT_RANGING_SAMPLE_REPORT | Ranging sample report event. | |
BLE_GAPC_EVT_RANGING_CMP_IND | Ranging complete indication event. | |
BLE_GAPC_EVT_DFT_SUBRATE_SET | Default subrate param set complete event. | |
BLE_GAPC_EVT_SUBRATE_CHANGE_IND | Subrate change indication event. | |
GATT Common | BLE_GATT_COMMON_EVT_MTU_EXCHANGE | MTU Exchange event. |
BLE_GATT_COMMON_EVT_PRF_REGISTER | Service Register event. | |
GATT Server | BLE_GATTS_EVT_READ_REQUEST | GATTS Read Request event. |
BLE_GATTS_EVT_WRITE_REQUEST | GATTS Write Request event. | |
BLE_GATTS_EVT_PREP_WRITE_REQUEST | GATTS Prepare Write Request event. | |
BLE_GATTS_EVT_NTF_IND | GATTS Notify or Indicate Complete event. | |
BLE_GATTS_EVT_CCCD_RECOVERY | GATTS CCCD Recovery event. | |
BLE_GATTS_EVT_MULT_NTF | GATTS Multiple Notifications event. | |
BLE_GATTS_EVT_ENH_READ_REQUEST | GATTS Enhanced Read Request event. | |
BLE_GATTS_EVT_ENH_WRITE_REQUEST | GATTS Enhanced Write Request event. | |
BLE_GATTS_EVT_ENH_PREP_WRITE_REQUEST | GATTS Enhanced Prepare Write Request event. | |
BLE_GATTS_EVT_ENH_NTF_IND | GATTS Enhanced Notify or Indicate Complete event. | |
BLE_GATTS_EVT_ENH_CCCD_RECOVERY | GATTS Enhanced CCCD Recovery event. | |
BLE_GATTS_EVT_ENH_MULT_NTF | GATTS Enhanced Multiple Notifications event. | |
GATT Client | BLE_GATTC_EVT_SRVC_BROWSE | GATTC Service Browse event. |
BLE_GATTC_EVT_PRIMARY_SRVC_DISC | GATTC Primary Service Discovery event. | |
BLE_GATTC_EVT_INCLUDE_SRVC_DISC | GATTC Include Service Discovery event. | |
BLE_GATTC_EVT_CHAR_DISC | GATTC Characteristic Discovery event. | |
BLE_GATTC_EVT_CHAR_DESC_DISC | GATTC Characteristic Descriptor Discovery event. | |
BLE_GATTC_EVT_READ_RSP | GATTC Read Response event. | |
BLE_GATTC_EVT_WRITE_RSP | GATTC Write Response event. | |
BLE_GATTC_EVT_NTF_IND | GATTC Notify or Indicate Receive event. | |
BLE_GATTC_EVT_CACHE_UPDATE | GATTC Cache Update event. | |
BLE_GATTC_EVT_ENH_SRVC_BROWSE | GATTC Enhanced Service Browse event. | |
BLE_GATTC_EVT_ENH_PRIMARY_SRVC_DISC | GATTC Enhanced Primary Service Discovery event. | |
BLE_GATTC_EVT_ENH_INCLUDE_SRVC_DISC | GATTC Enhanced Include Service Discovery event. | |
BLE_GATTC_EVT_ENH_CHAR_DISC | GATTC Enhanced Characteristic Discovery event. | |
BLE_GATTC_EVT_ENH_CHAR_DESC_DISC | GATTC Enhanced Characteristic Descriptor Discovery event. | |
BLE_GATTC_EVT_ENH_READ_RSP | GATTC Enhanced Read Response event. | |
BLE_GATTC_EVT_ENH_WRITE_RSP | GATTC Enhanced Write Response event. | |
BLE_GATTC_EVT_ENH_NTF_IND | GATTC Enhanced Notify or Indicate Receive event. | |
Security Manager | BLE_SEC_EVT_LINK_ENC_REQUEST | Link Encrypted Request event. |
BLE_SEC_EVT_LINK_ENCRYPTED | Link Encrypted event. | |
BLE_SEC_EVT_KEY_PRESS_NTF | Key Press event. | |
BLE_SEC_EVT_KEY_MISSING | Key Missing event. | |
L2CAP |
BLE_L2CAP_EVT_CONN_REQ | L2cap Connect Request event. |
BLE_L2CAP_EVT_CONN_IND | L2cap Connected Indicate event. | |
BLE_L2CAP_EVT_ADD_CREDITS_IND | L2cap Credits Add Indicate event. | |
BLE_L2CAP_EVT_DISCONNECTED | L2cap Disconnected event. | |
BLE_L2CAP_EVT_SDU_RECV | L2cap SDU Receive event. | |
BLE_L2CAP_EVT_SDU_SEND | L2cap SDU Send event. | |
BLE_L2CAP_EVT_ADD_CREDITS_CPLT | L2cap Credits Add Completed event. | |
BLE_L2CAP_EVT_ENH_CONN_REQ | L2cap Enhanced Connect Request event. | |
BLE_L2CAP_EVT_ENH_CONN_IND | L2cap Enhanced Connected Indicate event. | |
BLE_L2CAP_EVT_ENH_RECONFIG_CPLT | L2cap Enhanced Reconfig Completed event. | |
BLE_L2CAP_EVT_ENH_RECONFIG_IND | L2cap Enhanced Reconfig Indicate event. |
开发者需要根据产品的功能需求实现所需的BLE Event Handler。例如,如果产品不支持Security Manager,则可以不实现对应的Event;如果产品只支持GATT Server而不支持GATT Client,则可以不实现GATT Client对应的Event。每一类Event里的Event Handler也不一定需要全部实现,开发者只需要实现产品所必须的那些Event Handler。
关于BLE API和Event API的用法,请参考SDK_Folder\documentation\GR5526_API_Reference以及SDK_Folder\projects\ble中的BLE示例源代码。
BLE_Stack_IRQ、BLE_SDK_IRQ与Application的调度机制
BLE Stack是低功耗蓝牙协议栈实现核心,它直接操作Bluetooth 5.3 Core硬件(参考软件架构)。因此,BLE_Stack_IRQ具有整个系统中次高的优先级(SVCall IRQ具有最高优先级),以保证BLE Stack严格按照Bluetooth Core Spec规定的时序运行。
BLE Stack的状态改变会触发优先级较低的BLE_SDK_IRQ中断。在该中断处理函数中会调用Application实现的BLE Event Handler,将BLE Stack的状态改变通知以及相关的业务数据发送到Application。开发者在这些Event Handler中应避免操作耗时的业务,应当将耗时业务转移到Main Loop或者用户级线程中处理。开发者可使用SDK_Folder\components\libraries\app_queue模块从BLE Event Handler向Main Loop传递事件,或者使用自己的Application Framework。