stm32Hal库与AS32_TTL lora模块通讯

文章展示了在STM32f407zet6单片机上使用UART5进行Lora通信的配置过程,包括定义常量、结构体以及初始化和传输函数。代码中定义了Lora参数结构体,用于设置模块的头、地址、频道和选项,并提供了透传和定向传输的发送函数。在主函数中,有一个测试任务周期性地发送数据。
摘要由CSDN通过智能技术生成

赶时间!赶时间! 请直接看代码!

单片机使用的是 STM32f407zet6 通讯串口使用的是 uart5 波特率9600

Lora.h

/*
 * Lora.h
 *
 *  Created on: Jan 6, 2023
 *      Author: Administrator
 */

#ifndef USER_LORA_H_
#define USER_LORA_H_


#ifndef true
#define true 1
#endif

#ifndef false
#define false 0
#endif



#define DEFAULT_HEAD 0XC0
#define DEFAULT_ADDH 0X00
#define DEFAULT_ADDL 0X02
#define DEFAULT_CHANEL 0X17
#define DEFAULT_SPEED  0X1A
#define DEFAULT_OPTION 0X40

#define MAX_TT_COUNT 64

typedef struct
{
	uint8_t HEAD;//固定头 0xc0 or 0xc2(掉电保存)
	uint8_t ADDH;//模块地址高字节
	uint8_t ADDL;//模块地址低字节
	union
	{
		uint8_t SPEED;//速率参数 包括串口速率和空中速率
		struct
		{
			uint8_t SPEEDbit0:1;
			uint8_t SPEEDbit1:1;
			uint8_t SPEEDbit2:1;
			uint8_t SPEEDbit3:1;
			uint8_t SPEEDbit4:1;
			uint8_t SPEEDbit5:1;
			uint8_t SPEEDbit6:1;
			uint8_t SPEEDbit7:1;
		};
	};

	uint8_t CHAN;//通讯盘【频率 0x00-0X1F
	union
	{
		uint8_t OPTION;//
		struct
		{
			uint8_t OPTIONbit0:1;
			uint8_t OPTIONbit1:1;
			uint8_t OPTIONbit2:1;
			uint8_t OPTIONbit3:1;
			uint8_t OPTIONbit4:1;
			uint8_t OPTIONbit5:1;
			uint8_t OPTIONbit6:1;
			uint8_t OPTIONbit7:1;
		};
	};
}ParameterData;


typedef struct
{
	uint8_t ADDH;
	uint8_t ADDL;
	uint8_t CHANEL;
	uint8_t tt_buff[MAX_TT_COUNT];
}TT_buff;//透传数据包

typedef enum
{
	MOD0 = 0x00,//透明传输模式
	MOD1,//定向传输模式
}LORA_TRANSMIT_MOD;


extern ParameterData GloraInitParemeter;


void userDelay(uint32_t ms);
void LoraInit();
void LoraParameterSet(ParameterData cmd,uint8_t length);
HAL_StatusTypeDef TemporarySetParameter(ParameterData parameter);
HAL_StatusTypeDef TT_LoraTransmit(uint8_t* data,uint8_t length );
HAL_StatusTypeDef BT_LoraTransmit(uint16_t addres,uint8_t chanel, uint8_t *data, uint8_t length);

#endif /* USER_LORA_H_ */

Lora.c

/*
 * Lora.c
 *
 *  Created on: Jan 6, 2023
 *      Author: Administrator
 */

#include "gpio.h"
#include "Lora.h"
//#include "FreeRTOS.h"
#include "main.h"
//#include "task.h"
//#include "cmsis_os.h"
#include "usart.h"
#include "string.h"
//#include "usbd_cdc_if.h"


//#define RTOS_DEL false//若使用了FreeRtos则取消该注释 将HAL_DEL  改为 false
#define HAL_DEL true
ParameterData LoraCmd;
ParameterData GloraInitParemeter;

static TT_buff bt_buff;

void userDelay(uint32_t ms)
{
#if HAL_DEL
HAL_Delay(ms);
#endif

#if RTOS_DEL
	osDelay(ms);
#endif
}


//lora初始化
//根据需要修改配置参数参数
void LoraInit()
{
	GloraInitParemeter.HEAD = 0xC0;
	GloraInitParemeter.ADDH = 0x00;
	GloraInitParemeter.ADDL = 0x06;
	GloraInitParemeter.SPEED = 0x1A;
	GloraInitParemeter.CHAN = 0x19;
	GloraInitParemeter.OPTION = 0xC0;//0xc0定向传输,0x40透明传输

	LoraParameterSet(GloraInitParemeter,sizeof(GloraInitParemeter));
}

//lora 参数配置
void LoraParameterSet(ParameterData cmd,uint8_t length)
{
	//模块进入休眠模式
	HAL_GPIO_WritePin(MD0_GPIO_Port, MD0_Pin, GPIO_PIN_SET);
	HAL_GPIO_WritePin(MD1_GPIO_Port, MD1_Pin, GPIO_PIN_SET);
	userDelay(100);
	HAL_UART_Transmit_IT(&huart5, (uint8_t *)&cmd, length);
//	HAL_UART_Transmit_IT(&huart1, (uint8_t *)&cmd, length);
	userDelay(100);
	HAL_GPIO_WritePin(MD0_GPIO_Port, MD0_Pin, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(MD1_GPIO_Port, MD1_Pin, GPIO_PIN_RESET);
	userDelay(100);
}

/*临时修改参数
 *
 */
HAL_StatusTypeDef TemporarySetParameter(ParameterData parameter)
{
	ParameterData loraInitParemeter;

	loraInitParemeter.HEAD = 0xC2;//掉电不保存
	loraInitParemeter.ADDH = parameter.ADDH;
	loraInitParemeter.ADDL = parameter.ADDL;
	loraInitParemeter.SPEED = parameter.SPEED;
	loraInitParemeter.CHAN = parameter.CHAN;
	loraInitParemeter.OPTION = parameter.OPTION;

	LoraParameterSet(loraInitParemeter,sizeof(loraInitParemeter));

	return HAL_OK;
}


//透传发送函数
HAL_StatusTypeDef TT_LoraTransmit(uint8_t* data,uint8_t length )
{
	HAL_UART_Transmit_IT(&huart5, data, length);

	return HAL_OK;
}

//定向传输
HAL_StatusTypeDef BT_LoraTransmit(uint16_t addres,uint8_t chanel, uint8_t *data,uint8_t length )
{
	uint8_t leng = length;

	memset((uint8_t *)&bt_buff,0,sizeof(bt_buff));

	bt_buff.ADDH = (uint8_t)(addres>>8);
	bt_buff.ADDL = (uint8_t)addres;
	bt_buff.CHANEL = chanel;
	
	memcpy((uint8_t *)&bt_buff.tt_buff,(uint8_t *)data,leng);
	HAL_UART_Transmit_IT(&huart5, (uint8_t *)&bt_buff, leng + 3);

	return HAL_OK;

main.c中测试函数

void StartTask03(void const * argument)
{
  /* USER CODE BEGIN StartTask03 */

	uint8_t testArray[7] = "hello\r\n";
	uint8_t chanel = 0x17;
	uint16_t address = 0x0005;


  /* Infinite loop */
  for(;;)
  {
	  HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
	  BT_LoraTransmit(address,chanel,(uint8_t *)&testArray,sizeof(testArray));
	  osDelay(1500);
  }
  /* USER CODE END StartTask03 */
}

试验结果
在这里插入图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值