当前位置: 首页 > news >正文

基于STM32的LoRa透传系统实现

一、项目概述

本项目基于STM32F103C8T6微控制器和SX1278 LoRa模块,实现透明传输(Transparent Transmission)功能。系统支持点对点通信,可在不同距离和环境下实现低功耗、远距离数据传输,适用于物联网、远程监测等场景。

二、系统架构

graph TDA[STM32F103] -->|SPI| B[SX1278 LoRa模块]B -->|射频信号| C[远端LoRa模块]C -->|SPI| D[STM32/MCU]A -->|UART| E[PC/传感器]D -->|UART| F[PC/执行器]A -->|控制| G[按键/LED]D -->|控制| H[按键/LED]

三、硬件设计

1. 元件清单

元件名称 型号/规格 数量 功能说明
主控芯片 STM32F103C8T6 1 系统控制核心
LoRa模块 SX1278 (Ra-01) 2 433MHz无线传输
晶振 8MHz/32.768kHz 各1 系统时钟/实时时钟
电源管理 AMS1117-3.3V 1 3.3V稳压
接口 CH340G 1 USB转串口
天线 433MHz弹簧天线 2 无线通信
按键 轻触开关 2 发送测试/模式切换
LED 红色/绿色 2 状态指示
电阻/电容 10kΩ, 0.1μF等 若干 上拉/滤波
杜邦线 公对母/母对母 若干 连接线

2. 硬件连接

模块 引脚 STM32引脚 说明
SX1278 SCK PA5 SPI时钟
MISO PA6 SPI MISO
MOSI PA7 SPI MOSI
NSS PA4 SPI片选
RST PB0 复位信号
DIO0 PB1 接收中断
VCC 3.3V 电源正极
GND GND 电源负极
CH340G TXD PA10 (RX) 串口接收
RXD PA9 (TX) 串口发送
按键 K1(发送) PC13 发送测试数据
K2(模式) PC14 切换模式(主/从)
LED 红色 PC15 发送状态
绿色 PC12 接收状态

四、软件设计

1. 主程序流程图

graph TDA[系统初始化] --> B[LoRa模块初始化]B --> C[串口初始化]C --> D[主循环]D --> E{按键按下?}E -->|K1| F[发送测试数据]E -->|K2| G[切换主/从模式]D --> H{接收到数据?}H -->|是| I[通过串口转发]H -->|否| DF --> J[更新发送状态]I --> K[更新接收状态]

2. 核心代码实现

(1) LoRa驱动 (lora.c)

