简介
本教程旨在帮助初学者快速上手STM32WB55微控制器,主要是BLE方面的使用。
本次使用的工程代码git可以直接拉取使用。
STM32WB55入门教程
https://gitee.com/lei_kkaaa/stm32-wb55-begin
环境搭建
硬件
STM32WB55开发板,这里使用的是笔者自制的MB1355D开发板,在功能使用上和原版的一样。
这块开发板的资料我已经在立创开源,你也可以自己制作,
工程链接https://oshwhub.com/kkaaa/mb1355d
ST官网链接https://www.st.com.cn/zh/evaluation-tools/nucleo-wb55rg.html#overvie
软件
- Keil MDK
- STM32 CubeMX V6.14.1
- STM32 CubeProgrammer V2.17
- 串口工具
- 手机软件 ST BLE Toolbox
- 软件包 STM32Cube_FW_WB_V1.22.1
Hello World,心率服务测试
1. 首先拿到我们的开关板子,先把必要的跳线帽接上,如下图所示
2. 然后我们将USB 线缆插到ST LINK的USB孔内,就能看到LED5,LED6常亮,这样的话就你可以证明开发板供电正常了。
FUS+STACK烧录
3. 接下来烧录例程HeartRate测试BLE功能。首先我们拿到的开关内部可能是有程序的,我们需要先进行一步全部擦除,使用软件STM32 CubeProgrammer进行全擦除,因为BLE使用的协议栈需要和我们的软件包的版本保持一致,否则容易造成死机,BLE起不来的情况。如果你遇到了BLE不广播的情况,请先检查协议栈的版本。
4. 全部擦除完成以后我们需要进行协议栈的烧录先烧录FUS(FUS烧录说明)再烧录协议栈。注意烧录的版本要和你使用的软件包的版本一致,比如我这里要用的软件包是V1.22.1,那就有这个软件包里的协议栈。
选择好文件以后我们不能直接点击升级FirmwareUpdate,先确认地址,因为地址不对的话烧录会报错的,地址在固件包的目录下有说明,我们打开固件包的说明文件检查地址(虽然Cube Programmer会自动填写地址但是貌似自动填写的有错误),
可以看到我们使用的STM32WB55RGV6,可以看到了两个文件的地址,
stm32wb5x_FUS_fw.bin | 0x080EE000 |
stm32wb5x_BLE_Stack_full_fw.bin | 0x080D0000 |
选择好文件并且确认地址,以后就点击FirmwareUpdate开始升级,只需要等待即可,期间会后两次弹窗,等完成以后都点击确定即可。
然后开始升级协议栈,同样的也是先选择文件,
选择好文件以后,同样确认地址就点击FirmwareUpdate开始升级,只需要等待即可,期间会后两次弹窗,等完成以后都点击确定即可。
可以点击Read来确认我们的协议栈是否烧录成功
HreatRate软件烧录和测试
5. 烧录HreatRate软件测试,选择文件直接烧录HEX即可,
6. 使用手机ST BLE Toolbox查看广播,连接测试,都没有问题。
注意点
1. FUS 2.0的问题 在STM32WB5x/Release_Notes.html文章中提到,
2. 当点击Read FUS的时候显示协议栈是V0.0.0的时候点击升级会出现错误 Warning: FUS_STATE IMG_NOT FOUND 意思就是说内部没有镜像,可以直接下载即可,把NO Delete选上,再次点击升级即可。
CustomService编写
本章将使用CubeMX生成CustomService,演示如何和手机进行通讯,如何读写特征值这些操作。
CubeMX配置
1. 使能HSEM
2. 使能IPCC和对应的中断
3. 配置时钟和时钟树,要使用BLE的话必须使用外部晶振32MHz和32.768KHz
4. 配置SYS,打开调试端口
5. 使能RTC和中断
6. 使能RF
7. 打开USART1和中断,并且打开DMA和其中断,注意在开发板上的USART1的引脚是PB6,PB7
8. 使能STM32_WPAN,并且配置BLE,SERVICE

配置串口调试,开启SMPS,注意SMPS可以优化功耗,再同样的发射功率下,电流更低,但是接收灵敏度会略有降低,此外需要注意时钟树配置SMPS的是开关频率,如果使用10uH的电感对应4MHz,如果是2.2uH的电感对应8Mz,根据实际测试效果,使用10uH的功耗表现更好,灵敏度也较好。
到这里的话BLE部分就已经配置完成了,
最后生成代码即可
keil代码修改
1. 开启microlib,如果不开启的话下载之后会死机的。
2. 将调试初始化的函数添加到进来,不加的话无法打印出调试信息。打印的语句APP_DBG_MSG也就无法使用了。
APPD_Init();
3. 编译并且下载验证是否可以搜索到BLE,链接以后也能看到我们刚刚配置的服务和特征值。串口也正常打印调试的信息。
3. 先编辑读取特征值的功能,在文件custom_stm.c的回调里面添加回调即可,
Notification.Custom_Evt_Opcode = CUSTOM_STM_CRA1_READ_EVT;
Custom_STM_App_Notification(&Notification);
然后再在custom_app.c中进行实际数据的处理工作,
Custom_STM_App_Update_Char(CUSTOM_STM_CRA1,"HELLO");
APP_DBG_MSG("READ OK");
编译下载查看效果,可以正确读到数据,同时串口也打印了信息。
3. 再来编写写入特征值的功能。
同样也是先在custom_stm.c中加入回调,然后在custom_app.c中书写具体的处理工作。
/* 接收到数据 */
aci_gatt_write_resp(write_perm_req->Connection_Handle,
write_perm_req->Attribute_Handle,
0x00, /* write_status = 0 (no error))*/
0x00, /* err_code */
write_perm_req->Data_Length,
(uint8_t *)&write_perm_req->Data[0]);
/* 通知应用 */
Notification.Custom_Evt_Opcode = CUSTOM_STM_CRA1_WRITE_NO_RESP_EVT;
Notification.DataTransfered.Length = write_perm_req->Data_Length; //接收到的数据的长度
Notification.DataTransfered.pPayload = (uint8_t *)&write_perm_req->Data[0]; //接收到的数据的句柄
Custom_STM_App_Notification(&Notification);
在custom_app.c中将数据打印出来,
APP_DBG_MSG("%s\n\0",pNotification->DataTransfered.pPayload);
编译下载查看效果,
至此发送和接收数据的功能就已经实现了。
注意点
1. 配置了UART作为调试的串口,一定要记得使用函数APPD_Init()进行初始化,不然不会有信息打印出来
2. 本次使用的是CubeMX生成的Cusom服务,生成的四个文件(custom_stm.c,custom_stm.h,custom_app.c,custom_app.h)是可以直接移植到其他的CubeMX生成的BLE工程里的,不需要过多的修改非常方便。