> 技术文档 > STM32WB55入门教程

STM32WB55入门教程


简介

本教程旨在帮助初学者快速上手STM32WB55微控制器,主要是BLE方面的使用。

本次使用的工程代码git可以直接拉取使用。

STM32WB55入门教程https://gitee.com/lei_kkaaa/stm32-wb55-begin

环境搭建

硬件

STM32WB55开发板,这里使用的是笔者自制的MB1355D开发板,在功能使用上和原版的一样。

注意:如果是自制的开发板,使用STLINK V2.1 带虚拟内存的版本不太好用,经常出现连不上的现象,建议使用不带虚拟内存的版本,稳定性高。

这块开发板的资料我已经在立创开源,你也可以自己制作,

工程链接https://oshwhub.com/kkaaa/mb1355d

ST官网链接https://www.st.com.cn/zh/evaluation-tools/nucleo-wb55rg.html#overvie

软件

  1. Keil MDK
  2. STM32 CubeMX V6.14.1
  3. STM32 CubeProgrammer V2.17
  4. 串口工具
  5. 手机软件 ST BLE Toolbox
  6. 软件包 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工程里的,不需要过多的修改非常方便。