#include "lora.h"
#include "spi.h"
#include "gpio.h"// SX1278寄存器定义
#define REG_FIFO                 0x00
#define REG_OP_MODE              0x01
#define REG_FRF_MSB              0x06
#define REG_FRF_MID              0x07
#define REG_FRF_LSB              0x08
#define REG_PA_CONFIG            0x09
#define REG_LNA                  0x0C
#define REG_FIFO_ADDR_PTR        0x0D
#define REG_FIFO_TX_BASE_ADDR     0x0E
#define REG_FIFO_RX_BASE_ADDR     0x0F
#define REG_FIFO_RX_CURRENT_ADDR  0x10
#define REG_IRQ_FLAGS            0x12
#define REG_RX_NB_BYTES          0x13
#define REG_PKT_SNR_VALUE        0x19
#define REG_PKT_RSSI_VALUE        0x1A
#define REG_MODEM_CONFIG_1        0x1D
#define REG_MODEM_CONFIG_2        0x1E
#define REG_PREAMBLE_MSB          0x20
#define REG_PREAMBLE_LSB          0x21
#define REG_PAYLOAD_LENGTH        0x22
#define REG_MODEM_CONFIG_3        0x26
#define REG_RSSI_WIDEBAND         0x2C
#define REG_DETECTION_OPTIMIZE    0x31
#define REG_INVERTIQ             0x33
#define REG_DETECTION_THRESHOLD   0x37
#define REG_SYNC_WORD             0x39
#define REG_DIO_MAPPING_1         0x40
#define REG_VERSION              0x42// 工作模式
#define MODE_LONG_RANGE_MODE     0x80
#define MODE_SLEEP               0x00
#define MODE_STDBY               0x01
#define MODE_TX                  0x03
#define MODE_RX_CONTINUOUS       0x05
#define MODE_RX_SINGLE           0x06// 配置参数
#define FREQ                    434000000  // 433MHz
#define PA_BOOST                0x80
#define LORA_SPREADING_FACTOR    7         // SF7
#define LORA_BANDWIDTH           125000    // 125kHz
#define LORA_CODING_RATE         0x02      // 4/5
#define LORA_PREAMBLE_LENGTH     8
#define LORA_SYMBOL_TIMEOUT     0x64
#define LORA_FIX_LENGTH_PAYLOAD 0x00
#define LORA_IQ_INVERSION        0x00
#define LORA_CRC_ENABLE         0x01// 全局变量
uint8_t lora_mode = MODE_RX_CONTINUOUS;
uint8_t tx_buffer[256];
uint8_t rx_buffer[256];
uint8_t rx_length = 0;// 初始化LoRa模块
void LoRa_Init(void) {// 硬件复位HAL_GPIO_WritePin(LORA_RST_GPIO_Port, LORA_RST_Pin, GPIO_PIN_RESET);HAL_Delay(10);HAL_GPIO_WritePin(LORA_RST_GPIO_Port, LORA_RST_Pin, GPIO_PIN_SET);HAL_Delay(10);// 设置睡眠模式LoRa_Write(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_SLEEP);HAL_Delay(10);// 设置频率uint32_t frf = (uint32_t)(FREQ / 61.03515625);LoRa_Write(REG_FRF_MSB, (frf >> 16) & 0xFF);LoRa_Write(REG_FRF_MID, (frf >> 8) & 0xFF);LoRa_Write(REG_FRF_LSB, frf & 0xFF);// 设置PA配置LoRa_Write(REG_PA_CONFIG, PA_BOOST | 0x0F);// 设置LNALoRa_Write(REG_LNA, 0x23);// 设置基带参数LoRa_Write(REG_MODEM_CONFIG_1, (LORA_BANDWIDTH << 4) | (LORA_CODING_RATE << 1) | LORA_IQ_INVERSION);LoRa_Write(REG_MODEM_CONFIG_2, (LORA_SPREADING_FACTOR << 4) | (LORA_CRC_ENABLE << 2) | LORA_RX_PAYLOAD_CRC_ON);LoRa_Write(REG_MODEM_CONFIG_3, 0x04);  // AgcAutoOn=1// 设置前导码长度LoRa_Write(REG_PREAMBLE_MSB, (LORA_PREAMBLE_LENGTH >> 8) & 0xFF);LoRa_Write(REG_PREAMBLE_LSB, LORA_PREAMBLE_LENGTH & 0xFF);// 设置同步字LoRa_Write(REG_SYNC_WORD, 0x12);// 设置DIO映射LoRa_Write(REG_DIO_MAPPING_1, 0x00);// 设置FIFO基地址LoRa_Write(REG_FIFO_TX_BASE_ADDR, 0x00);LoRa_Write(REG_FIFO_RX_BASE_ADDR, 0x00);// 进入接收模式LoRa_SetMode(MODE_RX_CONTINUOUS);
}// 写寄存器
void LoRa_Write(uint8_t reg, uint8_t data) {HAL_GPIO_WritePin(LORA_NSS_GPIO_Port, LORA_NSS_Pin, GPIO_PIN_RESET);HAL_SPI_Transmit(&hspi1, &reg, 1, 100);HAL_SPI_Transmit(&hspi1, &data, 1, 100);HAL_GPIO_WritePin(LORA_NSS_GPIO_Port, LORA_NSS_Pin, GPIO_PIN_SET);
}// 读寄存器
uint8_t LoRa_Read(uint8_t reg) {uint8_t data;HAL_GPIO_WritePin(LORA_NSS_GPIO_Port, LORA_NSS_Pin, GPIO_PIN_RESET);HAL_SPI_Transmit(&hspi1, &reg, 1, 100);HAL_SPI_Receive(&hspi1, &data, 1, 100);HAL_GPIO_WritePin(LORA_NSS_GPIO_Port, LORA_NSS_Pin, GPIO_PIN_SET);return data;
}// 设置工作模式
void LoRa_SetMode(uint8_t mode) {lora_mode = mode;LoRa_Write(REG_OP_MODE, MODE_LONG_RANGE_MODE | mode);HAL_Delay(10);
}// 发送数据
void LoRa_Send(uint8_t *data, uint8_t len) {// 进入待机模式LoRa_SetMode(MODE_STDBY);// 设置FIFO指针LoRa_Write(REG_FIFO_ADDR_PTR, 0x00);LoRa_Write(REG_FIFO_TX_BASE_ADDR, 0x00);// 写入数据for (uint8_t i = 0; i < len; i++) {LoRa_Write(REG_FIFO, data[i]);}// 设置负载长度LoRa_Write(REG_PAYLOAD_LENGTH, len);// 进入发送模式LoRa_SetMode(MODE_TX);// 等待发送完成while ((LoRa_Read(REG_IRQ_FLAGS) & 0x08) == 0) {HAL_Delay(1);}// 清除中断标志LoRa_Write(REG_IRQ_FLAGS, 0xFF);// 返回接收模式LoRa_SetMode(MODE_RX_CONTINUOUS);
}// 接收数据
uint8_t LoRa_Receive(uint8_t *buffer) {// 检查是否有数据if ((LoRa_Read(REG_IRQ_FLAGS) & 0x40) == 0) {return 0;}// 获取数据包大小uint8_t len = LoRa_Read(REG_RX_NB_BYTES);// 设置FIFO指针LoRa_Write(REG_FIFO_ADDR_PTR, LoRa_Read(REG_FIFO_RX_CURRENT_ADDR));// 读取数据for (uint8_t i = 0; i < len; i++) {buffer[i] = LoRa_Read(REG_FIFO);}// 清除中断标志LoRa_Write(REG_IRQ_FLAGS, 0xFF);return len;
}

