ARTICLE DETAIL

资讯详情

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

NUCLEO-WB55RG BLE广播故障排查:从硬件到协议栈的完整指南

NUCLEO-WB55RG BLE广播故障排查:从硬件到协议栈的完整指南 第一次用NUCLEO-WB55RG开发板做BLE项目烧完官方示例手机nRF Connect扫了半天一片空白——这个场景应该有不少人遇到过。标题里那句No advertisments from NUCLEO-WB55RG英文虽然把advertisements拼错了但问题描述得很直白开发板压根没发BLE广播包。如果你搜索相关资料时一直没找到对症的解法大概率也是被这个拼写带偏了方向。这篇文章不是教你从零写BLE协议栈而是围绕STM32WB55系列为什么会出现静默无广播这件事把我自己排查这类问题时的完整思路、踩过的坑、验证过的方法全部摊开。从硬件层面的供电和时钟到CubeMX里的工程配置再到M0核心的协议栈固件状态最后落到手机端扫描不到的隐蔽原因一条链路全部过一遍。无论你是刚接触STM32WB的新手还是已经在项目里被广播问题折磨了几天的老手这篇文章都能提供一个可以直接照做的排查顺序。1. 先弄清没广播和扫描不到是两回事排查起点必须对齐很多人看到手机扫不到设备第一反应就是代码配置错了于是反复去改广播间隔、广播数据、扫描响应包改了一整天也没解决。我先说一个之前项目里最戏剧化的案例我们的硬件工程师拿到的板子天线焊反了射频信号根本出不去但软件这边每个人都坚信是代码问题因为在逻辑上代码确实能跑。后来用频谱仪一测射频输出端完全是平的大家才反应过来问题根本不在软件层。所以排查BLE广播问题第一件事不是看代码而是先定义清楚你是哪种没广播情况A代码执行了但射频层没有任何信号出来。这属于物理层或者协议栈固件的问题手边的频谱仪、专用BLE抓包器甚至第二块开发板都能测出来但手机大概率扫不到。情况B射频信号是有的但手机/上位机扫不到。这属于广播参数、广播内容、连接白名单、手机蓝牙缓存等上层问题此时你用nRF Connect扫描器和BLE sniffer能看到设备但手机自带蓝牙设置页或某些App就是扫不到。情况C程序压根没执行到广播启动的代码。这属于工程配置、初始化流程、断言死循环之类的问题。排错最忌讳的就是不区分这三种情况直接开干。我自己现在固定的一套做法是先拿一个最简单的官方示例比如STM32Cube_FW_WB里的BLE_HeartRate或BLE_p2pServer烧录进去如果官方示例都发不出广播那就是硬件或工具链的问题如果官方示例能扫到再回头查自己工程改了什么。这一步能在十分钟内帮你排除掉一半的干扰项。还有一个看似废话但实际经常翻车的点你用哪台手机、哪个App去扫描不同手机对BLE广播的过滤策略差异极大。iPhone的CoreBluetooth在后台状态下扫描机制比较特殊Android从Android 6.0开始扫描需要动态定位权限Android 12及以上还有BLUETOOTH_SCAN运行时权限。如果你不检查App配置很容易出现明明有广播但手机就是不显示的误判。所以排查初期建议直接备一台Android手机装上nRF ConnectNordic官方出的那个把位置权限和蓝牙权限都给足这台设备作为参考扫描仪。在进入后面的具体排查之前先记住一个基本概念BLE广播发生在GAP层Generic Access Profile。STM32WB的架构里GAP层以及更底层的链路层、物理层都是跑在Cortex-M0核心上的预编译协议栈固件里不归你写的Cortex-M4应用代码管。所以广播是否发出取决于两件事一是M0核上的协议栈固件是否正确加载并运行二是M4核通过IPC跨核心通信给协议栈下达了正确的广播命令。搞明白这个架构很多排查思路就清晰了。2. 硬件层面的关键检查项供电、时钟与射频通路很多人在软件里翻来覆去找问题最后发现是硬件板子本身没给够工作条件。NUCLEO-WB55RG本身是ST官方的评估板按理说板级硬件是标准的但它在某些场景下依然暗藏陷阱。2.1 供电不足一个能解释所有玄学问题的原因NUCLEO-WB55RG有两种供电方式通过ST-LINK的USB口供电5V来自USB经板载稳压器转出3.3V或者通过Arduino排针上的VIN/3.3V引脚外部供电。大部分时候用USB供电是没问题的但要注意如果你同时给板子上的其他外设供电比如接了LED灯带、舵机、射频扩展板电流就可能超出板载稳压器的承受范围。STM32WB55RG跑BLE广播时峰值电流本身就能到十几毫安加上射频功放瞬间抽流如果供电电压跌落超过一定幅度射频核心就可能复位或无法正常工作表现就是时好时坏、有时候上电能广播有时候不能。我自己的排查方法是把万用表打到直流电压挡直接测板子上的3.3V和VBAT引脚在反复按复位键和触发广播的瞬间观察电压有没有明显跌落。如果发现电压波动超过100mV先拔掉所有外设再测一次。很多诡异的广播失败最后都是供电不干净导致的。2.2 32MHz和32.768kHz晶振BLE的命脉STM32WB55RG需要两颗晶振一颗32MHz主晶振用于系统时钟和射频一颗32.768kHz低速晶振用于RTC和低功耗模式下的唤醒。BLE射频对时钟精度要求很高BLE规范要求广播信道上的频率误差在正负50kHz以内而STM32WB内部射频核心的本地振荡器是靠32MHz晶振作为参考的。NUCLEO-WB55RG板载了这两颗晶振出厂焊接通常是合格的。但如果你用过国产兼容板或者自己画的板子就要特别注意32MHz晶振的负载电容匹配。我曾经在一块自绘板子上遇到的场景是晶振能起振但频率偏了30多ppm结果协议栈起来后广播时断时续连接经常掉线。这种问题你用逻辑分析仪、用调试器看代码都发现不了必须用频谱仪或者高精度频率计去量。官方的NUCLEO板基本不会出这种问题但如果你把代码搬到自绘板上就出现官方板能广播、自己板不广播晶振匹配是第一嫌疑。另外还要检查HSE就绪标志。如果在SystemClock_Config里HSE起振超时代码可能会卡死在HAL_RCC_ClockConfig的错误处理里程序根本没跑到BLE初始化的地方。这种问题临床表现就是完全没广播但DEBUG单步又能跑过去因为调试器连接时时钟行为会发生变化。建议在初始化代码里加上HSE超时后的错误指示比如点个LED或者打印日志不要傻傻地等死循环。2.3 天线匹配与射频通路看不见的物理层瓶颈NUCLEO-WB55RG板载PCB天线ST官方设计的天线匹配电路是经过验证的。但这里有一个容易被忽略的点板子角落的SMA连接器如果有的话和天线选择跳线。部分NUCLEO-WB55RG板型上射频输出可以通过0欧电阻或跳线在天线和SMA座之间切换。如果跳线帽位置不对射频信号全跑到了SMA座上而没有接天线辐射效率会急剧下降近在咫尺的手机也收不到。判断射频通路是否正常最直接的办法是用STM32CubeMonitor-RFST官方出的一款射频测试工具连接开发板它可以读取射频核心的寄存器状态并触发连续载波或调制信号。如果能正常发出单载波信号说明射频链路和协议栈状态基本健康问题更可能出在广播参数的配置层。提示如果你没有频谱仪也没有ST官方射频工具还有一个土办法——把开发板贴近一个带RTL-SDR芯片的软件无线电接收棒把频率调到2.4GHz频段如果能看到2.402/2.426/2.480GHz附近出现周期性短脉冲说明射频通路至少是在工作的。这个方法不算精确但做初步判断够用。3. CubeMX工程配置中的隐形地雷参数没配对广播就是出不来如果你确认硬件没问题官方例程能正常广播那问题就锁定在自己的工程工程里。STM32WB的开发流程比普通STM32多了一个关键步骤不仅要配置M4内核的外设还要配置RF协议栈的加载和IPC通信。这两个环节任何一个没配对广播都会失败。3.1 用CubeMX生成工程时最容易忽略的步骤先用ST官方推荐的流程理一遍。在STM32CubeMX里选择NUCLEO-WB55RG然后在Categories里找到Middleware and Software Packs点开RF。打开RF协议栈配置选择你要用的协议BLE、802.15.4或者Thread。如果只需要BLE就只勾BLE不要同时勾选多个协议栈。在BLE配置界面里需要设置Device Name、Advertising Interval等参数这些参数最后会生成到代码里。关键一步在Toolchain设置里选择正确的IDE版本生成代码后还需要手动将协议栈固件比如stm32wb5x_BLE_Stack_full_fw.bin烧录到芯片的FUSFirmware Upgrade Services区域。第二步里有一个隐形坑如果你选择的是Full协议栈还是Light协议栈会影响M0核的固件大小和功能集合。对于NUCLEO-WB55RG自带的STM32WB55RG芯片Flash有1MBFull协议栈足够放下。但如果用的是WB55CE之类的低容量型号要注意Flash空间是否足够。第三步里最关键的隐藏参数是Advertising Table相关内容。CubeMX的BLE配置界面里有一个Payload列表你没往里面添加任何Advertisment Data的话生成的代码可能只配置了广播参数但没有实际设置广播内容。部分协议栈版本在广播数据为空时不会真正开启广播。所以有一个经验在CubeMX里至少往ADV Data里塞一个Flags字段或者Complete Local Name字段让广播内容非空。3.2 IPC中断与核间通信的配置状态STM32WB双核架构的核间通信依赖一组共享内存和IPC中断。CubeMX在生成BLE工程时会自动配置好IPC中断的向量和优先级但如果你后续手动修改过NVIC配置比如把某些中断优先级调了极端情况下会导致M4核下发命令给M0核的消息得不到及时处理广播启动命令一直卡在队列里。一个直观的检查方式初始化BLE协议栈时通常会调用hci_init()函数这会通过IPC通知M0核的协议栈准备就绪。如果在调用后你等待某个事件标志位比如CFG_HCI_CB_EVT_INIT但这个标志位永远等不到十有八九是IPC中断被屏蔽了或者优先级配置错乱。这个坑的隐蔽之处在于不开DEBUG单步跑的时候完全无感一旦你在调试器里手动改了某些寄存器或者中断优先级行为就会变得很随机。所以我自己定了一个规矩CubeMX生成的NVIC配置尽量别手改尤其是RCC_IRQn、IPC_IRQn、HSEM_IRQn这几个和双核通信紧密相关的中断源。3.3 烧录方式不对只烧了M4代码没烧协议栈固件这个坑在STM32WB开发里太常见了。NUCLEO-WB55RG出厂时芯片里预置了FUS固件但BLE协议栈固件不一定预置。如果你用IDE直接烧录M4核心的应用程序烧完发现跑不起来、或者压根没有广播先去检查一下协议栈固件是否烧进去了。判断方法很直接用STM32CubeProgrammer连接开发板在Firmware Upgrade Services选项卡里查看当前芯片的FUS版本和已安装的无线栈版本。如果无线栈区域是空的说明协议栈固件没装。这时需要先将stm32wb5x_BLE_Stack_full_fw.bin通过FUS接口烧入。有一个细节烧录协议栈固件和烧录应用固件的顺序有讲究。ST官方推荐先通过FUS烧协议栈再烧M4应用代码。如果你先烧了应用代码再去烧协议栈有些版本组合会出现应用代码校验失败的情况。保险起见我每次拿到新板子都会先做一次完整流程Erase整个芯片 - 烧FUS - 烧无线栈 - 烧M4应用。不要嫌烦这一步能消除大量兼容性隐患。4. 代码层逐行排查从协议栈初始化到广播启动的完整调用链如果硬件、协议栈固件都正常下一步就要仔细审查自己的代码了。STM32WB的BLE应用代码层级清晰广播相关的调用主要集中在app_ble.c或者你自定义的BLE任务文件里。我建议按从底向上的顺序排查。4.1 协议栈初始化序列差一步都不行一个标准的BLE广播初始化序列大致如下以STM32CubeFW_WB的BLE_HeartRate例程为蓝本/* 1. 初始化HCI传输层 */ hci_init(); /* 2. 等待HCI初始化完成事件 */ while (!hci_cmd_resp_event_received) { /* 通常用的是信号量或事件标志组 */ } /* 3. 重置BLE协议栈 */ hci_reset(); /* 4. 初始化GATT接口 */ aci_gatt_init(); /* 5. 初始化GAP设置设备名称和IO能力 */ aci_gap_init( GAP_DEVICE_NAME_LENGTH, // 设备名长度 WB55_BLE_Peripheral, // 设备名 gap_service_handle, // 返回的GAP服务句柄 gap_dev_name_char_handle, // 设备名特征句柄 GAP_IO_CAP_NONE, // IO能力 GAP_DISCOVERABLE_MODE_GENERAL, // 可发现模式 GAP_ACCEPT_CONNECTION_MODE_UNDIRECTED // 接受连接模式 ); /* 6. 设置广播数据 */ aci_gap_update_adv_data( ADV_DATA_SIZE, adv_data // 一个包含Flags和LocalName的数组 ); /* 7. 设置扫描响应数据 */ aci_gap_update_scan_response_data( SCAN_RESP_DATA_SIZE, scan_resp_data ); /* 8. 正式开启广播 */ aci_gap_set_discoverable( GAP_DISCOVERABLE_MODE_GENERAL, (uint16_t)ADV_INTERVAL_MS, (uint16_t)ADV_INTERVAL_MS );每一步都有一个返回值而很多人写代码时忽略了对这些返回值的检查。排查时建议在每一步之后都加上错误判断和日志输出。我曾经遇到过一次aci_gap_set_discoverable返回0x40未知HCI命令错误查了老半天才发现是前面aci_gap_init里传的设备名长度超过了协议栈允许的最大值导致GAP初始化实际失败后续命令全部报错。4.2 广播数据内容空数据、超长数据和不符合规范的TLVBLE广播数据是典型的TLV结构Type-Length-Value比如static const uint8_t adv_data[] { 0x02, 0x01, 0x06, // Flags, 指示LE General Discoverable Mode 0x09, 0x09, W, B, 5, 5, // Complete Local Name };第一项是长度0x02第二项是类型0x01 Flags第三项是值0x06。第二组同理长度0x099字节类型0x09Complete Local Name后面9个字节是名字。常见的坑是长度字段算错。比如名字是WB55你写着0x09其实应该是0x06。协议栈不会校验你的TLV内容是否正确它就原样发出去。但手机端的解析器遇到格式错误的广播数据可能直接丢弃整个广播包表现就是明明有广播波彤但手机就是扫不到。所以广播数据一定要用nRF Connect这类工具里的Raw视图检查确认TLV格式正确。另一个坑是广播数据超长。传统广播通道Advertising Channels上的广播包最大有效载荷是31字节PDU里已经包含了6字节的广播地址和2字节的头部。如果你的adv_data数组超过31字节aci_gap_update_adv_data会直接返回错误。有些新手把设备名、服务UUID、厂商自定义数据全塞进去一数发现超过31字节然后广播就静默失败了。4.3 事件回调与信号量等待死锁导致广播永远不启动STM32WB的BLE协议栈是异步事件驱动的。M4核下发命令后协议栈处理完会产生事件回调比如hci_le_advertising_report、aci_gap_procedure_complete_event等。很多开发者为了同步逻辑会在广播启动后阻塞等待某个事件信号量但忘了初始化信号量对应的队列/任务。我遇到过的具体场景是在一个RTOS工程里BLE任务初始化时创建了一个osSemaphoreNew然后调用aci_gap_set_discoverable紧接着osSemaphoreAcquire等待一个ACK事件。但由于事件回调里osSemaphoreRelease执行在另一个中断上下文信号量优先级配置不当导致事件丢失结果就是任务永远挂在同步等待上广播启动代码后面的部分比如GATT服务的注册永远执行不到。从外面看设备确实没广播但不是广播本身失败而是流程被卡住了。排查这类问题的方法是在关键节点加日志HCI init done、GAP init done、ADV data set、Discoverable set每走一步打一条。不用逻辑分析仪都能很快定位卡在哪一层。4.4 若考虑用C#/WinForms做上位机扫描不要忽略PC蓝牙栈的差异标题相关的热搜词里出现了C#实现BLE蓝牙通信、WinForms项目对于net framework 4.7.2实现BLE蓝牙通信可以用的第三方库这类话题。这也是一种常见场景开发板广播正常但你用PC作为扫描端扫不到。如果你是在Windows上做BLE上位机开发有几个特点跟手机不同第一Windows自带的蓝牙栈对BLE广播的暴露很有限。UWP的Windows.Devices.Bluetooth.AdvertisementAPI可以接收广播但你需要在项目清单里声明蓝牙功能。传统WinForms.NET Framework 4.7.2没有官方UWP API所以必须借助第三方库。目前可用的方案大概有这几种一是BluetoothLEExplorer之类的开源库封装了WinRT API供.NET Framework调用二是转向.NET Core / .NET 5直接用Windows.Devices.Bluetooth三是使用InTheHand.Net.Bluetooth这类纯托管库但它对BLE广播的接收支持不完整。我自己实际项目里比较推荐的是用.NET 5或更高版本直接引用WinRT的Windows.Devices.Bluetooth.Advertisement这样能获取原始广播包。另一个关键点Windows的蓝牙驱动如果被第三方蓝牙适配器比如低劣的USB蓝牙棒接管可能导致广播检测极不稳定。排错时换一个品牌蓝牙适配器CSR或Intel的芯片往往能解释掉一堆代码没问题但收不到的现象。还有一点容易被坑到死Windows的蓝牙广播接收和手机有个重要区别——Windows默认不监听所有广播。在BluetoothLEAdvertisementWatcher里ScanningMode有两个选项Passive和Active。默认的Passive模式表示只监听广播包不发送扫描请求而主动扫描模式Active会发送扫描请求以获取扫描响应数据。某些设备配置的广播数据很少主要信息放在扫描响应里。如果你用Passive模式扫描看到的设备名可能是空的你会误以为广播不正常。这个坑在排查上位机收不到广播数据时非常常见。4.5 另一个网络热词esp32-s3 wifi与ble协议对照调试的思路热搜词里有esp32-s3 wifi与ble协议说明不少人是带着ESP32的开发经验来上手STM32WB的。这两个平台的BLE开发方式差异很大但恰好可以互相参照调试。ESP32的BLE例程通常在app_main里直接调用esp_ble_gap_start_advertising()跑的是完整开源协议栈ESP-IDF内置了Bluedroid或NimBLE烧录一个固件就能完成所有事情。而STM32WB是双核架构协议栈是闭源预编译库跑在M0核上你还得管理FUS升级、核间通信这些ESP32上不存在的概念。但两者的底层标准是一样的。如果你手头有ESP32-S3开发板可以做一个很有意思的实验让ESP32-G5也发同样的广播参数然后看两台手机/同一台手机扫描这两个设备的行为差异。这能帮你判断问题出在广播参数配置层面还是STM32WB特定的协议栈层面。比如如果ESP32用同样的广播间隔和功率发广播手机能扫到而STM32WB扫不到那问题基本锁定在STM32WB的协议栈状态配置上。这种对照组排查法在嵌入式开发里非常有效。5. 手机端扫描不到的隐蔽原因与假广播问题有时候射频信号有、协议栈状态也正确但你的手机就是扫不到。这一节专门讲那些把代码从头检查到尾都找不到问题结果发现冤枉了代码的场景。5.1 手机蓝牙缓存与系统过滤机制手机在扫描到BLE设备后系统层和App层都有缓存。最常见的情况你之前成功连接过某个设备手机里已经存了它的配对信息。当你修改了广播数据里的设备名或者广播地址发生了变化手机可能会因为缓存中的链路信息不匹配而选择不显示该设备。iPhone的操作路径是设置 - 蓝牙 - 找到设备 - 点击忽略此设备然后重启蓝牙。Android则要复杂一些需要在蓝牙设置里清空已保存的设备或者直接清除App的存储数据。排查时建议换一台从未连接过该设备的手机做交叉验证如果新手机能扫到而旧手机扫不到那就是缓存问题。还有一个容易被忽视的机制Android的附近设备权限NEARBY_DEVICES或iOS的定位服务权限没给够。Android 12以上的App如果没申请BLUETOOTH_SCAN权限扫描的时候会静默失败。iOS则在后台扫描时要求开启定位权限否则广播接收会被系统切到极低频。5.2 广播类型、定向广播与白名单BLE广播有几种类型最常见的两种无定向广播Undirected任何人都可以扫描到也可以发起连接。定向广播Directed只针对特定设备广播包内有特定的目标设备地址非目标设备不会在扫描报告里展示。如果你把广播模式设成了定向广播例如GAP_DISCOVERABLE_MODE_LIMITED配了特定的绑定设备地址手机上的nRF Connect会扫不到它或者只在极少情况下看到。STM32WB的aci_gap_set_discoverable接口里有一个参数控制广播模式排查时确认一下没有误设成定向模式。另一个相关的机制是白名单White List。如果你在协议栈里配置了白名单过滤只有白名单内的设备才能收到广播或者发起到你的连接。开发初期我强烈建议把白名单功能关掉除非你明确知道自己在做什么。5.3 广播间隔和广播功率手机扫描不是即时的很多开发者在调试时把广播间隔设得特别大以省电比如1000ms甚至更久。手机端扫描BLE设备时通常是周期性扫描每个广播信道每次扫描窗口可能只有几十毫秒。如果广播间隔是1000ms而广播包在每个周期内只出现在三个广播信道中的一个信道上手机可能需要好几秒甚至十几秒才能偶然捕获到一个广播包。这个体验跟扫不到几乎一样。快排的做法是把广播间隔临时降到20ms~100ms同时把广播功率调到最大然后观察是否能扫到。能扫到就说明逻辑链路是通的再把间隔调大去平衡功耗。我自己的标准调试参数是广播间隔40ms发射功率0dBm扫描响应使能。等调试结束再根据实际需求优化。广播功率在STM32WB里由aci_hal_set_tx_power_level()函数控制默认不一定是最大功率。如果之前有人为了过认证把功率调到了-20dBm那近场扫描不到也是正常的。5.4 协议栈事件上报频率与扫描响应缺失BLE广播分为广播事件Advertising Event和扫描响应Scan Response。广播事件是设备主动发出的扫描响应是手机在收到广播后发送扫描请求SCAN_REQ设备再回复的。如果你的广播数据里只放了少量信息比如只放了一个Flags字段那么手机可能在扫描结果里看到一个没有设备名的未知设备。nRF Connect的扫描列表里如果出现一个没有名字的设备很多新手会直接忽略它以为那不是自己的板子。这是典型的假广播确认偏误广播确实有但显示得太不明显。解决方法是把设备名放到广播数据里而不是扫描响应数据里或者检查nRF Connect的Raw字段根据MAC地址确认是不是自己的设备。MAC地址也是排查时一个有用的信息点。STM32WB的公共MAC地址来源于出厂时烧录的唯一ID但开发板有时候会出现MAC地址全零或者固定值的情况。如果手机端看到的MAC地址和你预期不符说明协议栈在读取设备地址时出了问题可能是FUS区域里的UID没有被正确读取。这种情况下你可以通过aci_gap_set_public_address手动设置一个公共地址来验证。6. 排查链路完整复盘一套可以复用到其他无线项目的思路到这里关于NUCLEO-WB55RG广播不出去的问题我已经把硬件、固件、代码、上位机各个层面的常见原因都过了一遍。最后把这套排查思路提炼成一套步骤下次遇到类似问题不仅限于STM32WB也可以是ESP32、nRF52等任何BLE平台的广播异常你可以直接用这个框架排查层级检查重点快速验证方法物理层天线连接、晶振频率、供电电压频谱仪看单载波万用表测纹波协议栈固件FUS版本、BLE协议栈是否烧录STM32CubeProgrammer查无线栈版本IPC通信M0/M4核通信、中断配置检查HCI初始化日志、IPC事件回调GAP/GATT配置广播数据、广播类型、功率nRF Connect查看广播原始包手机/上位机权限、缓存、扫描参数换第二台手机交叉验证这五个层面按顺序排从上到下排查每层都有快速验证手段。我的经验是80%的完全没广播问题出在前两层物理层和协议栈固件而80%的信号有但手机扫不到问题出在后两层GAP配置和手机端。关于STM32WB这个平台我最后还想额外提两个很多人在项目后期才会发现的细节第一个是关于功耗优化和广播的冲突。如果你在工程里启用了低功耗模式PWR_EnterSTOPMode之类但BLE协议栈的CFG_BLE_NUM_LINK、CFG_BLE_ATT_MTU等配置和低功耗唤醒周期配合不好会导致射频核心在唤醒后没有及时同步广播调度出现进入低功耗后广播漂移甚至消失的问题。开发阶段我通常先禁用低功耗把广播调通后再逐步加入低功耗策略否则低功耗和广播交织在一起排查难度翻倍。第二个是关于FUS版本的兼容性。STM32WB的无线协议栈固件和FUS是分开升级的FUS版本过低会导致某些新的BLE功能比如PAwR这是网络热词里提到的一个较新特性periodic advertising with responses不受支持。如果你印象中明明配置了周期广播相关参数但设备行为完全不对可以考虑先升级FUS和无线协议栈到互相兼容的版本。ST的Release Notes里会有每个版本对应的兼容性矩阵升级前一定要看那个表。真正把这一整套流程走完大多数NUCLEO-WB55RG的静默问题都能水落石出。我自己后来遇到广播没了的情况已经可以做到十分钟内定位到具体层级先看CubeProgrammer确认协议栈固件在不在再用频谱仪或第二块板子确认射频通不通最后才去看自己的应用代码。这套顺序下来既不会在代码层面瞎折腾也不需要一上来就怀疑硬件设计效率比乱打乱撞高得多。
返回列表