本帖最后由 publicpeople 于 2020-6-23 19:26 编辑
RT-Thread使用情况概述 主控器使用RT-Thread作为操作系统,进行任务调度。RT-thread使用的版本是3.1.2,直接使用KEIL添加到工程中。
由于直接采用KEIL添加的方式,与我使用的ES32_SDK_V1.07部分函数冲突。需要将SDK中iqr.c中的voidSysTick_Handler(void)、void PendSV_Handler(void)、void HardFault_Handler(void)进行注释。 硬件框架
本产品主要是Lora 通信接口的移植。本方案主要采用口模拟行的SPI通信。
主控器通过按键获取不同机井的控制状态,通过Lora 向周围的分控器发送指令。完成对终端的控制。 软件框架说明
软件模块说明 /**
*********************************************************************************
*
* @file main.c
* @brief Main file for DEMO
*
* @version V1.0
* @date 17 Nov 2017
* @author AE Team
* @NOTE
*
* Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved.
*
*********************************************************************************
*/ #include <string.h>
#include "main.h"
#include "ald_gpio.h"
#include "ald_cmu.h"
#include "ald_rtc.h"
#include "dido.h"
#include "timer.h"
//lora start
#include <stdbool.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <math.h>
#include <string.h>
#include "radio.h"
#include "sx126x.h"
#include "sx126x-board.h"
#include "SPI_IO.h"
#define HAL_MAX_DELAY 0xFFFFFFFFU
#if defined( USE_BAND_868 ) #define RF_FREQUENCY 868000000 // Hz #elif defined( USE_BAND_915 ) #define RF_FREQUENCY 915000000 // Hz #elif defined( USE_BAND_433 ) #define RF_FREQUENCY 433000000 // Hz #else
#error "Please define a frequency band in the compiler options."
#endif #define TX_OUTPUT_POWER 14 // dBm #define LORA_BANDWIDTH 2 // [0: 125 kHz,
// 1: 250 kHz,
// 2: 500 kHz,
// 3: Reserved]
#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 108 // Same for Tx and Rx
#define LORA_SYMBOL_TIMEOUT 100 // Symbols
#define LORA_FIX_LENGTH_PAYLOAD_ON false
#define LORA_IQ_INVERSION_ON false
#define LORA_FIX_LENGTH_PAYLOAD_LEN 19 typedef enum
{
LOWPOWER,
RX,
RX_TIMEOUT,
RX_ERROR,
TX,
TX_TIMEOUT,
START_CAD,
}States_t; typedef enum
{
CAD_FAIL,
CAD_SUCCESS,
PENDING,
}CadRx_t; #define RX_TIMEOUT_VALUE 4000
#define BUFFER_SIZE 64 // Define the payload size here uint16_t BufferSize = BUFFER_SIZE;
uint8_t Buffer[BUFFER_SIZE]; States_t State = LOWPOWER; int8_t RssiValue = 0;
int8_t SnrValue = 0; /*!
* CAD performance evaluation's parameters
*/
#define RX_FW 1
#define TX_FW 0 //TX_FW is only for test
#define FULL_DBG 1 //Active all traces #if(RX_FW == TX_FW)
#error "Please define only one firmware."
#endif
CadRx_t CadRx = CAD_FAIL;
bool PacketReceived = false;
bool RxTimeoutTimerIrqFlag = false;
uint16_t channelActivityDetectedCnt = 0;
uint16_t RxCorrectCnt = 0;
uint16_t RxErrorCnt = 0;
uint16_t RxTimeoutCnt = 0;
uint16_t SymbTimeoutCnt = 0;
int16_t RssiMoy = 0;
int8_t SnrMoy = 0;
//CAD parameters
#define CAD_SYMBOL_NUM LORA_CAD_02_SYMBOL
#define CAD_DET_PEAK 22
#define CAD_DET_MIN 10
#define CAD_TIMEOUT_MS 2000
#define NB_TRY 10
/*!
* Radio events function pointer
*/
static RadioEvents_t RadioEvents; /*!
* \brief Function to be executed on Radio Tx Done event
*/
void OnTxDone( void ); /*!
* \brief Function to be executed on Radio Rx Done event
*/
void OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr ); /*!
* \brief Function executed on Radio Tx Timeout event
*/
void OnTxTimeout( void ); /*!
* \brief Function executed on Radio Rx Timeout event
*/
void OnRxTimeout( void ); /*!
* \brief Function executed on Radio Rx Error event
*/
void OnRxError( void ); /*!
* \brief Function executed on Radio CAD Done event
*/
void OnCadDone( bool channelActivityDetected); /*!
* \brief Function configuring CAD parameters
* \param [in] cadSymbolNum The number of symbol to use for CAD operations
* [LORA_CAD_01_SYMBOL, LORA_CAD_02_SYMBOL,
* LORA_CAD_04_SYMBOL, LORA_CAD_08_SYMBOL,
* LORA_CAD_16_SYMBOL]
* \param [in] cadDetPeak Limit for detection of SNR peak used in the CAD
* \param [in] cadDetMin Set the minimum symbol recognition for CAD
* \param [in] cadTimeout Defines the timeout value to abort the CAD activity
*/
void SX126xConfigureCad( RadioLoRaCadSymbols_t cadSymbolNum, uint8_t cadDetPeak, uint8_t cadDetMin , uint32_t cadTimeout); /*!
* \brief CAD timeout timer callback
*/
static void CADTimeoutTimeoutIrq( void ); /*!
* \brief Rx timeout timer callback
*/
static void RxTimeoutTimerIrq( void ); /*!
* \brief Average the collected RSSIs during CAD
*/
int8_t AverageCadRssi( void ); /*!
* \brief Get the last good RSSI during CAD
*/
int8_t GetLastCadRssi( void ); /*!
* \brief Display collected RSSIs each ms during CAD
*/
void DisplayCadRssivsTime( void ); uint32_t uwTick;
__weak void HAL_IncTick(void)
{
uwTick += 1;
} /**
* @brief Provides a tick value in millisecond.
* @NOTE This function is declared as __weak to be overwritten in case of other
* implementations in user file.
* @retval tick value
*/
__weak uint32_t HAL_GetTick(void)
{
return uwTick;
} __weak void HAL_Delay(uint32_t Delay)//?óê±oá??
{
uint32_t tickstart = HAL_GetTick();
uint32_t wait = Delay; /* Add a period to guaranty minimum wait */
if (wait < HAL_MAX_DELAY)
{
wait++;
} while((HAL_GetTick() - tickstart) < wait)
{
}
} extern void RadioSetRxDutyCycle( uint32_t rxTime, uint32_t sleepTime );
/** @addtogroup Projects_Examples_ALD
* @{
*/ /** @addtogroup Examples
* @{
*/ /**
* @brief Test main function
* @retval Status.
*/ //rt-thread
#include <rtthread.h>
/* 定义线程控制块 */
static struct rt_thread LORA_thread; static struct rt_thread LED_RUN;
static struct rt_thread Button_RUN;
/* 定义线程控栈时要求 RT_ALIGN_SIZE 个字节对齐 */
ALIGN(RT_ALIGN_SIZE)
/* 定义线程栈 */
static rt_uint8_t LORA_entry_stack[256];
static rt_uint8_t LED_RUN_entry_stack[128];
static rt_uint8_t Button_entry_stack[128];
static void LORA_entry(void *Parameter)
{
while(1)
{
// SX126xSetRx( 0x2fffff );
Radio.IrqProcess( );
rt_thread_mdelay(300);
}
}
static void LED_RUN_entry(void *Parameter)
{
while(1)
{
ald_gpio_toggle_pin(GPIOC, GPIO_PIN_9);
rt_thread_mdelay(1000);
}
}
static void Button_entry(void *Parameter)
{
unsigned char button_buf[2]={0x11,0x22};
while(1)
{
if(ald_gpio_read_pin(GPIOF, GPIO_PIN_0)==0)
{
ald_gpio_write_pin(GPIOC, GPIO_PIN_9,0);
Radio.Send(button_buf,1);
}
if(ald_gpio_read_pin(GPIOF, GPIO_PIN_1)==0)
{
ald_gpio_write_pin(GPIOC, GPIO_PIN_9,0);
Radio.Send(&button_buf[1],1);
}
rt_thread_mdelay(100); }
} int main()
{
uint8_t buffer[2]={0,22};
uint8_t *payloadLength=0;
uint8_t *rxStartBufferPointer=0;
uint16_t PacketCnt = 0;
/* Initialize */
// ald_cmu_init();
// ald_cmu_clock_config(CMU_CLOCK_HOSC,8000000);
rt_err_t result;
Dido_Init();
SPI_Init_IO();
//******************************************************启动LORA_thread 线程
result = rt_thread_init(&LORA_thread, /* 线程控制块 */
"LORA_entry", /* 线程名字 */
LORA_entry, /* 线程入口函数 */
RT_NULL, /* 线程入口函数参数 */
&LORA_entry_stack[0], /* 线程栈起始地址 */
sizeof(LORA_entry_stack), /* 线程栈大小 */
6, /* 线程的优先级 */
20); /* 线程时间片 */
rt_thread_startup(&LORA_thread); /* 启动线程,开启调度 */
//******************************************************启动LED_RUN 线程
result = rt_thread_init(&LED_RUN, /* 线程控制块 */
"LED_RUN_entry", /* 线程名字 */
LED_RUN_entry, /* 线程入口函数 */
RT_NULL, /* 线程入口函数参数 */
&LED_RUN_entry_stack[0], /* 线程栈起始地址 */
sizeof(LED_RUN_entry_stack), /* 线程栈大小 */
5, /* 线程的优先级 */
20); /* 线程时间片 */
rt_thread_startup(&LED_RUN);/* 启动线程,开启调度 */
//******************************************************启动Button_entry 线程
result = rt_thread_init(&Button_RUN, /* 线程控制块 */
"Button_entry", /* 线程名字 */
Button_entry, /* 线程入口函数 */
RT_NULL, /* 线程入口函数参数 */
&Button_entry_stack[0], /* 线程栈起始地址 */
sizeof(Button_entry_stack), /* 线程栈大小 */
3, /* 线程的优先级 */
20); /* 线程时间片 */
rt_thread_startup(&Button_RUN);/* 启动线程,开启调度 */
//******************************************************启动 线程
}
void OnTxDone( void )
{
Radio.Standby( );
State = TX;
}
void OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr )
{
Radio.Standby( );
BufferSize = size;
memcpy( Buffer, payload, BufferSize );
RssiValue = rssi;
SnrValue = snr;
PacketReceived = true;
RssiMoy = (((RssiMoy * RxCorrectCnt) + RssiValue) / (RxCorrectCnt + 1));
SnrMoy = (((SnrMoy * RxCorrectCnt) + SnrValue) / (RxCorrectCnt + 1));
State = RX;
ald_gpio_toggle_pin(GPIOC, GPIO_PIN_8);
} void OnTxTimeout( void )
{
Radio.Standby( );
State = TX_TIMEOUT;
} void OnRxTimeout( void )
{
Radio.Standby( );
if( RxTimeoutTimerIrqFlag )
{
State = RX_TIMEOUT;
}
else
{ Radio.Rx( RX_TIMEOUT_VALUE ); // Restart Rx
SymbTimeoutCnt++; // if we pass here because of Symbol Timeout
State = LOWPOWER;
}
} void OnRxError( void )
{
Radio.Standby( );
State = RX_ERROR;
} void OnCadDone( bool channelActivityDetected)
{
Radio.Standby( ); if( channelActivityDetected == true )
{
CadRx = CAD_SUCCESS;
}
else
{
CadRx = CAD_FAIL;
}
State = RX;
} void SX126xConfigureCad( RadioLoRaCadSymbols_t cadSymbolNum, uint8_t cadDetPeak, uint8_t cadDetMin , uint32_t cadTimeout)
{
// SX126xSetDioIrqParams( IRQ_CAD_DONE | IRQ_CAD_ACTIVITY_DETECTED, IRQ_CAD_DONE | IRQ_CAD_ACTIVITY_DETECTED,
// IRQ_RADIO_NONE, IRQ_RADIO_NONE );
// SX126xSetCadParams( cadSymbolNum, cadDetPeak, cadDetMin, LORA_CAD_ONLY, ((cadTimeout * 1000) / 15.625 ));
SX126xSetDioIrqParams( IRQ_RX_DONE|IRQ_CRC_ERROR|IRQ_RX_TX_TIMEOUT,
IRQ_RX_DONE,
IRQ_RADIO_NONE,
IRQ_RADIO_NONE ); //
SX126xSetRx( 0x2fffff ); //
} static void CADTimeoutTimeoutIrq( void )
{
Radio.Standby( );
State = START_CAD;
} static void RxTimeoutTimerIrq( void )
{
RxTimeoutTimerIrqFlag = true;
}
/**
* @}
*/
/**
* @}
*/
演示效果
演示地址
https://www.bilibili.com/video/BV1cC4y1Y7wz/
代码地址
https://gitee.com/publicpeople/codes/aipgclne51w70d4vu2bqt41
|