RX
Dependencies: mbed BufferedSerial SX1276GenericLib X_NUCLEO_IKS01A2
main.cpp@0:fb7bf6d81e5f, 2019-06-05 (annotated)
- Committer:
- TMRL123
- Date:
- Wed Jun 05 00:25:53 2019 +0000
- Revision:
- 0:fb7bf6d81e5f
RX
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
TMRL123 | 0:fb7bf6d81e5f | 1 | /* Includes */ |
TMRL123 | 0:fb7bf6d81e5f | 2 | #include "mbed.h" /* Mbed include */ |
TMRL123 | 0:fb7bf6d81e5f | 3 | |
TMRL123 | 0:fb7bf6d81e5f | 4 | /* Lora includes */ |
TMRL123 | 0:fb7bf6d81e5f | 5 | #include "PinMap.h" |
TMRL123 | 0:fb7bf6d81e5f | 6 | #include "sx1276-mbed-hal.h" |
TMRL123 | 0:fb7bf6d81e5f | 7 | |
TMRL123 | 0:fb7bf6d81e5f | 8 | /* Serial communication include */ |
TMRL123 | 0:fb7bf6d81e5f | 9 | #include "BufferedSerial.h" |
TMRL123 | 0:fb7bf6d81e5f | 10 | |
TMRL123 | 0:fb7bf6d81e5f | 11 | /* Set this flag to '1' to display debug messages on the console */ |
TMRL123 | 0:fb7bf6d81e5f | 12 | #define DEBUG_MESSAGE 1 |
TMRL123 | 0:fb7bf6d81e5f | 13 | |
TMRL123 | 0:fb7bf6d81e5f | 14 | /* Set this flag to '1' to use the LoRa modulation or to '0' to use FSK modulation */ |
TMRL123 | 0:fb7bf6d81e5f | 15 | #define USE_MODEM_LORA 1 |
TMRL123 | 0:fb7bf6d81e5f | 16 | #define USE_MODEM_FSK !USE_MODEM_LORA |
TMRL123 | 0:fb7bf6d81e5f | 17 | #define RF_FREQUENCY RF_FREQUENCY_915_0 // Hz |
TMRL123 | 0:fb7bf6d81e5f | 18 | #define TX_OUTPUT_POWER 14 // 14 dBm |
TMRL123 | 0:fb7bf6d81e5f | 19 | |
TMRL123 | 0:fb7bf6d81e5f | 20 | #if USE_MODEM_LORA == 1 |
TMRL123 | 0:fb7bf6d81e5f | 21 | |
TMRL123 | 0:fb7bf6d81e5f | 22 | #define LORA_BANDWIDTH 125000 // LoRa default, details in SX1276::BandwidthMap |
TMRL123 | 0:fb7bf6d81e5f | 23 | #define LORA_SPREADING_FACTOR LORA_SF7 |
TMRL123 | 0:fb7bf6d81e5f | 24 | #define LORA_CODINGRATE LORA_ERROR_CODING_RATE_4_5 |
TMRL123 | 0:fb7bf6d81e5f | 25 | |
TMRL123 | 0:fb7bf6d81e5f | 26 | #define LORA_PREAMBLE_LENGTH 8 // Same for Tx and Rx |
TMRL123 | 0:fb7bf6d81e5f | 27 | #define LORA_SYMBOL_TIMEOUT 5 // Symbols |
TMRL123 | 0:fb7bf6d81e5f | 28 | #define LORA_FIX_LENGTH_PAYLOAD_ON false |
TMRL123 | 0:fb7bf6d81e5f | 29 | #define LORA_FHSS_ENABLED false |
TMRL123 | 0:fb7bf6d81e5f | 30 | #define LORA_NB_SYMB_HOP 4 |
TMRL123 | 0:fb7bf6d81e5f | 31 | #define LORA_IQ_INVERSION_ON false |
TMRL123 | 0:fb7bf6d81e5f | 32 | #define LORA_CRC_ENABLED true |
TMRL123 | 0:fb7bf6d81e5f | 33 | |
TMRL123 | 0:fb7bf6d81e5f | 34 | #endif |
TMRL123 | 0:fb7bf6d81e5f | 35 | |
TMRL123 | 0:fb7bf6d81e5f | 36 | #define RX_TIMEOUT_VALUE 0 // In ms |
TMRL123 | 0:fb7bf6d81e5f | 37 | #define TX_TIMEOUT_VALUE 1000000 // In ms |
TMRL123 | 0:fb7bf6d81e5f | 38 | |
TMRL123 | 0:fb7bf6d81e5f | 39 | //#define BUFFER_SIZE 32 // Define the payload size here |
TMRL123 | 0:fb7bf6d81e5f | 40 | #define BUFFER_SIZE 64 // Define the payload size here |
TMRL123 | 0:fb7bf6d81e5f | 41 | |
TMRL123 | 0:fb7bf6d81e5f | 42 | typedef struct { |
TMRL123 | 0:fb7bf6d81e5f | 43 | /* Header for identification of updated informations */ |
TMRL123 | 0:fb7bf6d81e5f | 44 | bool header [8]; |
TMRL123 | 0:fb7bf6d81e5f | 45 | int time; // Time between transmissions |
TMRL123 | 0:fb7bf6d81e5f | 46 | int32_t ag[3]; // Acceleration of the accelerometer and gyroscope LSM6DSL |
TMRL123 | 0:fb7bf6d81e5f | 47 | int32_t w[3]; // Angular velocity of LSM6DSL |
TMRL123 | 0:fb7bf6d81e5f | 48 | int32_t a[3]; // Acceleration of the accelerometer LSM303AGR |
TMRL123 | 0:fb7bf6d81e5f | 49 | int32_t m [3]; // Heading of LSM303AGR |
TMRL123 | 0:fb7bf6d81e5f | 50 | float p; // Pressure of LPS22HB |
TMRL123 | 0:fb7bf6d81e5f | 51 | float temperatureLPS22HB; // Temperature from LPS22HB |
TMRL123 | 0:fb7bf6d81e5f | 52 | float humidity; // Humidity of HTS221 |
TMRL123 | 0:fb7bf6d81e5f | 53 | float temperatureHTS221; // Temperature from HTS221 |
TMRL123 | 0:fb7bf6d81e5f | 54 | unsigned long timeOfWeek; //GPS time of week |
TMRL123 | 0:fb7bf6d81e5f | 55 | long timeOfWeekFracPart; // GPS time of week fractional part |
TMRL123 | 0:fb7bf6d81e5f | 56 | unsigned char gpsFix; // GPS fix |
TMRL123 | 0:fb7bf6d81e5f | 57 | long ecefx; // GPS X posiition |
TMRL123 | 0:fb7bf6d81e5f | 58 | long ecefy; // GPS Y posistion |
TMRL123 | 0:fb7bf6d81e5f | 59 | long ecefz; // GPS Z postion |
TMRL123 | 0:fb7bf6d81e5f | 60 | unsigned long positionAcc3D; // GPS 3D position accuracy |
TMRL123 | 0:fb7bf6d81e5f | 61 | long ecefvx; // GPS X velocity |
TMRL123 | 0:fb7bf6d81e5f | 62 | long ecefvy; // GPS Y velocity |
TMRL123 | 0:fb7bf6d81e5f | 63 | long ecefvz; // GPS Z velocity |
TMRL123 | 0:fb7bf6d81e5f | 64 | unsigned long speedAcc; // GPS speed accuracy |
TMRL123 | 0:fb7bf6d81e5f | 65 | unsigned char numbSat; // GPS number of satellites conected |
TMRL123 | 0:fb7bf6d81e5f | 66 | bool drogueStatus; // Drogue parachute status provided by Avionics |
TMRL123 | 0:fb7bf6d81e5f | 67 | bool mainStatus; //Main parachute status provided by Avionics |
TMRL123 | 0:fb7bf6d81e5f | 68 | float pressureBar; // Pressure by COTS Altimeter |
TMRL123 | 0:fb7bf6d81e5f | 69 | float temperature; // Temperature by COTS Altimeter |
TMRL123 | 0:fb7bf6d81e5f | 70 | bool mainStatusCOTS; // Main parachute status provided by COTS Altimeter |
TMRL123 | 0:fb7bf6d81e5f | 71 | bool drogueStatusCOTS; // Drogue status provided by COTS Altimeter |
TMRL123 | 0:fb7bf6d81e5f | 72 | int16_t timeStamp; //Timestamp from COTS Altimeter |
TMRL123 | 0:fb7bf6d81e5f | 73 | int16_t aglAlt; //AGL Altitude from COTS Altimeter |
TMRL123 | 0:fb7bf6d81e5f | 74 | int8_t battery; //Battery voltage reading from COTS Altimeter |
TMRL123 | 0:fb7bf6d81e5f | 75 | }Data; // Data struct |
TMRL123 | 0:fb7bf6d81e5f | 76 | |
TMRL123 | 0:fb7bf6d81e5f | 77 | Data data; |
TMRL123 | 0:fb7bf6d81e5f | 78 | |
TMRL123 | 0:fb7bf6d81e5f | 79 | /* LoRa modem instances and configurations */ |
TMRL123 | 0:fb7bf6d81e5f | 80 | |
TMRL123 | 0:fb7bf6d81e5f | 81 | static RadioEvents_t RadioEvents; // Calback functions struct |
TMRL123 | 0:fb7bf6d81e5f | 82 | |
TMRL123 | 0:fb7bf6d81e5f | 83 | SX1276Generic *Radio; // Definition of a Radio object |
TMRL123 | 0:fb7bf6d81e5f | 84 | |
TMRL123 | 0:fb7bf6d81e5f | 85 | bool received = false; // Flag to indicate the end of reception |
TMRL123 | 0:fb7bf6d81e5f | 86 | |
TMRL123 | 0:fb7bf6d81e5f | 87 | /* Configuration function */ |
TMRL123 | 0:fb7bf6d81e5f | 88 | void SystemClock_Config(void); |
TMRL123 | 0:fb7bf6d81e5f | 89 | |
TMRL123 | 0:fb7bf6d81e5f | 90 | /* Callback functions prototypes */ |
TMRL123 | 0:fb7bf6d81e5f | 91 | |
TMRL123 | 0:fb7bf6d81e5f | 92 | // Brief Function to be executed on Radio Tx Done event |
TMRL123 | 0:fb7bf6d81e5f | 93 | void OnTxDone(void *radio, void *userThisPtr, void *userData); |
TMRL123 | 0:fb7bf6d81e5f | 94 | |
TMRL123 | 0:fb7bf6d81e5f | 95 | // Brief Function to be executed on Radio Rx Done event |
TMRL123 | 0:fb7bf6d81e5f | 96 | void OnRxDone(void *radio, void *userThisPtr, void *userData, uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr ); |
TMRL123 | 0:fb7bf6d81e5f | 97 | |
TMRL123 | 0:fb7bf6d81e5f | 98 | // Brief Function executed on Radio Tx Timeout event |
TMRL123 | 0:fb7bf6d81e5f | 99 | void OnTxTimeout(void *radio, void *userThisPtr, void *userData); |
TMRL123 | 0:fb7bf6d81e5f | 100 | |
TMRL123 | 0:fb7bf6d81e5f | 101 | // Brief Function executed on Radio Rx Timeout event |
TMRL123 | 0:fb7bf6d81e5f | 102 | void OnRxTimeout(void *radio, void *userThisPtr, void *userData); |
TMRL123 | 0:fb7bf6d81e5f | 103 | |
TMRL123 | 0:fb7bf6d81e5f | 104 | // Brief Function executed on Radio Rx Error event |
TMRL123 | 0:fb7bf6d81e5f | 105 | void OnRxError(void *radio, void *userThisPtr, void *userData); |
TMRL123 | 0:fb7bf6d81e5f | 106 | |
TMRL123 | 0:fb7bf6d81e5f | 107 | // Brief Function executed on Radio Fhss Change Channel event |
TMRL123 | 0:fb7bf6d81e5f | 108 | void OnFhssChangeChannel(void *radio, void *userThisPtr, void *userData, uint8_t channelIndex); |
TMRL123 | 0:fb7bf6d81e5f | 109 | |
TMRL123 | 0:fb7bf6d81e5f | 110 | // Brief Function executed on CAD Done event |
TMRL123 | 0:fb7bf6d81e5f | 111 | void OnCadDone(void *radio, void *userThisPtr, void *userData); |
TMRL123 | 0:fb7bf6d81e5f | 112 | |
TMRL123 | 0:fb7bf6d81e5f | 113 | /* Serial communication to debug program */ |
TMRL123 | 0:fb7bf6d81e5f | 114 | BufferedSerial *ser; |
TMRL123 | 0:fb7bf6d81e5f | 115 | |
TMRL123 | 0:fb7bf6d81e5f | 116 | int main() { |
TMRL123 | 0:fb7bf6d81e5f | 117 | SystemClock_Config(); /* Synchronize clock for TX and RX boards */ |
TMRL123 | 0:fb7bf6d81e5f | 118 | |
TMRL123 | 0:fb7bf6d81e5f | 119 | /* Serial configuration */ |
TMRL123 | 0:fb7bf6d81e5f | 120 | if (DEBUG_MESSAGE) { |
TMRL123 | 0:fb7bf6d81e5f | 121 | ser = new BufferedSerial(USBTX, USBRX); |
TMRL123 | 0:fb7bf6d81e5f | 122 | ser->baud(115200); |
TMRL123 | 0:fb7bf6d81e5f | 123 | ser->format(8); |
TMRL123 | 0:fb7bf6d81e5f | 124 | } |
TMRL123 | 0:fb7bf6d81e5f | 125 | |
TMRL123 | 0:fb7bf6d81e5f | 126 | /* General Header*/ |
TMRL123 | 0:fb7bf6d81e5f | 127 | if (DEBUG_MESSAGE) |
TMRL123 | 0:fb7bf6d81e5f | 128 | ser->printf("Telemetry Rx inicial version program\r\n\r\n"); |
TMRL123 | 0:fb7bf6d81e5f | 129 | |
TMRL123 | 0:fb7bf6d81e5f | 130 | Radio = new SX1276Generic(NULL, MURATA_SX1276, |
TMRL123 | 0:fb7bf6d81e5f | 131 | LORA_SPI_MOSI, LORA_SPI_MISO, LORA_SPI_SCLK, LORA_CS, LORA_RESET, |
TMRL123 | 0:fb7bf6d81e5f | 132 | LORA_DIO0, LORA_DIO1, LORA_DIO2, LORA_DIO3, LORA_DIO4, LORA_DIO5, |
TMRL123 | 0:fb7bf6d81e5f | 133 | LORA_ANT_RX, LORA_ANT_TX, LORA_ANT_BOOST, LORA_TCXO); |
TMRL123 | 0:fb7bf6d81e5f | 134 | |
TMRL123 | 0:fb7bf6d81e5f | 135 | if (DEBUG_MESSAGE) { |
TMRL123 | 0:fb7bf6d81e5f | 136 | ser->printf("SX1276 Simple receiver aplication\r\n" ); |
TMRL123 | 0:fb7bf6d81e5f | 137 | ser->printf("Frequency: %.1f\r\n", (double)RF_FREQUENCY/1000000.0); |
TMRL123 | 0:fb7bf6d81e5f | 138 | ser->printf("TXPower: %d dBm\r\n", TX_OUTPUT_POWER); |
TMRL123 | 0:fb7bf6d81e5f | 139 | ser->printf("Bandwidth: %d Hz\r\n", LORA_BANDWIDTH); |
TMRL123 | 0:fb7bf6d81e5f | 140 | ser->printf("Spreading factor: SF%d\r\n", LORA_SPREADING_FACTOR); |
TMRL123 | 0:fb7bf6d81e5f | 141 | } |
TMRL123 | 0:fb7bf6d81e5f | 142 | |
TMRL123 | 0:fb7bf6d81e5f | 143 | // Initialize Radio driver |
TMRL123 | 0:fb7bf6d81e5f | 144 | RadioEvents.TxDone = OnTxDone; |
TMRL123 | 0:fb7bf6d81e5f | 145 | RadioEvents.RxDone = OnRxDone; |
TMRL123 | 0:fb7bf6d81e5f | 146 | RadioEvents.RxError = OnRxError; |
TMRL123 | 0:fb7bf6d81e5f | 147 | RadioEvents.TxTimeout = OnTxTimeout; |
TMRL123 | 0:fb7bf6d81e5f | 148 | RadioEvents.RxTimeout = OnRxTimeout; |
TMRL123 | 0:fb7bf6d81e5f | 149 | |
TMRL123 | 0:fb7bf6d81e5f | 150 | // Initializes the radio |
TMRL123 | 0:fb7bf6d81e5f | 151 | while (Radio->Init( &RadioEvents ) == false) { |
TMRL123 | 0:fb7bf6d81e5f | 152 | if (DEBUG_MESSAGE) |
TMRL123 | 0:fb7bf6d81e5f | 153 | ser->printf("Radio could not be detected!\r\n"); |
TMRL123 | 0:fb7bf6d81e5f | 154 | wait( 1 ); |
TMRL123 | 0:fb7bf6d81e5f | 155 | } |
TMRL123 | 0:fb7bf6d81e5f | 156 | |
TMRL123 | 0:fb7bf6d81e5f | 157 | // Display the board type |
TMRL123 | 0:fb7bf6d81e5f | 158 | switch(Radio->DetectBoardType()) { |
TMRL123 | 0:fb7bf6d81e5f | 159 | case SX1276MB1LAS: |
TMRL123 | 0:fb7bf6d81e5f | 160 | if (DEBUG_MESSAGE) |
TMRL123 | 0:fb7bf6d81e5f | 161 | ser->printf(" > Board Type: SX1276MB1LAS <\r\n"); |
TMRL123 | 0:fb7bf6d81e5f | 162 | break; |
TMRL123 | 0:fb7bf6d81e5f | 163 | case SX1276MB1MAS: |
TMRL123 | 0:fb7bf6d81e5f | 164 | if (DEBUG_MESSAGE) |
TMRL123 | 0:fb7bf6d81e5f | 165 | ser->printf(" > Board Type: SX1276MB1LAS <\r\n"); |
TMRL123 | 0:fb7bf6d81e5f | 166 | case MURATA_SX1276: |
TMRL123 | 0:fb7bf6d81e5f | 167 | if (DEBUG_MESSAGE) |
TMRL123 | 0:fb7bf6d81e5f | 168 | ser->printf(" > Board Type: MURATA_SX1276_STM32L0 <\r\n"); |
TMRL123 | 0:fb7bf6d81e5f | 169 | break; |
TMRL123 | 0:fb7bf6d81e5f | 170 | case RFM95_SX1276: |
TMRL123 | 0:fb7bf6d81e5f | 171 | if (DEBUG_MESSAGE) |
TMRL123 | 0:fb7bf6d81e5f | 172 | ser->printf(" > HopeRF RFM95xx <\r\n"); |
TMRL123 | 0:fb7bf6d81e5f | 173 | break; |
TMRL123 | 0:fb7bf6d81e5f | 174 | default: |
TMRL123 | 0:fb7bf6d81e5f | 175 | if (DEBUG_MESSAGE) |
TMRL123 | 0:fb7bf6d81e5f | 176 | ser->printf(" > Board Type: unknown <\r\n"); |
TMRL123 | 0:fb7bf6d81e5f | 177 | } |
TMRL123 | 0:fb7bf6d81e5f | 178 | |
TMRL123 | 0:fb7bf6d81e5f | 179 | Radio->SetChannel(RF_FREQUENCY ); // Sets the frequency of the communication |
TMRL123 | 0:fb7bf6d81e5f | 180 | |
TMRL123 | 0:fb7bf6d81e5f | 181 | // Debug message of the state of fhss |
TMRL123 | 0:fb7bf6d81e5f | 182 | if (LORA_FHSS_ENABLED) { |
TMRL123 | 0:fb7bf6d81e5f | 183 | if (DEBUG_MESSAGE) |
TMRL123 | 0:fb7bf6d81e5f | 184 | ser->printf(" > LORA FHSS Mode <\r\n"); |
TMRL123 | 0:fb7bf6d81e5f | 185 | } |
TMRL123 | 0:fb7bf6d81e5f | 186 | if (!LORA_FHSS_ENABLED) { |
TMRL123 | 0:fb7bf6d81e5f | 187 | if (DEBUG_MESSAGE) |
TMRL123 | 0:fb7bf6d81e5f | 188 | ser->printf(" > LORA Mode <\r\n"); |
TMRL123 | 0:fb7bf6d81e5f | 189 | } |
TMRL123 | 0:fb7bf6d81e5f | 190 | // Sets the configuration of the transmission |
TMRL123 | 0:fb7bf6d81e5f | 191 | Radio->SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH, |
TMRL123 | 0:fb7bf6d81e5f | 192 | LORA_SPREADING_FACTOR, LORA_CODINGRATE, |
TMRL123 | 0:fb7bf6d81e5f | 193 | LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON, |
TMRL123 | 0:fb7bf6d81e5f | 194 | LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP, |
TMRL123 | 0:fb7bf6d81e5f | 195 | LORA_IQ_INVERSION_ON, 2000 ); |
TMRL123 | 0:fb7bf6d81e5f | 196 | |
TMRL123 | 0:fb7bf6d81e5f | 197 | // Sets the configuration of the reception |
TMRL123 | 0:fb7bf6d81e5f | 198 | Radio->SetRxConfig( MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR, |
TMRL123 | 0:fb7bf6d81e5f | 199 | LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH, |
TMRL123 | 0:fb7bf6d81e5f | 200 | LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, 0, |
TMRL123 | 0:fb7bf6d81e5f | 201 | LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP, |
TMRL123 | 0:fb7bf6d81e5f | 202 | LORA_IQ_INVERSION_ON, true ); |
TMRL123 | 0:fb7bf6d81e5f | 203 | if (DEBUG_MESSAGE) |
TMRL123 | 0:fb7bf6d81e5f | 204 | ser->printf("Starting Receive loop\r\n"); |
TMRL123 | 0:fb7bf6d81e5f | 205 | |
TMRL123 | 0:fb7bf6d81e5f | 206 | Radio->Rx(RX_TIMEOUT_VALUE); // Puts the device in reception mode continuously |
TMRL123 | 0:fb7bf6d81e5f | 207 | |
TMRL123 | 0:fb7bf6d81e5f | 208 | while( 1 ) |
TMRL123 | 0:fb7bf6d81e5f | 209 | { |
TMRL123 | 0:fb7bf6d81e5f | 210 | //After the receiving, puts the device again in receive mode |
TMRL123 | 0:fb7bf6d81e5f | 211 | if (received == true) { |
TMRL123 | 0:fb7bf6d81e5f | 212 | received = false; |
TMRL123 | 0:fb7bf6d81e5f | 213 | Radio->Rx(RX_TIMEOUT_VALUE); |
TMRL123 | 0:fb7bf6d81e5f | 214 | } |
TMRL123 | 0:fb7bf6d81e5f | 215 | } |
TMRL123 | 0:fb7bf6d81e5f | 216 | |
TMRL123 | 0:fb7bf6d81e5f | 217 | } |
TMRL123 | 0:fb7bf6d81e5f | 218 | |
TMRL123 | 0:fb7bf6d81e5f | 219 | |
TMRL123 | 0:fb7bf6d81e5f | 220 | void SystemClock_Config(void) |
TMRL123 | 0:fb7bf6d81e5f | 221 | { |
TMRL123 | 0:fb7bf6d81e5f | 222 | #ifdef B_L072Z_LRWAN1_LORA |
TMRL123 | 0:fb7bf6d81e5f | 223 | /* |
TMRL123 | 0:fb7bf6d81e5f | 224 | * The L072Z_LRWAN1_LORA clock setup is somewhat differnt from the Nucleo board. |
TMRL123 | 0:fb7bf6d81e5f | 225 | * It has no LSE. |
TMRL123 | 0:fb7bf6d81e5f | 226 | */ |
TMRL123 | 0:fb7bf6d81e5f | 227 | RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; |
TMRL123 | 0:fb7bf6d81e5f | 228 | RCC_OscInitTypeDef RCC_OscInitStruct = {0}; |
TMRL123 | 0:fb7bf6d81e5f | 229 | |
TMRL123 | 0:fb7bf6d81e5f | 230 | /* Enable HSE Oscillator and Activate PLL with HSE as source */ |
TMRL123 | 0:fb7bf6d81e5f | 231 | RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; |
TMRL123 | 0:fb7bf6d81e5f | 232 | RCC_OscInitStruct.HSEState = RCC_HSE_OFF; |
TMRL123 | 0:fb7bf6d81e5f | 233 | RCC_OscInitStruct.HSIState = RCC_HSI_ON; |
TMRL123 | 0:fb7bf6d81e5f | 234 | RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; |
TMRL123 | 0:fb7bf6d81e5f | 235 | RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; |
TMRL123 | 0:fb7bf6d81e5f | 236 | RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; |
TMRL123 | 0:fb7bf6d81e5f | 237 | RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_6; |
TMRL123 | 0:fb7bf6d81e5f | 238 | RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_3; |
TMRL123 | 0:fb7bf6d81e5f | 239 | |
TMRL123 | 0:fb7bf6d81e5f | 240 | if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { |
TMRL123 | 0:fb7bf6d81e5f | 241 | // Error_Handler(); |
TMRL123 | 0:fb7bf6d81e5f | 242 | } |
TMRL123 | 0:fb7bf6d81e5f | 243 | |
TMRL123 | 0:fb7bf6d81e5f | 244 | /* Set Voltage scale1 as MCU will run at 32MHz */ |
TMRL123 | 0:fb7bf6d81e5f | 245 | __HAL_RCC_PWR_CLK_ENABLE(); |
TMRL123 | 0:fb7bf6d81e5f | 246 | __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); |
TMRL123 | 0:fb7bf6d81e5f | 247 | |
TMRL123 | 0:fb7bf6d81e5f | 248 | /* Poll VOSF bit of in PWR_CSR. Wait until it is reset to 0 */ |
TMRL123 | 0:fb7bf6d81e5f | 249 | while (__HAL_PWR_GET_FLAG(PWR_FLAG_VOS) != RESET) {}; |
TMRL123 | 0:fb7bf6d81e5f | 250 | |
TMRL123 | 0:fb7bf6d81e5f | 251 | /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 |
TMRL123 | 0:fb7bf6d81e5f | 252 | clocks dividers */ |
TMRL123 | 0:fb7bf6d81e5f | 253 | RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2); |
TMRL123 | 0:fb7bf6d81e5f | 254 | RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; |
TMRL123 | 0:fb7bf6d81e5f | 255 | RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; |
TMRL123 | 0:fb7bf6d81e5f | 256 | RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; |
TMRL123 | 0:fb7bf6d81e5f | 257 | RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; |
TMRL123 | 0:fb7bf6d81e5f | 258 | if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) { |
TMRL123 | 0:fb7bf6d81e5f | 259 | // Error_Handler(); |
TMRL123 | 0:fb7bf6d81e5f | 260 | } |
TMRL123 | 0:fb7bf6d81e5f | 261 | #endif |
TMRL123 | 0:fb7bf6d81e5f | 262 | } |
TMRL123 | 0:fb7bf6d81e5f | 263 | |
TMRL123 | 0:fb7bf6d81e5f | 264 | void OnTxDone(void *radio, void *userThisPtr, void *userData) |
TMRL123 | 0:fb7bf6d81e5f | 265 | { |
TMRL123 | 0:fb7bf6d81e5f | 266 | Radio->Sleep( ); |
TMRL123 | 0:fb7bf6d81e5f | 267 | if (DEBUG_MESSAGE) |
TMRL123 | 0:fb7bf6d81e5f | 268 | ser->printf("> OnTxDone\r\n"); |
TMRL123 | 0:fb7bf6d81e5f | 269 | } |
TMRL123 | 0:fb7bf6d81e5f | 270 | |
TMRL123 | 0:fb7bf6d81e5f | 271 | void OnRxDone(void *radio, void *userThisPtr, void *userData, uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr) |
TMRL123 | 0:fb7bf6d81e5f | 272 | { |
TMRL123 | 0:fb7bf6d81e5f | 273 | Radio->Sleep( ); |
TMRL123 | 0:fb7bf6d81e5f | 274 | received = true; |
TMRL123 | 0:fb7bf6d81e5f | 275 | memcpy(&data, payload, sizeof(data)); |
TMRL123 | 0:fb7bf6d81e5f | 276 | if (DEBUG_MESSAGE) { |
TMRL123 | 0:fb7bf6d81e5f | 277 | /* |
TMRL123 | 0:fb7bf6d81e5f | 278 | ser->printf("> OnRxDone: RssiValue=%d dBm, SnrValue=%d\r\n", rssi, snr); |
TMRL123 | 0:fb7bf6d81e5f | 279 | ser->printf("I recieved %d mg, %d mg, %d mg, %d mg, %d mg, %d mg, %d mdps, %d mdps, %d mdps\r\n", data.a[0], data.a[1], data.a[2], data.ag[0], data.ag[1], data.ag[2], data.w[0], data.w[1], data.w[2]); |
TMRL123 | 0:fb7bf6d81e5f | 280 | ser->printf("and %d mG, %d mG, %d mG, %g %%, %g C, %g C, %g mBar\r\n", data.m[0], data.m[1], data.m[2], data.humidity, data.temperatureHTS221, data.temperatureLPS22HB, data.p); |
TMRL123 | 0:fb7bf6d81e5f | 281 | ser->printf("and time - %d ms, time of the week - %d ms, time of week frac part - %d ns\r\n",data.time, data.timeOfWeek, data.timeOfWeekFracPart); |
TMRL123 | 0:fb7bf6d81e5f | 282 | ser->printf("and GPS fix %c, ECEFX %d cm, ECEFY %d cm, ECEFZ %d cm\r\n", data.gpsFix, data.ecefx, data.ecefy, data.ecefz); |
TMRL123 | 0:fb7bf6d81e5f | 283 | ser->printf("and 3D Position accuracy %d cm, ECEFVX %d cm/s, ECEFVY %d cm/s, ECEFVZ %d cm/s, Speed accuracy %d cm/s\r\n", data.positionAcc3D, data.ecefvx, data.ecefvy, data.ecefvz, data.speedAcc); |
TMRL123 | 0:fb7bf6d81e5f | 284 | ser->printf("and Number of satelites %x, Drogue Status %x, Main status %x, BMP280 %f bar, temperature %f C\r\n", data.numbSat, data.drogueStatus, data.mainStatus, data.pressureBar, data.temperature); |
TMRL123 | 0:fb7bf6d81e5f | 285 | ser->printf("Main Status COTS %x, Drogue Status COTS %x, Time Stamp %d s, AGL altitude %d m, Battery voltage %d V\r\n",data.mainStatusCOTS, data.drogueStatusCOTS, data.timeStamp, data.aglAlt, data.battery); |
TMRL123 | 0:fb7bf6d81e5f | 286 | ser->printf("Header: %d, %d, %d, %d, %d, %d, %d, %d\r\n",data.header[0], data.header[1], data.header[2], data.header[3], data.header[4], data.header[5], data.header[6], data.header[7]); |
TMRL123 | 0:fb7bf6d81e5f | 287 | */ |
TMRL123 | 0:fb7bf6d81e5f | 288 | ser->printf("%d\r\n", sizeof(payload)); |
TMRL123 | 0:fb7bf6d81e5f | 289 | ser->printf("%x\r\n", payload); |
TMRL123 | 0:fb7bf6d81e5f | 290 | |
TMRL123 | 0:fb7bf6d81e5f | 291 | } |
TMRL123 | 0:fb7bf6d81e5f | 292 | |
TMRL123 | 0:fb7bf6d81e5f | 293 | |
TMRL123 | 0:fb7bf6d81e5f | 294 | } |
TMRL123 | 0:fb7bf6d81e5f | 295 | |
TMRL123 | 0:fb7bf6d81e5f | 296 | void OnTxTimeout(void *radio, void *userThisPtr, void *userData) |
TMRL123 | 0:fb7bf6d81e5f | 297 | { |
TMRL123 | 0:fb7bf6d81e5f | 298 | Radio->Sleep( ); |
TMRL123 | 0:fb7bf6d81e5f | 299 | if(DEBUG_MESSAGE) |
TMRL123 | 0:fb7bf6d81e5f | 300 | ser->printf("> OnTxTimeout\r\n"); |
TMRL123 | 0:fb7bf6d81e5f | 301 | } |
TMRL123 | 0:fb7bf6d81e5f | 302 | |
TMRL123 | 0:fb7bf6d81e5f | 303 | void OnRxTimeout(void *radio, void *userThisPtr, void *userData) |
TMRL123 | 0:fb7bf6d81e5f | 304 | { |
TMRL123 | 0:fb7bf6d81e5f | 305 | Radio->Sleep( ); |
TMRL123 | 0:fb7bf6d81e5f | 306 | if (DEBUG_MESSAGE) |
TMRL123 | 0:fb7bf6d81e5f | 307 | ser->printf("> OnRxTimeout\r\n"); |
TMRL123 | 0:fb7bf6d81e5f | 308 | } |
TMRL123 | 0:fb7bf6d81e5f | 309 | |
TMRL123 | 0:fb7bf6d81e5f | 310 | void OnRxError(void *radio, void *userThisPtr, void *userData) |
TMRL123 | 0:fb7bf6d81e5f | 311 | { |
TMRL123 | 0:fb7bf6d81e5f | 312 | Radio->Sleep( ); |
TMRL123 | 0:fb7bf6d81e5f | 313 | received = true; |
TMRL123 | 0:fb7bf6d81e5f | 314 | if (DEBUG_MESSAGE) |
TMRL123 | 0:fb7bf6d81e5f | 315 | ser->printf("> OnRxError\r\n"); |
TMRL123 | 0:fb7bf6d81e5f | 316 | } |