BLE的蓝牙协议栈使用的是事件驱动的模式,在后台对各任务进行管理的是其utilities文件夹下的sequencer模块,这个模块在前面的帖子中介绍了,这个模块可以通过注册的方式将函数加入到后台代码中,而且可以在其它的地方对函数的“运行和停止”进行控制。
可以借助搜索功能搜索函数UTIL_SEQ_RegTask() ,能够看到注册了大量的函数到后台中。
同样蓝牙协议栈也是注册到sequencer的一个任务。当蓝牙协议栈传递出事件后,我们就需要根据项目,对某些事件进行处理。对事件进行处理的函数主要有3个:
这里也要说一下上面第一项的SVCCTL模块的函数,SVCCTL这个模块的作用是提供给应用层来处理BLE的GATT/GAP事件的一系列函数,也就是说对用户来说,处理事件则主要是通过这个库函数。
而SVCCTL模块的函数也是在sequencer中运行的,也是通过注册的方式将其注册到sequencer中的,如下图中的第244行为其注册代码。
接着还回到事件的处理函数上。上述的3个处理函数,第一个主要处理GAP的时间,比如连接的断开、连接的成功事件。而第2个和第3个处理函数则是主要处理GATT的服务。3个事件处理函数的关系可以参考下图。
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公司制定的事件)两个头文件中的定义交叉参考。