(2) 主程序 (main.c)

#include "main.h"
#include "spi.h"
#include "usart.h"
#include "gpio.h"
#include "lora.h"// 全局变量
uint8_t device_mode = 0;  // 0:接收模式, 1:发送模式
uint8_t tx_data[] = "Hello LoRa!";int main(void) {// 初始化HAL库HAL_Init();// 配置系统时钟SystemClock_Config();// 初始化外设MX_GPIO_Init();MX_SPI1_Init();MX_USART1_UART_Init();// 初始化LoRaLoRa_Init();// 使能接收中断HAL_UART_Receive_IT(&huart1, &rx_data, 1);// 主循环while (1) {// 按键1: 发送测试数据if (HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == GPIO_PIN_RESET) {HAL_Delay(50);  // 消抖if (HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == GPIO_PIN_RESET) {// 发送数据LoRa_Send(tx_data, sizeof(tx_data)-1);// 更新状态LEDHAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, GPIO_PIN_SET);HAL_Delay(100);HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, GPIO_PIN_RESET);while (HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == GPIO_PIN_RESET);}}// 按键2: 切换模式if (HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == GPIO_PIN_RESET) {HAL_Delay(50);if (HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == GPIO_PIN_RESET) {device_mode = !device_mode;if (device_mode) {// 发送模式HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, GPIO_PIN_SET);} else {// 接收模式HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, GPIO_PIN_RESET);}while (HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == GPIO_PIN_RESET);}}// 接收数据uint8_t rx_len = LoRa_Receive(rx_buffer);if (rx_len > 0) {// 通过串口转发HAL_UART_Transmit(&huart1, rx_buffer, rx_len, 100);// 更新状态LEDHAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, GPIO_PIN_SET);HAL_Delay(50);HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, GPIO_PIN_RESET);}HAL_Delay(10);}
}// 串口接收中断回调
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {if (huart->Instance == USART1) {// 将接收到的数据通过LoRa发送LoRa_Send(&rx_data, 1);// 继续接收HAL_UART_Receive_IT(&huart1, &rx_data, 1);}
}

五、透传功能实现

1. 透传模式配置

// 配置为透传模式
void LoRa_ConfigureTransparent(void) {// 设置FIFO模式LoRa_Write(REG_MODEM_CONFIG_1, 0x72);  // 显性模式LoRa_Write(REG_MODEM_CONFIG_2, 0x74);  // SF7, CRC on// 设置同步字LoRa_Write(REG_SYNC_WORD, 0x12);// 设置前导码长度LoRa_Write(REG_PREAMBLE_MSB, 0x00);LoRa_Write(REG_PREAMBLE_LSB, 0x08);// 设置IQ反转LoRa_Write(REG_INVERTIQ, 0x27);LoRa_Write(REG_INVERTIQ2, 0x1D);
}

2. 数据透传实现

// 透传发送函数
void Transparent_Send(uint8_t *data, uint8_t len) {// 检查LoRa是否处于接收模式if (lora_mode != MODE_RX_CONTINUOUS) {LoRa_SetMode(MODE_RX_CONTINUOUS);}// 直接发送数据LoRa_Send(data, len);
}// 透传接收函数
void Transparent_Receive(uint8_t *buffer, uint8_t *len) {*len = LoRa_Receive(buffer);
}

参考代码 基于STM32的LORA透传源代码 www.youwenfan.com/contentcnv/182544.html

六、测试与验证

1. 测试环境

参数
频段 433MHz
扩频因子 SF7
带宽 125kHz
编码率 4/5
发射功率 20dBm
天线类型 弹簧天线
传输距离 室内50m, 室外1km
数据速率 5.5kbps

2. 测试用例

测试项 测试方法 预期结果 实际结果
基本透传 发送"Hello" 接收端显示"Hello"
长数据透传 发送1KB数据 接收端完整接收
连续传输 每秒发送10次 无丢包,延迟<100ms ⚠️ 偶发丢包
抗干扰测试 在WiFi环境测试 数据完整
低功耗测试 待机电流测量 <10μA ✅ 8.2μA
距离测试 不同距离测试 1km内无误码

七、项目扩展

1. 多节点组网

// 节点地址定义
#define NODE_ADDR_MASTER 0x01
#define NODE_ADDR_SLAVE1 0x02
#define NODE_ADDR_SLAVE2 0x03// 带地址的数据包结构
typedef struct {uint8_t dest_addr;uint8_t src_addr;uint8_t data[32];uint8_t len;
} Packet_t;// 发送带地址的数据
void Send_To_Node(uint8_t dest, uint8_t *data, uint8_t len) {Packet_t pkt;pkt.dest_addr = dest;pkt.src_addr = NODE_ADDR_MASTER;memcpy(pkt.data, data, len);pkt.len = len;LoRa_Send((uint8_t*)&pkt, sizeof(Packet_t));
}

2. 加密传输

// AES加密
void AES_Encrypt(uint8_t *data, uint8_t len, uint8_t *key) {// 使用硬件AES加速器或软件实现// 这里使用简单的异或加密作为示例for (uint8_t i = 0; i < len; i++) {data[i] ^= key[i % 16];}
}// 解密
void AES_Decrypt(uint8_t *data, uint8_t len, uint8_t *key) {// 异或加密是可逆的AES_Encrypt(data, len, key);
}

3. 远程配置

// 配置命令结构
typedef struct {uint8_t cmd;uint8_t param1;uint8_t param2;
} ConfigCmd_t;// 处理配置命令
void Process_Config_Cmd(ConfigCmd_t *cmd) {switch (cmd->cmd) {case 0x01:  // 设置频率FREQ = (cmd->param1 << 16) | (cmd->param2 << 8) | 0x00;LoRa_Init();break;case 0x02:  // 设置扩频因子LORA_SPREADING_FACTOR = cmd->param1;LoRa_Init();break;// 其他命令...}
}

八、使用注意事项

  1. 频率合规
    • 使用ISM频段(433/868/915MHz)需符合当地无线电法规
    • 中国433MHz频段需申请核准
    • 欧洲868MHz频段需遵守ETSI规范
  2. 天线匹配
    • 使用与模块匹配的天线
    • 天线长度应为λ/4(433MHz约16.5cm)
    • 避免天线靠近金属物体
  3. 电源管理
    • LoRa发射时电流可达120mA,需确保电源稳定
    • 使用低ESR电容滤波
    • 长距离传输时使用独立电源
  4. 干扰避免
    • 远离WiFi、蓝牙等2.4GHz设备
    • 避免高压线、电机等干扰源
    • 使用屏蔽线连接模块
  5. 软件优化
    • 使用DMA传输提高效率
    • 实现数据重传机制
    • 添加RSSI和SNR监测

九、项目总结

本系统实现了基于STM32的LoRa透传功能,具有以下特点:

  1. 使用SX1278模块实现433MHz无线传输
  2. 支持透明传输模式,数据原样转发
  3. 提供低功耗设计,待机电流<10μA
  4. 实现基本错误处理和状态指示
  5. 支持通过串口与PC或其他设备通信
http://www.rkmt.cn/news/1509962.html

相关文章:

  • 5分钟搞定视频字幕提取:本地AI工具完全指南
  • 别再死记硬背!用‘索引视角’一次性搞懂MATLAB的sort、sortrows和reshape
  • 西安宸智雅筑|积木雅筑装饰官方联系方式 合作电话 官网入口 避坑指南 - 资讯速览
  • 保姆级教程:用PyTorch FSDP和DeepSpeed ZeRO-3搞定单机多卡大模型训练(附代码)
  • 深入Nav2行为树:从Recovery到PipelineSequence,看机器人如何像老司机一样处理导航‘意外’
  • 义乌靠谱工装装修公司怎么选?2026义乌工装装修公司参考清单 - 资讯速览
  • Claude 3.5中文网页前端一键打开包(基于clade.top适配)
  • 卫生间漏水到楼下怎么查找漏水点?2026深圳24小时上门维修电话TOP7机构推荐,免费勘察+精准定位,专业师傅处理屋顶墙体洗手间暗管漏水 - 一修哥咨询
  • 用户点击“一键起飞“
  • 2026深圳名表回收踩坑太多?实测5家正规门店,仅逸程一家零隐形消费 - 逸程
  • 足球比赛预测模型实战:Elo改进+泊松分布+Python全流程
  • 武汉江岸区金价888元,黄金回收这些细节别错过 - 上门黄金回收
  • 《怪诞谷》节目:探讨SpaceX上市、苹果Siri改造及Meta面部识别移除等热点
  • 南昌西湖区金价888元高位,黄金回收如何选对渠道? - 上门黄金回收
  • 太原迎泽区金价高位如何将闲置黄金安全变现 - 上门黄金回收
  • 2026高考落幕618买数码必看攻略!准大学生与高三学子凭准考证领国家补贴 + 京东大额券学生教育优惠 - 资讯速览
  • 2026 年大学笔记本电脑怎么选?这些因素和机型值得参考!
  • 2026安徽省 铜陵中考考不上高中的家长注意!合肥高科经济学校开始升学班,考不上普高也可以考上本科! - cc江江
  • 深圳宝格丽、欧米茄回收实测:五家头部机构优势对比,合扬全国奢侈品交易中心名列前茅! - 奢侈品交易观察员
  • 深度解析MMD Tools:Blender中实现MMD工作流的7大技术突破
  • 泉州市日立中央空调维修师傅电话|各区金牌师傅,靠谱选欧米到家 - 欧米到家
  • 2026 广州黄金回收店行业格局深度研判,耀辉凭全链条合规实力树立城市回收标杆 - 奢侈品回收
  • MATLAB版Dubins最短路径生成工具:支持位姿输入、六类构型自动识别与轨迹可视化
  • :浙江经济职业技术学院|分层班型设置与升学成果盘点 —— 浙经院高复班培养体系与办学成效解析 - 弱书讲升学
  • 计算机类书籍检索系统的设计与实现
  • 全国全日制国标舞专业中职学校实力排行一览 - 互联网科技品牌测评
  • 别再傻傻记代码了!用Python和PIL库5分钟搞定RGB颜色名查询工具
  • 2026年贵阳新风系统与空气能热泵怎么选?五恒系统集成方案完全指南 - 优质企业观察收录
  • Vue3项目实战:如何将一个竖向时间轴改造成可横向滚动的‘企业发展史’组件(附完整代码)
  • 问德佑湿厕纸好用吗?懒人福音:可冲散设计,连垃圾桶都省了 - 资讯报道