[分享] 【ST NUCLEO-WB09KE测评】-6-BLE例程 p2p_server代码分析

慕容雪花   2024-9-14 23:25 楼主

下图是来自ST中文官网下载的GATT介绍,比较多直观,分享一下。

 

image.png  

 

主程序开始先进行各种外设初始化:

  MX_GPIO_Init();
  MX_RADIO_Init();
  MX_RADIO_TIMER_Init();
  MX_PKA_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Init code for STM32_BLE */
  MX_APPE_Init(NULL);

初始化BLE STACK, 还有UTIL SEQUENCER,之前有大佬分享过文章: [ST NUCLEO-WBA52CG] 3 - BLE中的sequencer -- UTIL_SEQ_RegTask()函数的作用 https://bbs.eeworld.com.cn/thread-1253252-1-1.html

image.png  

例程提供了LED1状态的读,写;BUTTON1的NOTIFY。

 

image.png  

 

通过USB DONGLE连接WB09-KE开发板,可以看到小灯与按键对应的CHARACTERISTIC。

image.png  

下面来分析一下按键状态上报NOTIFY的工作大致流程。首先,GATT CLIENT会点击enable notify,这样WB09-KE的BLE STACK会经由如下处理。

ble_evt.c中的void BLE_STACK_Event(hci_pckt *hci_pckt, uint16_t length)函数会对BLE STACK传递过来的事件做检查。如下:

image.png  

接着调用:

image.png  

上面的BLE EVT SvcHandler其实是在P2P_SERVER_Init()函数进行初始化的时候注册的专门的回调函数。

image.png  

如果解析HCI PDU发现是禁止NOTIFICATION,那么会

notification.EvtOpcode = P2P_SERVER_SWITCH_C_NOTIFY_DISABLED_EVT;

image.png  

 

接着 P2P_SERVER_APP_Context.Switch_c_Notification_Status = Switch_c_NOTIFICATION_OFF;

image.png  

这个status标志位会影响按键按下后,是否通知GATT Client。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

在上面使能了NOTIFY后,WB09-KE开发板这边,如果有SW1按下,

 

image.png  

 

image.png  

 

 

   image.png  

 

 

如下图L259,会根据P2P_SERVER_APP_Context.Switch_c_Notification_Status来决定是否调用:

P2P_SERVER_NotifyValue(P2P_SERVER_SWITCH_C, &p2p_server_notification_data, P2P_SERVER_APP_Context.ConnectionHandle);

 

image-20240914230833-1.png  

 

最终会调用aci_gatt_srv_notify来把最新的BUTTON status发送出去。

image.png  

 

 

 

回复评论 (1)

不错,楼主的 p2p_server代码分析过程整的好详细

点赞  2024-9-15 08:45
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复