WIP
项目状态:
主要思想是能够在STM32WB55核板上使用Semtech Lora SX1272MB2DAS盾牌。不幸的是,ST(I-Cube-LRWAN)为此盾牌提供的代码仅适用于几个核板(L053RG,L073RZ,L152RE和L476RG)。
派生的想法是嫁给洛拉(Lora)和布莱(Ble),如今许多物联网对象由于各种原因(设置,provisoning,fuota,...)都可以访问,但主要是因为它与智能手机兼容。 STM32WL意甲没有BLE,STM32WB Serie没有Lora功能。
好吧,我有机会使用SX1272和WB55创建了一对,并为灵活的物联网项目提供了两个芯片组合。请记住,WB55意甲不仅限于BLE。协处理器固件可以处理2.4GHz侧向协议,例如Zigbee和Openthread。因此,远距离和短距离RF通信的结合很有趣。
该项目只是现有代码和库的一个端口,但可能会为某些开发人员节省设置时间,因为有一些技术问题需要解决。
随着即将到来的Lora 2.4GHz,这被视为过渡工作。 SX1280将在单个芯片中结合短距离通信。您可能想仔细看看。
这很容易获得。 SEMTECH SX1272MB2XAS LORA MBED SHIELD是Arduino兼容的盾牌,核板具有相应的连接器。技术简介:
如前所述,STM32WB55意甲是这里的目标,P-Nucleo-WB55RG是一个不错的板子。技术简介:
一旦连接起来(这是一个没有脑袋),这就是结果对象。 

