publicpeople 发表于 2020-6-22 21:48

[RTOS]+Rhtread基于Lora开关控制

本帖最后由 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
* @authorAE 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         //
#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               19typedef 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 hereuint16_t BufferSize = BUFFER_SIZE;
uint8_t Buffer;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 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 cadDetPeak   Limit for detection of SNR peak used in the CAD
* \param cadDetMin      Set the minimum symbol recognition for CAD
* \param 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.
* @NOTEThis 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
* @{
*//**
* @briefTest 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;
static rt_uint8_t LED_RUN_entry_stack;
static rt_uint8_t Button_entry_stack;
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={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);

}
   rt_thread_mdelay(100); }

}int main()
{

uint8_t buffer={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, /* 线程栈起始地址 */
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, /* 线程栈起始地址 */
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, /* 线程栈起始地址 */
   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



zeshoufx 发表于 2020-6-23 08:32

谢谢分享,,,,,,
页: [1]
查看完整版本: [RTOS]+Rhtread基于Lora开关控制