板子收到了,很开心,浅浅的使用了一下。该说不说,ST的工程师设计这个板子堆料挺足,设计的很精美,SDK开发的也不错。这个板子最亮眼的部分就是有个小屏幕,之后我会把它用上。
0、概述
那么我们要基于这个板子设计自己的APP,离不开三样东西:应用程序、SDK、驱动。
应用程序包括业务逻辑等等;
SDK这里ST已经提供了一套完备的解决方案,需要适应着使用。
驱动就是硬件的一些驱动,ST也帮我们设计的差不多了。
因此我们做的工作基本上就是配置工程,和应用程序适配,方案的具体实现等等。
综上,我想做一个自研的QT+STM32 蓝牙通信系统,系统框图如图所示:
具体就是:QT上位机生成数据,STM32计算,LCD显示结果。
当然首要任务是,先把蓝牙这部分打通再说,因此我简要的总结了一下这个STM32 WB蓝牙基本使用的过程如下:
1、搭建开发环境:
需要STM32_WPAN这个第三方组件,要么直接在sdk里复制粘贴一份application代码,要么自己在cubeMX里下载一个这个组件,然后生成代码
我是用的是p2p_server的这个模板,因为这个模板使用了最简单的蓝牙交互,易于上手,可以直接复制一份,然后再修改
路径是:
STM32WBA55G\STM32Cube_FW_WBA_V1.5.0\Projects\NUCLEO-WBA55CG\Applications\BLE\BLE_p2pServer
2、配置环境
因为我是用的是最基本的GATT 通信,不使用ST 自带的APP(当然他的app确实好用这个我已经使用过了,但是要保持产品的自主可控还是要脱离APP的),因此某些地方都是需要修改的。
需要三个Char 一个发送,一个接收,一个预留
3、Characteristics配置
Char 具体配置如下,注意,那个UUID allocation type 一定要是 SIG的,不然扫描不到。其它的配置如图所示。
这里我就不得不吐槽一下ST的这个sdk了,这些名字只能这么选吗,不能用户自定义吗,这也太不灵活了。(这里纠正一下,SIG是是由 Bluetooth Special Interest Group(SIG) 分配的标准化UUID。SIG负责定义蓝牙技术规范,确保设备间的兼容性。因此,SIG UUID是公开的、标准化的,并且用于通用蓝牙功能的实现。当UUID的分配类型为 SIG 时,UUID必须是由 Bluetooth Special Interest Group(SIG) 标准化和规定的。SIG定义了一些标准服务和特征的UUID,这些UUID是用于确保蓝牙设备间的兼容性和互操作性。SIG UUID是公共的,并且已经在蓝牙技术规范中被明确指定。)真是涨姿势了啊!
4、修改代码:
因为我的Service名字是P2P_Server,所以生成了一个p2p_server.c .h 和p2p_server_app.c .h
然后打开p2p_server.c,需要添加代码:
在P2P_SERVER_EventHandler函数里,这些warning 的地方都是需要添加代码的,为后续的读写数据做准备
aci_gatt_allow_read(p_write_perm_req->Connection_Handle); #warning user shall call aci_gatt_allow_read() function if allowed aci_gatt_write_resp(p_write_perm_req->Connection_Handle, p_write_perm_req->Attribute_Handle, 0x00,0x00, p_write_perm_req->Data_Length, p_write_perm_req->Data); #warning user shall call aci_gatt_write_resp() function if allowed
其中aci_gatt_write_resp是上位机给单片机发数据的,相反是上位机读单片机数据的
之后再在p2p_server_app.c里修改P2P_SERVER_Notification这个函数,这个函数其实就是个switch case语句,由于现在我们仅仅是测试,因此我现在写的就是不同的状态都打印一下信息吧。具体代码如图所示:
5、通信测试
代码部分基本到此为止,之后我们就可以用Bluetooth LE Explorer进行调试了,这个软件是微软应用商店的,免费。
扫描连接之后,大概是这个样子,最下面的UserData就是进行交互的数据了,这里我只用了两个Characteristic
点开UserData里面的某一个char 可以读写数据,如图:
写个字符串123试试:
再读一下
读取成功。至此,基本的通信已经打通了,至于后续的具体应用,诸如点灯,控制遥控车,传输传感器数据就轻而易举了。