蓝桥杯物联网竞赛_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

相关文章

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

Python手搓邮件发送客户端

《Python手搓邮件发送客户端》这篇文章主要为大家详细介绍了如何使用Python手搓邮件发送客户端,支持发送邮件,附件,定时发送以及个性化邮件正文,感兴趣的可以了解下... 目录1. 简介2.主要功能2.1.邮件发送功能2.2.个性签名功能2.3.定时发送功能2. 4.附件管理2.5.配置加载功能2.6.

解决Cron定时任务中Pytest脚本无法发送邮件的问题

《解决Cron定时任务中Pytest脚本无法发送邮件的问题》文章探讨解决在Cron定时任务中运行Pytest脚本时邮件发送失败的问题,先优化环境变量,再检查Pytest邮件配置,接着配置文件确保SMT... 目录引言1. 环境变量优化:确保Cron任务可以正确执行解决方案:1.1. 创建一个脚本1.2. 修

详解Spring Boot接收参数的19种方式

《详解SpringBoot接收参数的19种方式》SpringBoot提供了多种注解来接收不同类型的参数,本文给大家介绍SpringBoot接收参数的19种方式,感兴趣的朋友跟随小编一起看看吧... 目录SpringBoot接受参数相关@PathVariable注解@RequestHeader注解@Reque

Django中使用SMTP实现邮件发送功能

《Django中使用SMTP实现邮件发送功能》在Django中使用SMTP发送邮件是一个常见的需求,通常用于发送用户注册确认邮件、密码重置邮件等,下面我们来看看如何在Django中配置S... 目录1. 配置 Django 项目以使用 SMTP2. 创建 Django 应用3. 添加应用到项目设置4. 创建

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines

SpringBoot中Get请求和POST请求接收参数示例详解

《SpringBoot中Get请求和POST请求接收参数示例详解》文章详细介绍了SpringBoot中Get请求和POST请求的参数接收方式,包括方法形参接收参数、实体类接收参数、HttpServle... 目录1、Get请求1.1 方法形参接收参数 这种方式一般适用参数比较少的情况,并且前后端参数名称必须

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

Android中如何实现adb向应用发送特定指令并接收返回

1 ADB发送命令给应用 1.1 发送自定义广播给系统或应用 adb shell am broadcast 是 Android Debug Bridge (ADB) 中用于向 Android 系统发送广播的命令。通过这个命令,开发者可以发送自定义广播给系统或应用,触发应用中的广播接收器(BroadcastReceiver)。广播机制是 Android 的一种组件通信方式,应用可以监听广播来执行

C语言蓝桥杯

一、语言基础 竞赛常用库函数 最值查询 min_element和max_element在vector(迭代器的使用) nth_element函数的使用 例题lanqiao OJ 497成绩分析 第一种用min_element和max_element函数的写法 第二种用min和max的写法 二分查找 二分查找只能对数组操作 binary_s