赶时间!赶时间! 请直接看代码!
单片机使用的是 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 */
}
试验结果