【STM32WLE5之LoRa# 系列2、易智联LM401 评估板PingPong工程移植】

2023-10-27

前言

记录基于STM32CubeMX构建STM32WLE5模块的PingPong收发例程的过程。硬件平台为易智联蓝色的LM401 LoraWan评估板,对应的MCU型号为STM32WLE5CBU6。PingPong例程具有完整的数据收发过程,并且配置了ST的基本任务调度、软定时、队列和日志输出,是我们开发Lora私有协议的基础工程。

一、开发环境

STM32CubeIDE 是 ST 公司基于 Eclipse/CDT 框架和 GUN GCC 工具链制作的免费 IDE,并集成了STM32CubeMX。 可以实现 STM32 系列芯片的外围设备配置、代码生成、代码编辑、代码编译、在线调试,并且支持数百个 Eclipse 现有插件。

1、STM32CubeMX与STM32CubeIDE软件安装

官网下载stm32cubemx、stm32cubeide
stm32cubemx:https://www.st.com/en/development-tools/stm32cubemx.html
stm32cubeide:https://www.st.com/en/development-tools/stm32cubeide.html
基本上一路确定即可。
虽然STM32CubeIDE集成了STM32CubeMX,不如单独的灵活STM32CubeMX。单独安装STM32CubeMX一方面方便导入应用例程,另一方面方便生成MDK、IAR的工程。

2、下载STM32WL固件库

运行STM32CubeMX,HELP–>Manage embedded software packages如下图所示
在这里插入图片描述
在这里插入图片描述
等待下载安装完成,默认的安装位置为C:\Users\用户\STM32Cube\Repository\STM32Cube_FW_WL_V1.1.0

二、硬件平台

LM401-LoraWAN 评估板板载基于STM32WLE5CB的LM401模块。提供了基本的硬件电路,并提供了板载USB转COM以及LDO。USB连接电脑既可以实现供电、打印输出、输入操作。
在这里插入图片描述
PingPong例程中Log输出端口为板载的USB转串口PA2、PA3,软件配置成UART2 波特率115200-8-N-1。

三、 PingPong例程的简介

1、PingPong例程位置

\STM32Cube\Repository\STM32Cube_FW_WL_V1.1.0\Projects\NUCLEO-WL55JC\Applications\SubGHz_Phy\SubGHz_Phy_PingPong
目录如下:
在这里插入图片描述

2、PingPong例程功能

PingPong例程是两个评估板之间的一个简单收发例程。默认情况下,评估板作为主设备发送一个“Ping”消息然后等待回复。第一个收到“Ping”消息的评估板将自己设置成从设备,并回复“Pong”消息。当主设备收到“Pong”消息之后继续发送“Ping”消息。这样就建立了一个持续的PingPong收发对。
这个例程能够使我们快速的了解STM32WLE5的收发过程,方便LoRa私有协议的开发。

3、附加功能

在移植PingPong例程过程中,STM32CubeMX配置时我们增加一路ADC的采集,以便后续做采集上报例程。

四、 PingPong例程的移植

1、创建STM32CubeMX工程;

a、打开STM32CubeMX工具;
b、新建工程Start My Project From MCU;
在这里插入图片描述
c、选择STM32WL系列,选择STM32WLE5CB双击
在这里插入图片描述
d、File菜单–>Import Project导入PingPong例程并点击OK,用户名为自己实际目录
C:\Users\用户\STM32Cube\Repository\STM32Cube_FW_WL_V1.1.0\Projects\NUCLEO-WL55JC\Applications\SubGHz_Phy\SubGHz_Phy_PingPong\SubGHz_Phy_PingPong.ioc
在这里插入图片描述
中间会有些错误,是因为原例程平台STM32WL55JC为BGA封装,有些引脚STM32WLE5CB没有。
e、配置时钟输入,HSE 32MHz晶体振荡器,LSE 32.768K晶体振荡器
在这里插入图片描述
f、RTC开启Alarm A,软件定时使用
在这里插入图片描述
g、启RTC中断
在这里插入图片描述
h、配置ADC
在这里插入图片描述
i、SUBGHZ_PHY按如下配置
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

k、时钟配置
RTC配置32.768Khz,HSE 32Mhz,MCU时钟48Mhz使用内部MSI RC时钟
在这里插入图片描述

2、生产STM32CubeIDE工程;

a、Project Manager配置
在这里插入图片描述
在这里插入图片描述
b、执行GENERATE CODE生成工程

五、工程编译

1、工程配置

将BSP文件夹放入\PingPong_csdn\STM32CubeIDE\Drivers目录,
打开\PingPong_csdn\STM32CubeIDE目录,双击.project打开工程。
右击工程名称,选择Properties,将BSP目录加载到Inclue paths
在这里插入图片描述
修改platform.h,将原来的

#if defined(USE_BSP_DRIVER)
/* code generated by STM32CubeMX does not support BSP.  */
/* In order to use BSP, users can add the BSP files in the IDE project space */
/* and define USE_BSP_DRIVER in the preprocessor definitions  */
//#include "stm32wlxx_nucleo.h"
//#include "stm32wlxx_nucleo_radio.h"
#include "stm32wlxx_LM401.h"
#include "stm32wlxx_LM401_radio.h"
#endif /* defined(USE_BSP_DRIVER) */