永远不要忘记在为板上供电之前插入天线。您可能会损坏RF放大器输出(尽管功率相当低)。当然,购买两个是乒乓球的必要条件。
| 包裹 | 版本 |
|---|---|
| STM32Cubeide | 1.7 |
| STM32Cubemx | 6.3.0 |
| FW_WB | 1.12.1 |
| i-cube-lrwan | 2.0 |
该代码的主要部分由ST和Semtech转异式覆盖。查看适当使用的各自协议:
| 成分 | 版权 | 执照 |
|---|---|---|
| 原始应用程序来源 | stmicroelectronic | ST许可协议SLA0044 |
| Lorawan®堆栈 | Semtech | BSD修订后的Semtech零件许可 |
| Cortex®-M CMSIS | Arm Ltd | BSD-3-差价或Apache许可证2 |
我最喜欢的开发环境是Linux,但ST工具也可用于Mac和Windows。前两个更容易设置,通常没有问题或驾驶员问题。好吧,真正精通技术已经知道了。
尽管我不是IDE的忠实粉丝,但STM32Cudeide的工作正常,ST插件有帮助(MX,软件扩展下载,...)。 Stmicro为某些Lora Shields提供了软件扩展程序包。如上所述,它是I-Cube-lrwan,并包含示例项目和库,例如低级SX1272驱动程序(通过SPI)和Lorawan堆栈(1.0.3兼容)。
该项目可以在没有依赖项的情况下轻松地在STM32Cudeide中打开。所有代码无需从St安装WB或Lorawan Firmare。打开项目并构建它(在Linux和MacOS上进行了测试)。但是,您需要为CPU2安装的BLE堆栈固件。在这里, STM32WB5X_BLE_STACK_FULL_FW.BIN已闪烁。每个堆栈固件都在项目/STM32WB_COPRO_WIRESSE_BINARIES/STM32WB5X目录中提供STM32CUBEWB固件软件包以及如何为此编程板。它需要做一次。
整个实验需要一些额外的工具。我将强大的NRF52840 USB加密狗与NRF Connect一起使用,可用于台式3.7.0(可在Linux,Mac和Windows上可用),从北欧半导体器中进行测试BLE连接。我知道智能手机可以做到这一点,我在iOS或Android上使用LightBlue,但是当您对UUID或设备的名称弄乱时,平台往往会丢失其缓存的数据,因此我想弄清楚诸如Nordic over的开发工具的情况。
对于Lorawan的部分,TTN很棒,我选择购买廉价的Lorawan Gateway,Ttig(比Rak Hats更便宜)用于本地测试。该网关是针对TTN服务的,但是必须有一种连接到您自己的LNS的方法。
那是第一步。使事情起作用,我选择了低级RF传输示例。移植ST/SEMTECH代码是针对重新配置WB55的问题。
Nucleo WB55板和SX1272MB2DAS盾牌之间的引脚映射:
| SX1272MB2DAS | P-Nucleo-STM32WB55 | Arduino Connector PIN名称 |
|---|---|---|
| dio0 | PC6 | D2 |
| dio1 | PA10 | D3 |
| dio2 | PC10 | D4 |
| dio3 | PA15 | D5 |
| NSS | PA4 | D10 |
| Sclk | PA5 | D13 |
| 味o | PA6 | D12 |
| 莫西 | PA7 | D11 |
| 重置 | PC0 | A0 |
因此,首先看不到任何不兼容。 SPI1 PIN集匹配,NSS和RESET引脚也可以。但是,这是第一个带有IRQ线路的Hickup。 PC6使用Exti6 IRQ行(Exti9_5_IRQN),这很好,但是PA10,PC10和PA15共享相同的Exti IRQ线,即Exti15_10_IRQN。
因此,对无线电接口定义进行了修改,以匹配Nucleo-WB55板(SX1272MB2DAS_CONF.H)。在调用相应的SX1272 IRQ处理程序之前,已经对IRQ处理程序进行了修改以检查GPIO(DIOX)状态(查看STM32WBXX_IT.C源文件)
RTC的时钟源设置为LSE。
原始项目文件布局也已进行了稍作修改。原始文件的集成已在MX生成的项目(SX1272.IOC)上进行,以保留更改项目的可能性。但是,某些谨慎的态度应该被视为可能产生的冲突代码。
用此代码编程两个板,正如预期的那样,第一个接收乒乓球响应ping消息的板变成掌握另一个板,将变成奴隶。我使LED状态反映了这一点(如原始代码中以前计划)。一个人在短时间后闪烁红色,另一个是绿色的LED闪烁:视频。
BLE代码是一个完全生成的MX。马上必须在MX项目中正确设置一个工作(这可能是单独的文章),这并不是一件直接的。我为此目的分开设置了一个BLE测试项目,一旦起作用,我就将代码合并到Lora项目中,以使两次运行并排。
因此,BLE测试软件只是HRS(心率传感器)外围密码。它基于一个完全不同的计时器框架,该框架称为硬件计时器服务器(HW_TS)。 Semtech Lora库不是基于此库,而是基于STM32_Timer实用程序,该实用程序本身基于HAL RTC驱动程序。我删除了实用程序库和RTC适配器,因此整个项目仅依赖于HW_TS。 LORA库实际上依赖一个易于重写的中间API(Timer.H),因此使用HW_TS。另一方面,Ping Pong应用程序依赖于以前的公用事业库。对此部分进行了一些更改,使整个代码仅依赖于HW_TS。
我需要合并由PING PONG应用程序和BLE代码定义的任务。幸运的是,两者使用STM32_Sequencer实用程序。正确完成后,我成功地制作了Lora Ping Pong应用程序,并在STM32WB55板上同时且完美地运行了HRS BLE应用程序。
我修改了app_ble.c代码,因此广告(可见)名称基于STM32 UDN,因此我们可以同时区分运行的板。
对于有用的演示,我写了一项专用的Gatt服务,以便可以通过BLE询问两个板,以便您知道Lora Node具有哪个角色(主或从)以及已发送/接收的Ping/Pong的数量。为此,我对BLE代码进行了稍微调整,因此蓝色LED反映了BLE连接状态。自定义服务(不是由MX生成的,太混乱了),具有两个特征,一个知道节点角色(Pingpong Synchronization后的主或从属),另一个是接收到的Ping帧(从属节点)或Pong Frames(主节点)的柜台。这是连接到两个同步板的NRF连接的屏幕截图: 
这样,我宁愿花更多的时间在由BLE控制的Lora应用程序上,这是下一步。
Lorawan堆栈是I-Cube-Lwan扩展包中提供的Semtech的堆栈。如果最终设备需要Lora Alliance认证,则为1.0.3符合认证软件包,包括认证软件包。
同样,该代码依赖于与BLE堆栈不同的RTC包装器,因此已对其进行了修改。计时器的数量增加了,因为初始HW Timerver设置过于限制,无法同时运行两个堆栈(修改后的IOC后更改了HW_IF.H文件)。
原始示例洛万末端节点发送了一组非常完整的数据集,我将测试框架大大减少到了一个简单的文本。
设备设置为使用OTAA加入网络,因此需要3个元素:DEVEUI,JAINEUI和APPKEY。 DEVEUI是用于硬件设备的唯一标识符,并且是由STM32“序列号”构建的。 Joineui(或以前的AppEUI)标识符用于服务器端的应用程序分离。 Appkey非常重要(AES128密钥),该ut被非常秘密地保持。源代码任意将其设置为必须更改以最终使用的值。保密是使用Semtech代码使用安全元素API完成的,在我们的情况下,这是虚拟的SE,但是如果您碰巧使用实际的元素,则非常方便。
joineui和appkey在se-nidentity.h文件中进行了硬编码( lorawan_app_key和lorawan_nwk_key必须是OTAA的值相同的值,后者用于计算麦克风,而JoineRequest对于在LNS上有效是必要的)。
用TTN和TTIG Gateway进行测试给出了这些:

对于声明的部分。

一旦两个董事会得到他们各自的JoinRequest的积极答复。
已经写了一项特殊的GATT服务来公开:
| 属性 | 使用权 | 评论 |
|---|---|---|
| 地位 | 读 | 是否已完成 |
| Deveui | 读 | 读数的DEVEUI |
| 大约 | 读 | 读取硬编码的Joineui/appeui |
| 数据 | 写 | 将发送的数据(16个字节最多)。默认为“ STM32WB55!”! |
| 时期 | 写 | 在发送数据的几秒钟内(默认为10秒) |
| RSSI | 读 | 收到下行链路消息时更新 |
| snr | 读 | 收到下行链路消息时更新 |
注意:不要弄乱时期,占空比的限制为1%。使用默认设置,该模块每10秒发送15个字节。在SF7BW125处,这可以在〜7秒的最低时期完成。
在这里,与之相关的暴露特征的例证:

待续