stm32f103c8t6+sx1278无线433lora程序分享,安信可sx1278模块远距离无线传输.
#include "stm32f10x.h"
#include "HAL_uart.h"
#include "usmart.h"
#include "string.h"
#include "radio.h"
#include "delay.h"
#define USE_BAND_433 // 选择一个频率
#define USE_MODEM_LORA // 选择lora模式
#if defined(USE_BAND_433)
#define RF_FREQUENCY 434000000 // Hz
#elif defined(USE_BAND_780)
#define RF_FREQUENCY 780000000 // Hz
#elif defined(USE_BAND_868)
#define RF_FREQUENCY 868000000 // Hz
#elif defined(USE_BAND_915)
#define RF_FREQUENCY 915000000 // Hz
#else
#error "Please define a frequency band in the compiler options."
#endif
#define TX_OUTPUT_POWER 20 // dBm
#if defined(USE_MODEM_LORA)
#define LORA_BANDWIDTH 0 // [0: 125 kHz, 1: 250 kHz, 2: 500 kHz, 3: 保留]
#define LORA_SPREADING_FACTOR 7 // [SF7..SF12]
#define LORA_CODINGRATE 1 // [1: 4/5, 2: 4/6, 3: 4/7, 4: 4/8]
#define LORA_PREAMBLE_LENGTH 8 // 发送和接收的前导码长度相同
#define LORA_SYMBOL_TIMEOUT 5 // 符号
#define LORA_FIX_LENGTH_PAYLOAD_ON false
#define LORA_IQ_INVERSION_ON false
#elif defined(USE_MODEM_FSK)
#define FSK_FDEV 25e3 // Hz
#define FSK_DATARATE 50e3 // bps
#define FSK_BANDWIDTH 50e3 // Hz
#define FSK_AFC_BANDWIDTH 83.333e3 // Hz
#define FSK_PREAMBLE_LENGTH 5 // 发送和接收的前导码长度相同
#define FSK_FIX_LENGTH_PAYLOAD_ON false
#else
#error "Please define a modem in the compiler options."
#endif
#define RX_TIMEOUT_VALUE 1000
#define BUFFER_SIZE 64 // 定义数据包大小
#define MSG "hello"
uint16_t BufferSize = BUFFER_SIZE;
uint8_t Buffer[BUFFER_SIZE];
int8_t RssiValue = 0;
int8_t SnrValue = 0;
/*!
* 定义射频事件函数指针的结构体:RadioEvents
*/
static RadioEvents_t RadioEvents;
/*!
* \brief 射频发送完成事件处理函数
*/
void OnTxDone(void);
/*!
* \brief 射频接收完成事件处理函数
*/
void OnRxDone(uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr);
/*!
* \brief 射频发送超时事件处理函数
*/
void OnTxTimeout(void);
/*!
* \brief 射频接收超时事件处理函数
*/
void OnRxTimeout(void);
/*!
* \brief 射频接收错误事件处理函数
*/
void OnRxError(void);
/*!
* USART1回调函数,用于处理接收到的数据
*/
void uart1callBackTest(uint8_t data);
/*!
* LED和按键初始化
*/
void ledInit(void);
int main(void)
{
bool isMaster = true; // 设定为主机
// bool isMaster = false; // 设定为从机
uint32_t count = 0;
delay_init(); // 延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 中断优先级分组配置
HALUart1Init(115200, uart1callBackTest);
ledInit();
if (isMaster)
{
printf("This is master\r\n");
}
else
{
printf("This is slave\r\n");
}
// 使用usmart库进行远程调试
usmart_dev.init(SystemCoreClock/1000000); // 初始化usmart
// 射频初始化
Radio.Init(&RadioEvents);
Radio.SetChannel(RF_FREQUENCY);
Radio.SetTxConfig(MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH,
LORA_SPREADING_FACTOR, LORA_CODINGRATE,
LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON,
true, 0, 0, LORA_IQ_INVERSION_ON, 3000);
Radio.SetRxConfig(MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR,
LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH,
LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON,
0, true, 0, 0, LORA_IQ_INVERSION_ON, true);
if (!isMaster)
{
Radio.Rx(RX_TIMEOUT_VALUE);
}
while (1)
{
if (isMaster)
{
count = 0;
while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13) == 0)
{
delay_ms(2);
if (count++ > 50)
{
// 按键被按下
printf("Sent message\r\n");
Radio.Send((uint8_t *)MSG, strlen(MSG));
delay_ms(3000);
}
}
}
}
}
/*!
* 射频发送完成事件处理函数
*/
void OnTxDone(void)
{
Radio.Sleep();
printf("TxDone\r\n");
}
/*!
* 射频接收完成事件处理函数
*/
void OnRxDone(uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr)
{
static bool ledStatus = false;
Radio.Sleep();
memset(Buffer, 0, BUFFER_SIZE);
BufferSize = size;
memcpy(Buffer, payload, BufferSize);
RssiValue = rssi;
SnrValue = snr;
printf("RxDone\r\nrssi:%d\r\nsnr:%d\r\nsize:%d\r\ndata:payload:%s\r\n", rssi, snr, size, payload);
if (strncmp((const char *)Buffer, (const char *)MSG, 4) == 0)
{
if (ledStatus)
{
GPIO_ResetBits(GPIOB, GPIO_Pin_12);
}
else
{
GPIO_SetBits(GPIOB, GPIO_Pin_12);
}
ledStatus = !ledStatus;
}
Radio.Rx(RX_TIMEOUT_VALUE);
}
/*!
* 射频发送超时事件处理函数
*/
void OnTxTimeout(void)
{
Radio.Sleep();
printf("TxTIMEOUT\r\n");
}
/*!
* 射频接收超时事件处理函数
*/
void OnRxTimeout(void)
{
Radio.Sleep();
printf("RxTIMEOUT retry recive\r\n");
Radio.Rx(RX_TIMEOUT_VALUE);
}
/*!
* 射频接收错误事件处理函数
*/
void OnRxError(void)
{
Radio.Sleep();
printf("RxError retry recive\r\n");
Radio.Rx(RX_TIMEOUT_VALUE);
}
/*!
* USART1回调函数,用于处理接收到的数据
*/
void uart1callBackTest(uint8_t data)
{
uint8_t Res;
Res = USART_ReceiveData(USART1); // 读取接收到的数据
if ((USART_RX_STA & 0x8000) == 0) // 接收未完成
{
if (USART_RX_STA & 0x4000) // 接收到了0x0d
{
if (Res != 0x0a)
USART_RX_STA = 0; // 接收错误,重新开始
else
USART_RX_STA |= 0x8000; // 接收完成
}
else // 还没收到0X0D
{
if (Res == 0x0d)
USART_RX_STA |= 0x4000;
else
{
USART_RX_BUF[USART_RX_STA & 0X3FFF] = Res;
USART_RX_STA++;
if (USART_RX_STA > (USART_REC_LEN - 1))
USART_RX_STA = 0; // 接收数据错误,重新开始接收
}
}
}
}
/*!
* LED和按键的初始化
*/
void ledInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// 初始化LED
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// 初始化按键
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
原理图: 无
仿真: 无
代码:
SX127xLED点对点控制demo.7z
(462.08 KB, 下载次数: 20)
|