在这里插入图片描述

2、工程编译

执行Build All。
在这里插入图片描述
编译成功,生成二进制代码
在这里插入图片描述

六、小结

至此PingPong例程的CubeMX工程和CubeIDE工程移植完成,打开app_subghz_phy.c如下所示,只有一个基本框架。后续需要完善没有定义的射频功能函数和PingPong例程的应用程序。

static RadioEvents_t RadioEvents;
/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
/*!
 * @brief Function to be executed on Radio Tx Done event
 */
static void OnTxDone(void);

/**
  * @brief Function to be executed on Radio Rx Done event
  * @param  payload ptr of buffer received
  * @param  size buffer size
  * @param  rssi
  * @param  LoraSnr_FskCfo
  */
static void OnRxDone(uint8_t *payload, uint16_t size, int16_t rssi, int8_t LoraSnr_FskCfo);

/**
  * @brief Function executed on Radio Tx Timeout event
  */
static void OnTxTimeout(void);

/**
  * @brief Function executed on Radio Rx Timeout event
  */
static void OnRxTimeout(void);

/**
  * @brief Function executed on Radio Rx Error event
  */
static void OnRxError(void);

/* USER CODE BEGIN PFP */
/* USER CODE END PFP */

/* Exported functions ---------------------------------------------------------*/
void SubghzApp_Init(void)
{
  /* USER CODE BEGIN SubghzApp_Init_1 */
  /* USER CODE END SubghzApp_Init_1 */

  /* Radio initialization */
  RadioEvents.TxDone = OnTxDone;
  RadioEvents.RxDone = OnRxDone;
  RadioEvents.TxTimeout = OnTxTimeout;
  RadioEvents.RxTimeout = OnRxTimeout;
  RadioEvents.RxError = OnRxError;

  Radio.Init(&RadioEvents);

  /* USER CODE BEGIN SubghzApp_Init_2 */
  /* USER CODE END SubghzApp_Init_2 */
}

/* USER CODE BEGIN EF */

/* USER CODE END EF */

/* Private functions ---------------------------------------------------------*/

static void OnTxDone(void)
{
  /* USER CODE BEGIN OnTxDone */
  /* USER CODE END OnTxDone */
}

static void OnRxDone(uint8_t *payload, uint16_t size, int16_t rssi, int8_t LoraSnr_FskCfo)
{
  /* USER CODE BEGIN OnRxDone */
  /* USER CODE END OnRxDone */
}

static void OnTxTimeout(void)
{
  /* USER CODE BEGIN OnTxTimeout */
  /* USER CODE END OnTxTimeout */
}

static void OnRxTimeout(void)
{
  /* USER CODE BEGIN OnRxTimeout */
  /* USER CODE END OnRxTimeout */
}

static void OnRxError(void)
{
  /* USER CODE BEGIN OnRxError */
  /* USER CODE END OnRxError */
}

/* USER CODE BEGIN PrFD */
/* USER CODE END PrFD */

七、相关资源链接

