[原创] [ST NUCLEO-WBA52CG] 6 - BLE协议栈的使用简析

manhuami2007   2023-8-29 07:58 楼主

BLE的蓝牙协议栈使用的是事件驱动的模式,在后台对各任务进行管理的是其utilities文件夹下的sequencer模块,这个模块在前面的帖子中介绍了,这个模块可以通过注册的方式将函数加入到后台代码中,而且可以在其它的地方对函数的“运行和停止”进行控制。

可以借助搜索功能搜索函数UTIL_SEQ_RegTask() ,能够看到注册了大量的函数到后台中。

075729vsk8d88sbhz1zos8.png

同样蓝牙协议栈也是注册到sequencer的一个任务。当蓝牙协议栈传递出事件后,我们就需要根据项目,对某些事件进行处理。对事件进行处理的函数主要有3个:

  1. app_ble.c文件中的SVCCTL_App_Notification()函数
  2. 自定义服务对应的server源文件,例如p2p_server.c中的P2P_SERVER_EventHandler()函数
  3. 自定义服务定义的server_app源文件中,例如p2p_server_app.c中的P2P_SERVER_Notification()函数

这里也要说一下上面第一项的SVCCTL模块的函数,SVCCTL这个模块的作用是提供给应用层来处理BLE的GATT/GAP事件的一系列函数,也就是说对用户来说,处理事件则主要是通过这个库函数。

而SVCCTL模块的函数也是在sequencer中运行的,也是通过注册的方式将其注册到sequencer中的,如下图中的第244行为其注册代码。

075729rqdthu06bundeq5h.png

接着还回到事件的处理函数上。上述的3个处理函数,第一个主要处理GAP的时间,比如连接的断开、连接的成功事件。而第2个和第3个处理函数则是主要处理GATT的服务。3个事件处理函数的关系可以参考下图。

075729emuzb9zoln59yuln.png

P2P_SERVER_EventHandler()这个处理函数是P2P_SERVER_Notification()函数的上层函数。在P2P_SERVER_EventHandler()函数中会调用P2P_SERVER_Notification()函数。虽然这两个都处理GATT的事件,但还是有区别的,P2P_SERVER_EventHandler()处理了所有和GATT相关的事件,但是针对特征值的读写则是主要是在P2P_SERVER_Notification()里进行处理的。

以上就是用户层需要关注的事件处理函数,STM32提供了大量的事件,用户可以根据自己的需要,对某些事件进行处理,相应的事件可以参考文档AN5270,这里有各个事件的介绍,不过这个文档和代码里的事件宏定义稍微有点区别,但是大体的名字是相似了,可以结合着工程文件”ble_std.h”(ble的标准事件)和”ble_vs_codes.h”(st公司制定的事件)两个头文件中的定义交叉参考。

回复评论 (1)

处理了所有和GATT相关的事件,针对特征值的读写,主要在P2P_SERVER_Notification()里进行,是不一样的

点赞  2023-8-30 07:29
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复