ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

STM32WB5MM-DK开发板实战:从BLE例程到FUS升级全攻略

STM32WB5MM-DK开发板实战:从BLE例程到FUS升级全攻略 “UM2825”这个编号刚拿到手的时候容易被人当成又一份平平无奇的开发板用户手册。但如果你手里恰好是ST官方那块“具有STM32WB5MMG模块的探索套件”我建议你在插USB之前先把这份文档过一遍。它对应的板卡型号是STM32WB5MM-DK核心不是普通MCU而是把MCU、射频收发器、晶振、匹配网络和天线全部打包在一起的STM32WB5MMG模块。换句话说UM2825不是一份“看看接线图”的PDF它决定了你后续能不能顺利跑通BLE、Thread和Zigbee也决定了你测功耗、改天线、做认证时会不会少走弯路。这篇文章我会按一个嵌入式工程师正常的“上手路径”来写先看硬件资源然后把第一个BLE例程跑起来接着去折腾无线栈和FUS最后聊聊低功耗、射频实测和板卡恢复。整个过程中你会反复回翻UM2825所以我会把这份文档里真正值得看的东西也一并拆开。1. 板子到手先别急着写代码UM2825里的硬件信息要这么看1.1 一块板子两个称呼先搞清你在查哪个ST搞“文档编号”和“板卡编号”是两套体系新手经常被绕晕。UM2825是用户手册编号全称语义就是“具有STM32WB5MMG模块的探索套件”而实际硬件名称是STM32WB5MM-DK。你上官网搜索的时候直接搜“STM32WB5MM-DK”比搜“UM2825”更容易找到板卡页面和对应固件包。这块板子和常见的Nucleo开发板有一个本质区别Nucleo板上贴的是裸芯片而STM32WB5MM-DK的核心是一颗完整的SiP模组。模组内部把STM32WB55系列芯片、高频晶振、低频晶振、射频匹配、电源去耦以及天线都做了进去。你拿到手看到的是模组外面只有几个引脚但真正决定该模块好不好用的所有射频细节都已经在模组封装里固定下来了。UM2825第一章通常会放一张“板卡框图”和“整体布局图”。很多人直接跳过我建议你别跳。因为这张图里标了板载ST-LINK/V3的位置、模块的位置、电源路径、LED和按键以及几个关键跳线的功能。没有这张图后面测量功耗时你可能不知道该拆哪个跳线。1.2 板载资源里容易被忽略的那几个细节STM32WB5MM-DK上的板载外设不同批次可能略有差异但几个关键思路是一样的板载ST-LINK/V3调试器、USB接口、LED、按键以及若干环境传感器和功耗测量点。最容易被忽略的是ST-LINK/V3。它不只是烧录器还带虚拟串口VCP功能。很多官方例程的日志输出就是走这个虚拟串口不需要你额外接USB转TTL小板。这一点对调试非常方便但前提是驱动要装好。Windows下安装STM32CubeIDE或STM32CubeProgrammer时通常会一并装好驱动Linux下则需要处理udev权限规则否则ST-LINK设备可能被系统识别到却没权限访问。另一个细节是“目标供电跳线”。板上ST-LINK和模块之间不是直接短接的中间通常会留出跳线或0欧电阻位目的是让你在测量模块功耗时能把调试器部分隔离开。很多人拿到板子第一步就是测功耗结果万用表夹在USB电源入口测出来的数值永远对不上数据手册原因就是ST-LINK、传感器、LED的电流全混在里面了。1.3 供电路径和调试链路的逻辑STM32WB5MM-DK直接插USB就能工作USB给板载ST-LINK/V3供电再由ST-LINK上的稳压器输出目标电压给模块和外设。这套设计对评估开发非常友好但有个反直觉的点如果你要测试模块在低功耗模式下的真实电流最好使用外部电源从目标侧供电而不是依赖USB电源。官方在UM2825里对测量方式有说明实操思路可以概括为“断开板载供电跳线、在供电回路里串电流表、确保板载调试器不参与目标侧供电”。调试链路方面UM2825会告诉你ST-LINK/V3如何使用SWD口访问STM32WB5MMG。这里有个细节模块封装的是小封装SWD引脚并不是标准插针开发板已经帮你把调试口引出到ST-LINK/V3了。真正做自己产品时如果你用的也是STM32WB5MMG模块一定要在PCB上保留SWD测试点否则量产板一旦固件异常只能干瞪眼。2. STM32WB5MMG模块的双核分工决定了你写程序的方式2.1 模块不是“帮你少画一点板”这么简单很多人觉得STM32WB5MMG的价值就是省了天线设计和画板麻烦这当然没错但不全面。它真正的价值是把射频链路从“设计问题”变成了“选型问题”。自己做分立方案时天线匹配、走线阻抗、晶振布局、EMI滤波每一个环节都可能让无线距离、功耗、认证结果发生天翻地覆的变化。模块方案里这些已经被原厂固定并验证过BOM成本会高一些但研发风险低很多。UM2825里关于模块的硬件描述并不多真正的引脚定义、天线净空区域、模块封装尺寸要看STM32WB5MMG的数据手册。但探索套件存在的意义就是让你在画PCB之前先把模块的性能在官方验证过的板子上摸清楚。2.2 M4和M0各管什么STM32WB5MMG内部是一个双核架构Cortex-M4主要负责应用逻辑和计算Cortex-M0负责无线协议栈和底层无线处理。两个核通过IPC mailbox机制通信共享内存缓冲区来传递数据。为什么非要单独放一个M0跑无线栈因为BLE或802.15.4的协议栈非常在意时序。以BLE为例每个连接事件的收发窗口是毫秒级甚至亚毫秒级的如果协议栈和应用代码跑在同一个核上应用某个长时间关闭中断的临界区就可能让协议栈错过射频事件最终表现为连接不稳定、丢包、连接频繁断开。M0独立跑协议栈后这种问题被隔离开来。你的应用代码即使写得再“奔放”只要不是把M4的电源电压搞崩M0那边的无线时序一般不会受影响。反过来M4可以利用全部算力去做业务逻辑。对应到编程习惯上你会看到官方例程里有大量和IPC相关的回调比如HW_TS、tl_recv_data这类函数。这些都是M4与M0通信的桥。刚上手时不需要把所有IPC细节搞得很深但要明白一个原则M4发送数据给对端不是直接操作射频硬件而是把数据交给M0侧协议栈协议栈再排队发送。这也是为什么某些教程会让新手用“中断接收、主循环处理”的惯性思维去写BLE很容易踩坑。2.3 集成天线和认证收益STM32WB5MMG模块自带天线这是它跟很多需要外接天线的Wi-Fi/BLE模组不一样的地方。模块内部已经做了天线匹配外部只需要保证模块天线区域净空、不要在它周围铺铜、不要用金属外壳遮挡。认证收益往往被低估。产品要做无线认证时天线设计、匹配网络、PCB layout都是摇摆因素。如果模块本身已经通过了模块级认证并且你的整机设计严格贴着参考设计那么整机认证的工作量会小很多。探索套件虽然不能直接拿去做产品认证但它是你验证“模块性能够不够”的最佳参照物。以下是模块方案和分立SoC方案的大致对比维度模块方案STM32WB5MMG分立SoC方案STM32WB55裸芯片射频布线基本不需要天线已集成需要阻抗控制、匹配网络、天线净空设计认证难度可复用模块认证风险较低整机射频认证工作量较大BOM成本较高较低裸芯片加外部元件调试灵活性较低天线不可随意换较高可外接调试天线上市速度快适合快速量产慢射频调优周期不可控如果你做的是量产产品时间成本和射频不确定性往往是最大的成本。模块方案算的是总账不是单颗BOM的账。3. 从零跑通第一个BLE例程环境、编译、烧录、验证3.1 工具链版本匹配是第一步也是最大的一步跑STM32WB5MMG的BLE例程推荐用下面这套组合STM32CubeIDE集成编译、烧录、调试最省事。STM32CubeProgrammer看无线栈版本、FUS状态执行栈升级必装。STM32CubeWB固件包ST官方为STM32WB系列准备的SDK里面包含例程、库和无线栈镜像。版本匹配问题经常让人头大。STM32CubeIDE持续迭代STM32CubeWB固件包也在持续更新。如果两个版本相差太远导入工程时可能出现一堆莫名其妙的编译错误实际上只是库版本和IDE内部的CMSIS组件不匹配。我的习惯是直接装最新版IDE同时下载最新版CubeWB避免被一些老坑绊住。在STM32CubeIDE里导入例程最常见的方式是File - Import - Existing Projects into Workspace选择CubeWB里对应板卡的工程目录。工程路径一般长这样STM32CubeWB/Projects/STM32WB5MM-DK/Applications/BLE/BLE_HeartRate注意不同CubeWB版本目录结构可能略有变化比如有的把例程放在Applications/Connectivity下。找不到时别硬找看看目录列表里有没有Connectivity或者BLE关键字。3.2 烧录App之前先确认无线栈是否还在STM32WB5MM-DK出厂时ST一般会预烧FUS、BLE无线栈和示例应用。所以你在IDE里直接把官方BLE例程编译好烧录进去通常就能跑起来。但这里有一个非常重要的常识你在STM32CubeIDE里点击Run下载的是Cortex-M4侧的Application。M0侧无线栈是另一段固件它不在Application的编译链接范围内。如果你的板子出厂软件被擦过或者你之前用STM32CubeProgrammer做过“Full Chip Erase”那么即使Application烧录成功BLE也可能完全搜不到设备。判断方法很简单打开STM32CubeProgrammer连接ST-LINK查看M0侧存储器或无线栈版本信息。如果版本号为空说明无线栈没了需要先重烧无线栈再烧App。别问我为什么知道这个坑——我自己就曾经很自信地擦了个全片然后对着手机搜不到设备发呆了半小时。3.3 编译、烧录和连接逻辑以BLE_HeartRate例程为例编译通过后直接Debug或Run都行。连接ST-LINK后IDE会通过SWD把固件烧进M4。烧录完成板子复位此时M4应用会通过IPC要求M0启动BLE协议栈协议栈随即开始广播。手机端用ST官方App“ST BLE Sensor”或者“ST BLE Toolbox”扫描可以看到一个广播名类似“HR”或者工程默认名称的设备。连接上之后设备页可以看到模拟的心率数据。如果扫描不到设备优先看这几样板载LED是否在闪烁。大多数官方例程会用一个绿色LED来指示BLE广播状态如果LED没动作大概率是栈没跑起来。VCP串口日志有没有输出。STM32WB例程启动时会打印协议栈版本和初始化状态如果串口没日志先确认串口终端波特率是否和例程一致。ST-LINK/V3驱动和VCP枚举是否正常。Windows下打开设备管理器看有没有识别到ST-LINK设备Linux下先确认udev规则。3.4 串口波特率别想当然官方例程的VCP输出波特率不是固定的有的是115200有的是921600。如果你用250000去读看到的就是乱码。最好的做法是先去例程的app_conf.h里搜索CFG_DEBUG_TRACE或者LOG相关的定义看它配置的波特率是多少。这个细节在UM2825里未必会提但属于SDK例程里最常见的坑。4. 无线协议栈烧录、FUS升级和并发模式部署4.1 无线栈为什么要单独烧而不是编进App里STM32WB的无线栈运行在M0核上也有自己独立的安全启动流程。用户Application跑在M4核上两个核共享Flash资源但链接地址是分开的。你的M4工程在编译时会避开M0栈所占用的Flash区域也就是说M4的Hex文件里根本不会包含无线栈二进制。这就导致一个和普通MCU开发完全不同的习惯烧录App只是半个步骤无线栈本身要通过固件升级方式写入M0侧。板子出厂时可能已经有BLE栈但如果你要切换到Zigbee、Thread或者要更新栈版本就得走FUS流程。FUS的全称是Firmware Upgrade Service可以简单理解为M0里的一个小型“Bootloader”。每次启动时M0首先执行FUS再由FUS加载无线栈镜像。FUS本身也独立于应用它负责无线栈的分区管理、版本校验和升级操作。4.2 FUS升级的步骤与版本匹配用STM32CubeProgrammer升级无线栈大致思路是这样的连接ST-LINK打开“Firmware Upgrade Services”面板选择对应的无线栈镜像文件然后点击升级。部分版本也支持命令行STM32_Programmer_CLI -c portSWD modeHOTPLUG -fwupgrade namestm32wb5x_BLE_HCI_fw.bin注意这里stm32wb5x_BLE_HCI_fw.bin只是举例。不同CubeWB版本中的镜像文件名可能会写为stm32wb5x_BLE_Stack_fw.bin所以实际操作时以固件包实际文件为准。最让人疼的是版本匹配。M4侧的Application在编译时默认关联了特定版本的无线栈比如CFG_BLE_MAX_CONNECTION、BLE_STACK_VERSION这类宏定义会和栈内部的版本号比对。如果你发现BLE能初始化但总是连接不上或者官方例程跑起来后手机一连接就复位大概率就是M4 App和M0栈版本不匹配。解决思路很简单不要混搭。每次更新CubeWB时把配套的无线栈镜像同步刷进去再烧对应Application。官方例程目录里通常有专门的Projects/STM32WB5MM-DK/Applications/BLE和对应的Wireless_Binaries目录前者是工程后者是配套镜像两者对齐使用。4.3 BLE和Thread/Zigbee动态并发的实际体验STM32WB5MMG的一个重要能力是“动态并发”也就是同一时刻运行BLE和802.15.4协议栈。比如设备可以同时作为Thread节点和BLE外围设备一边联网一边用手机App配置。这项能力听起来很炫但它的角色组合有严格限制。不是所有BLE角色都能和Thread/Zigbee共存官方应用笔记里会列出支持的并发组合。以BLE Peripheral和Thread Router这样的组合比较常见而BLE同时做Central又导线程往往就不在支持列表里。跑并发例程的时候需要先烧一个“同时包含两个栈”的镜像再烧M4侧的Concurrent Application。这个镜像通常比单BLE栈更大烧录时间也更长。UM2825里不会详细讲并发协议细节但它会告诉你板子上如何选择启动模式、如何看板载指示灯状态来区分当前工作在哪种模式。我的建议是初次接触STM32WB先不要碰并发模式。先把BLE跑通再把Thread或Zigbee单独跑通最后再试并发。否则当板上两个栈同时初始化时你很难判断问题到底出在M4 Application、FUS还是栈组合上。5. 用探索套件做低功耗和射频实测的经验5.1 测电流的位置决定了数能不能看STM32WB5MMG的低功耗特性是它的一大卖点但探索套件上测电流并不是“万用表夹住USB口”就行。USB口供电是所有电路的源头包含ST-LINK和板载外设电流测出来的数会比模块真实功耗大好几倍完全没有参考价值。正确做法是找到UM2825里标出的目标供电测量点把测试跳线帽取下在跳针两端串入电流表。如果板上不是跳线而是0欧电阻那就要先焊下电阻再接电流表或者从供电接口处做“注入式”测量。这里我分享一个实操经验别用普通万用表的电流档去测低功耗模式。STM32WB的Sleep模式电流可能低至微安级普通万用表电流档的内阻和分辨率都未必够。最好用带积分功能的功率分析仪或者至少用一台支持微安级分辨率的台式万用表。如果没有那就用串联电阻测电压再换算。5.2 天线净空区域比你想的更严格STM32WB5MMG模块自带天线但“自带天线”不代表“板子上随便放都行”。模块数据手册里一定会有一个天线净空区域也就是模块周围一圈禁止铺铜和布线的区域。你评估探索套件时感受不到这个问题因为官方板已经把这个区域留好了。但如果你自己画板把模块贴在铜皮密集的区域天线性能会大幅下降。我在自研板上第一次接触类似模块经验告诉我不要想着“就铺一点铜不影响”天线近场区的铜皮和地平面直接影响天线效率。模块周围至少要保证数据手册要求的净空天线正上方不要走平行长线条也不要让外壳金属件紧贴天线位置。5.3 距离测试时USB线和调试器就是干扰源在探索套件上做BLE距离测试最容易犯的错是插着USB线和ST-LINK开始测。USB线、ST-LINK调试线以及板上的VCP通路都会成为意外的天线辐射体它们会让接收信号质量变得很奇怪。你测出的“10米就断连”不一定代表模块不行可能只是你的测试环境里躺着一根USB线在捣乱。我的做法是涉及射频距离验证时让板子用锂电池或干电池供电彻底断开USB线和调试器。手机或对端设备离开发射板至少半米以上避免近场耦合。同时测试场地尽量选在周围没有大金属家具的室内环境。如果距离还是明显偏短就用ST OPENTX或频谱仪去看一下模块是否真的在发射以及发射功率是否达标。这个探索套件本身已经调好天线和匹配如果距离都上不去优先怀疑供电噪声或附近干扰源而不是怀疑模组设计。6. 跳出UM2825配套文档、板卡恢复和一条少走弯路的顺序6.1 文档地图怎么搭配看UM2825不是唯一要看的文档但它是一切的入口。我通常这样搭配使用文档/资源解决什么问题什么时候看UM2825探索套件硬件、跳线、供电、调试链路开箱、测功耗、跑例程前STM32WB5MMG数据手册模块引脚、天线净空、推荐layout自己画板时STM32WB55参考手册双核结构、外设寄存器、时钟树深入调低功耗、写驱动时STM32CubeWB固件包例程、库、无线栈镜像每阶段都在看官方应用笔记FUS升级、低功耗、并发模式涉及具体特性时搜索对应AN编号UM2825里关于无线协议栈的篇幅其实不多因为它是一份“Development Kit”文档解决的是板卡级问题。真正要理解无线栈、FUS、IPC需要借助STM32CubeWB包里的文档目录以及ST官网搜到的应用笔记。把这些文档配合起来看效率远高于反复试错。6.2 板卡被锁死的恢复方案玩STM32WB很容易因为不小心开启RDP读保护把板子锁死。尤其是你折腾Option Bytes或者在某次调试中勾了一个不该勾的保护选项之后ST-LINK就无法正常连接MCU。解决方法是使用STM32CubeProgrammer的Hot Plug模式强制连接然后把RDP等级降回Level 0。命令行方式大致是STM32_Programmer_CLI -c portSWD modeHOTPLUG -ob RDP0xAARDP0xAA对应Level 0也就是解除读保护。需要注意执行这个操作通常会擦除整个Flash包括M0侧无线栈。解除保护后你必须重新烧录FUS和无线栈再烧Application。我个人的建议是不要轻易对这块开发板做“Full Chip Erase”。STM32WB的Flash里不只是你的代码还躺着协议栈和FUS。每次需要清板时先在STM32CubeProgrammer里记录一下当前无线栈版本再决定是否擦除。养成这个习惯之后能省下很多“恢复出厂设置”的时间。6.3 一条比较顺的学习路径结合我自己玩这块板子的过程如果让我重新走一遍我会按这个顺序来先跑官方BLE_HeartRate例程只改广播名和连接参数理解BLE基础流程。再用P2P Server/Client例程理解GATT服务和数据收发。然后找一个下午专门研究FUS升级把BLE栈升级到和CubeWB匹配的版本彻底搞清楚M0和M4的关系。之后跑Thread或者Zigbee的单协议例程理解802.15.4和BLE的差异。最后再碰并发模式。这套顺序的考虑是BLE例程最容易看到成果先建立信心FUS是最容易翻车也最容易让人退缩的环节必须在前面解决并发模式建立在单协议栈完全熟悉的基础上否则出了问题你根本定位不了。最后再分享一个我从踩坑里换来的小技巧在STM32CubeIDE里点RunIDE默认只会下载M4侧的Application它不会检查M0侧无线栈是否存在。所以每当你换了一个例程、换了一个CubeWB版本烧录前先用STM32CubeProgrammer看一眼M0侧栈版本。这一步只要花30秒但它能省掉你至少半天“为什么连不上”的排查时间。
返回列表