文件中提供的易智联Demo板连接:
https://item.taobao.com/item.htm?spm=a1z0k.7628869.0.0.4fbb1be2qSrsJg&id=655801203935&_u=t2dmg8j26111
文件中的CubeMX工程及BSP文件链接:
https://download.csdn.net/download/ww2801/76277784

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【STM32WLE5之LoRa# 系列2、易智联LM401 评估板PingPong工程移植】 的相关文章

  • 使用 STM32 USB 设备库将闪存作为大容量存储设备

    我的板上有这个闪存IC 它连接到我的STM32F04 ARM处理器 处理器的USB端口可供用户使用 我希望我的闪存在通过 USB 连接到 PC 时被检测为存储设备 作为第一步 我在程序中将 USB 类定义为 MSC 效果很好 因为当我将主板
  • DSP 库 - RFFT - 奇怪的结果

    最近我一直在尝试在我的STM32F4 Discovery评估板上进行FFT计算 然后将其发送到PC 我已经调查了我的问题 我认为我对制造商提供的 FFT 函数做错了 我正在使用 CMSIS DSP 库 现在我一直在用代码生成样本 如果工作正
  • 将 GCC 内联汇编与采用立即值的指令结合使用

    问题 我正在为 ARM Cortex M3 处理器开发定制操作系统 为了与我的内核交互 用户线程必须生成 SuperVisor Call SVC 指令 以前称为 SWI 用于软件中断 该指令在ARM ARM中的定义是 这意味着该指令需要即时
  • C 嵌入式应用程序中 time() 函数的问题

    我在用time 在 ARM 微控制器上 处理器一到达此函数就会重新启动 奇怪的是 当我处于调试模式时 代码运行得很好 但一旦我想将其应用到独立模式 我就会遇到重置 我是否忽略了什么 这个功能有替代品吗 代码部分是这样的 include
  • 当端点和 PMA 地址均更改时,CubeMX 生成的 USB HID 设备发送错误数据

    我正在调试我正在创建的复合设备的问题 并在新生成的仅 CubeMX 代码中重新创建了该问题 以使其更容易解决 我添加了少量代码main 让我发送 USB HID 鼠标点击 并在按下蓝色按钮时使 LED 闪烁 uint8 t click re
  • STM32 传输结束时,循环 DMA 外设到存储器的行为如何?

    我想问一下 在以下情况下 STM32 中的 DMA SPI rx 会如何表现 我有一个指定的 例如 96 字节数组 名为 A 用于存储从 SPI 接收到的数据 我打开循环 SPI DMA 它对每个字节进行操作 配置为 96 字节 是否有可能
  • 为什么当大小大于 50 时,该程序花费的时间会呈指数级增长?

    所以我正在为类编写一个 ARM 汇编快速排序方法 我对大部分内容都有了解 除了复杂性没有意义 我们将其与我们制作的另一种冒泡排序方法进行比较 它对于具有 1 个参数和 10 个参数的示例表现更好 然而 我什至无法比较 100 个参数测试 因
  • 通过 MQTT 将 LoRa 测量结果发送到 Fiware IOT 代理

    我有 LoRa 传感器 它使用 Cayenne LPP 格式有效负载发送测量值 我的网关 LOrank8v1 捕获这些数据包并将其转换为 UDP 网关中有一个服务 lora gateway bridge 它将数据包从 UDP 转换为 TCP
  • AOSP 的“午餐”组合是什么意思?我需要选择什么?

    我是 Android 设备 ROM 开发的新手 无论如何 我现在正在为具有 64 位处理器的中国设备构建 AOSP 我按照 source android com 上的菜单进行操作 当我运行 午餐 命令时 终端显示 午餐菜单 选择一个组合 我
  • 什么是遗留中断?

    我正在开发一个项目 试图弄清楚 ARM 架构的全局中断控制器中如何处理中断 我正在使用 pl390 中断控制器 我看到有一条线被称为传统中断 它绕过了分配器逻辑 假设有 2 个中断可以被编程为传统中断 任何人都可以帮助解释一下什么是遗留中断
  • 如何获取结构体中任意成员的位位置

    如何获取结构体中任意成员的位位置 在示例中 gt typedef struct BitExamStruct unsigned int v1 3 unsigned int v2 4 unsigned int v3 5 unsigned int
  • 设备树不匹配:.probe 从未被调用

    我无法理解设备树的工作原理 或者具体来说为什么该驱动程序无法初始化 这是在 android 版本 3 10 的 rockchip 供应商内核中 驱动程序 看门狗 rk29 wdt c 为了可读性而减少 static const struct
  • 英特尔的最后分支记录功能是英特尔处理器独有的吗?

    最后分支记录是指存储与最近执行的分支相关的源地址和目标地址的寄存器对 MSR 的集合 它们受英特尔酷睿 2 英特尔至强和英特尔凌动处理器系列的支持 http css csail mit edu 6 858 2012 readings ia3
  • 需要一些建议来开始在 ARM(使用 Linux)平台上编程

    我 也许 很快就会在托管 Linux 发行版的 ARM 平台上工作 我不知道哪个发行版 我知道该项目涉及视频流 但我无法告诉你更多信息 其实我只收到通知 还没见到任何人 我从来没有在这样的平台上工作过 所以我的想法是在项目开始之前进行测试
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • 为什么前向引用 ADR 指令在 Thumb 代码中以偶数偏移进行汇编?

    To bx对于 Thumb 函数 需要设置地址的最低有效位 GNU 作为文档states https sourceware org binutils docs as ARM Opcodes html当地址是从一个生成时这是如何工作的adr伪
  • 上下文切换到安全模式(arm trustzone)的成本是多少

    我试图了解在arm中可信 安全 和非安全模式之间来回切换的成本 从非安全世界转移到安全世界时到底需要发生什么 我知道需要设置 ns 位 基于某些特殊指令 需要刷新和更新页表 刷新和更新处理器缓存 还有什么需要发生的吗 处理器缓存 它们是分段
  • 哪些 GCC 优化标志对二进制大小影响最大?

    我正在使用 GCC 为 ARM 开发 C 我遇到了一个问题 我没有启用优化 我无法创建二进制文件 ELF https en wikipedia org wiki Executable and Linkable Format 对于我的代码 因
  • ARM 的内核 Oops 页面错误错误代码

    Oops 之后的错误代码给出了有关 ARM EX 中的恐慌的信息 Oops 17 1 PREEMPT SMP在这种情况下 17 给出了信息 在 x86 中它代表 bit 0 0 no page found 1 protection faul
  • 直接写入 ARM Cortex A8 分支预测器中的全局历史缓冲区 (GHB) 或 BTB?

    我有兴趣直接修改 Cortex A8 上的 BTB 分支目标缓冲区 和 GHB 的内容 ARM 手册上有这样的内容 要在指令端 GHB 数组中写入一项 例如 LDR R0 0x3333AAAA MCR p15 0 R0 c15 c1 0 M

随机推荐