蓝桥杯物联网竞赛_STM32L071_7_LORA发送接收

2023-12-03 02:12

本文主要是介绍蓝桥杯物联网竞赛_STM32L071_7_LORA发送接收,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

理论:

LoRa(长距离低功耗无线射频)是利用无线电频谱中的电磁波进行通信的一种技术。它使用无线电频段中的射频信号来传输数据。电磁波是一种波动形式的能量,具有特定的频率和波长,可以传播在真空和大多数介质中,包括空气、水和固体物质等。LoRa技术利用电磁波在射频范围内进行通信,使得设备可以进行远距离的低功耗数据传输。

在这里插入图片描述
其中PA4是控制数据的传输开始与结束的引脚,低电平有效

LORA发送的是电磁波,在真空中也能通信,具有一定的穿透性,传播范围在数十公里不等

SPI是Serial Peripheral Interface的缩写,是一种同步串行通信接口协议,用于在数字集成电路之间进行通信。SPI协议允许多个设备通过共享同一组数据线进行通信,其中一个设备作为主设备,其他设备作为从设备。SPI协议通常用于连接微控制器、传感器、存储器和其他外围设备。

蓝桥杯官方给了LORA的实现参考代码,我们需要做的是将上述SPI线路配置好,然后编写接口函数,让官方给的LORA功能能与SPI线路连接起来,最终能达到使用的目的

CubMx配置:

在这里插入图片描述
配置全双工即能边接收数据边发送数据

在这里插入图片描述
PA4配置为输出模式,因为需要它控制引脚高低电平,控制数据的传输接收与停止

Keil配置:

Function:

#include "Function.h"
#include "i2c.h"
#include "oled.h"
#include "gpio.h"
#include "spi.h"void OLED_Write(unsigned char type, unsigned char data){unsigned char Write_Data[2];Write_Data[0] = type;Write_Data[1] = data;HAL_I2C_Master_Transmit(&hi2c3, 0x78, Write_Data, 2, 0xff);
}void Function_OLedEnable(unsigned char ms){HAL_GPIO_WritePin(OLED_POWER_GPIO_Port, OLED_POWER_Pin, GPIO_PIN_RESET);HAL_Delay(ms);OLED_Init();
}unsigned char SPI_WriteRead(unsigned char address, unsigned char data){unsigned char TxData[2], RxData[2];TxData[0] = address;TxData[1] = data;HAL_GPIO_WritePin(SPI1_NSS_GPIO_Port, SPI1_NSS_Pin, GPIO_PIN_RESET); // 片选,传输开始HAL_SPI_TransmitReceive(&hspi1, TxData, RxData, sizeof(TxData), 0xff); // 传输与接受功能在一起HAL_GPIO_WritePin(SPI1_NSS_GPIO_Port, SPI1_NSS_Pin, GPIO_PIN_SET); // 关闭电源,表示传输结束return RxData[1]; // 获取接受数据
}
#ifndef __FUNCTION__
#define __FUNCTION__void OLED_Write(unsigned char type, unsigned char data);
void Function_OLedEnable(unsigned char ms);
unsigned char SPI_WriteRead(unsigned char address, unsigned char data);
#endif

main:

发送端即实验板A板

#include "main.h"
#include "i2c.h"
#include "spi.h"
#include "gpio.h"
#include "Function.h"
#include "oled.h"
#include "lora.h"void SystemClock_Config(void);int main(void)
{unsigned char TX[] = {'m', 'r', 6, 8, 8};HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_I2C3_Init();MX_SPI1_Init();/* USER CODE BEGIN 2 */Function_OLedEnable(50);LORA_Init(); // 初始化传输while (1){OLED_ShowNumber(0, 0, 1234, 4, 16);LORA_Tx(TX, sizeof(TX));OLED_ShowString(0, 2, "SendVictory", 16);}}void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_4;RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_2;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK){Error_Handler();}PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_I2C3;PeriphClkInit.I2c3ClockSelection = RCC_I2C3CLKSOURCE_PCLK1;if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK){Error_Handler();}
}void Error_Handler(void)
{__disable_irq();while (1){}}

接收端即实验板B板:

#include "main.h"
#include "i2c.h"
#include "spi.h"
#include "gpio.h"
#include "Function.h"
#include "oled.h"
#include "lora.h"void SystemClock_Config(void);int main(void)
{unsigned char Rec[5];HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_I2C3_Init();MX_SPI1_Init();/* USER CODE BEGIN 2 */Function_OLedEnable(50);LORA_Init(); // 初始化传输while (1){OLED_ShowNumber(0, 0, 1234, 4, 16);LORA_Rx(Rec);OLED_ShowChar(0, 2, Rec[0], 16);OLED_ShowChar(8, 2, Rec[1], 16);OLED_ShowNumber(16, 2, Rec[2], 1, 16);OLED_ShowNumber(24, 2, Rec[3], 1, 16);OLED_ShowNumber(32, 2, Rec[4], 1, 16);}}void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_4;RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_2;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK){Error_Handler();}PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_I2C3;PeriphClkInit.I2c3ClockSelection = RCC_I2C3CLKSOURCE_PCLK1;if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK){Error_Handler();}
}void Error_Handler(void)
{__disable_irq();while (1){}}

效果:

在这里插入图片描述

这篇关于蓝桥杯物联网竞赛_STM32L071_7_LORA发送接收的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/447701

相关文章

HTTP 与 SpringBoot 参数提交与接收协议方式

《HTTP与SpringBoot参数提交与接收协议方式》HTTP参数提交方式包括URL查询、表单、JSON/XML、路径变量、头部、Cookie、GraphQL、WebSocket和SSE,依据... 目录HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Ty

SpringBoot请求参数传递与接收示例详解

《SpringBoot请求参数传递与接收示例详解》本文给大家介绍SpringBoot请求参数传递与接收示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录I. 基础参数传递i.查询参数(Query Parameters)ii.路径参数(Path Va

基于Python实现自动化邮件发送系统的完整指南

《基于Python实现自动化邮件发送系统的完整指南》在现代软件开发和自动化流程中,邮件通知是一个常见且实用的功能,无论是用于发送报告、告警信息还是用户提醒,通过Python实现自动化的邮件发送功能都能... 目录一、前言:二、项目概述三、配置文件 `.env` 解析四、代码结构解析1. 导入模块2. 加载环

使用Python的requests库来发送HTTP请求的操作指南

《使用Python的requests库来发送HTTP请求的操作指南》使用Python的requests库发送HTTP请求是非常简单和直观的,requests库提供了丰富的API,可以发送各种类型的HT... 目录前言1. 安装 requests 库2. 发送 GET 请求3. 发送 POST 请求4. 发送

基于Python编写自动化邮件发送程序(进阶版)

《基于Python编写自动化邮件发送程序(进阶版)》在数字化时代,自动化邮件发送功能已成为企业和个人提升工作效率的重要工具,本文将使用Python编写一个简单的自动化邮件发送程序,希望对大家有所帮助... 目录理解SMTP协议基础配置开发环境构建邮件发送函数核心逻辑实现完整发送流程添加附件支持功能实现htm

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁

python运用requests模拟浏览器发送请求过程

《python运用requests模拟浏览器发送请求过程》模拟浏览器请求可选用requests处理静态内容,selenium应对动态页面,playwright支持高级自动化,设置代理和超时参数,根据需... 目录使用requests库模拟浏览器请求使用selenium自动化浏览器操作使用playwright

Python办公自动化实战之打造智能邮件发送工具

《Python办公自动化实战之打造智能邮件发送工具》在数字化办公场景中,邮件自动化是提升工作效率的关键技能,本文将演示如何使用Python的smtplib和email库构建一个支持图文混排,多附件,多... 目录前言一、基础配置:搭建邮件发送框架1.1 邮箱服务准备1.2 核心库导入1.3 基础发送函数二、

java向微信服务号发送消息的完整步骤实例

《java向微信服务号发送消息的完整步骤实例》:本文主要介绍java向微信服务号发送消息的相关资料,包括申请测试号获取appID/appsecret、关注公众号获取openID、配置消息模板及代码... 目录步骤1. 申请测试系统2. 公众号账号信息3. 关注测试号二维码4. 消息模板接口5. Java测试

Python使用smtplib库开发一个邮件自动发送工具

《Python使用smtplib库开发一个邮件自动发送工具》在现代软件开发中,自动化邮件发送是一个非常实用的功能,无论是系统通知、营销邮件、还是日常工作报告,Python的smtplib库都能帮助我们... 目录代码实现与知识点解析1. 导入必要的库2. 配置邮件服务器参数3. 创建邮件发送类4. 实现邮件