Loading...
Searching...
No Matches
main.c
1/***********************************************************************************
2 * @file main.c *
3 * @author Matt Ricci *
4 * @brief Main application entry point and system initialization. *
5 ***********************************************************************************/
6
7#include "main.h"
8
9long hDummyIdx = 0;
10long lDummyIdx = 0;
11
12// RTOS event groups
13EventGroupHandle_t xTaskEnableGroup; // 0: FLASH, 1: HIGHRES, 2: LOWRES, 3: LORA, 7: IDLE
14EventGroupHandle_t xSystemStatusGroup; // 0-2: Flight state, 3: Payload, 4: Aerobrakes
15EventGroupHandle_t xMsgReadyGroup; // 0: LORA, 1: USB
16
17// RTOS message buffers
18MessageBufferHandle_t xLoRaTxBuff;
19MessageBufferHandle_t xUsbTxBuff;
20
21StreamBufferHandle_t xUsbRxBuff;
22StreamBufferHandle_t xGpsRxBuff;
23
24// RTOS mutexes
25SemaphoreHandle_t xUsbMutex;
26
27/* =============================================================================== */
36
37int main(void) {
38
39#ifdef TRACE
40 xTraceInitialize();
41#endif
42
43 // Initialise clock sources and peripheral busses
44 configure_RCC_APB1();
45 configure_RCC_APB2();
46 configure_RCC_AHB1();
47
48 // Initialize GPIO pins for peripherals
49 configure_MISC_GPIO();
50 configure_UART3_GPS();
51 configure_SPI1_Sensor_Suite();
52 configure_SPI3_LoRa();
53 configure_SPI4_Flash();
55
56 // Initialise timers
57 TIM6init();
58 TIM7init();
59
60 // Configure CAN
61 CANGPIO_config();
62 CAN_Peripheral_config();
63
64#ifdef FLIGHT_TEST
65 GPIOB->ODR ^= 0x8000;
66 GPIOD->ODR ^= 0x8000;
67#endif
68
69 // Send AB ground test message over CAN
70 unsigned int CANHigh = 0;
71 unsigned int CANLow = 0;
72 unsigned int id = 0x603;
73 CAN_TX(CAN_AB, 8, CANHigh, CANLow, id);
74
75 // Create and start the system initialization task
76 TaskHandle_t xSystemInitHandle;
77 xTaskCreate(vSystemInit, "SystemInit", 16192, NULL, configMAX_PRIORITIES, &xSystemInitHandle);
78 vTaskStartScheduler();
79
80 // The scheduler should never return
81 return 0;
82}
83
84/* =============================================================================== */
92
93void vDeviceInit() {
94 /* ----------------------------- Flash Initialization -------------------------- */
95
96 // Initialise SPI flash driver
97 static Flash flash;
98 static DeviceHandle_t flashHandle __attribute__((section(".device_flash"), unused));
99 flashHandle = Flash_init(
100 &flash, "Flash", FLASH_PORT, FLASH_CS, FLASH_PAGE_SIZE, FLASH_PAGE_COUNT
101 );
102
103 /* -------------------------- Communication Initialization ---------------------- */
104
105 // Initialise USB UART driver
106 static UART usb;
107 static DeviceHandle_t usbHandle __attribute__((section(".device_usb"), unused));
108 usbHandle = UART_init(
109 &usb, "USB", USB_INTERFACE, USB_PORT, USB_PINS, USB_BAUD, OVER8
110 );
111
112 // Initialise LoRa driver
113 static LoRa lora;
114 static DeviceHandle_t loraHandle __attribute__((section(".device_lora"), unused));
115 loraHandle = LoRa_init(
116 &lora, "LoRa", LORA_PORT, LORA_CS, BW500, SF9, CR5
117 );
118
119 /* ------------------------------ Sensor Initialization ------------------------- */
120
121 /* ACCELEROMETER */
122
123 // Initialise low g accelerometer driver and device handle
124 static KX134_1211 lAccel;
125 static DeviceHandle_t lAccelHandle __attribute__((section(".device_lAccel"), unused));
126 lAccelHandle = KX134_1211_init(
127 &lAccel, "LAccel", ACCEL_PORT_1, ACCEL_CS_1, ACCEL_SCALE_LOW, ACCEL_AXES_1, ACCEL_SIGN_1
128 );
129
130 // Initialise high g accelerometer driver and device handle
131 static KX134_1211 hAccel;
132 static DeviceHandle_t hAccelHandle __attribute__((section(".device_hAccel"), unused));
133 hAccelHandle = KX134_1211_init(
134 &hAccel, "HAccel", ACCEL_PORT_2, ACCEL_CS_2, ACCEL_SCALE_HIGH, ACCEL_AXES_2, ACCEL_SIGN_2
135 );
136
137 // Initialise current accelerometer device handle
138 static DeviceHandle_t accelHandle __attribute__((section(".device_Accel"), unused));
139 memcpy(accelHandle.name, "Accel", DEVICE_NAME_LENGTH);
140 accelHandle.device = &lAccel;
141
142 /* GYROSCOPE */
143
144 // Initialise gyroscope driver and device handle
145 static A3G4250D gyro;
146 static DeviceHandle_t gyroHandle __attribute__((section(".device_gyro"), unused));
147 gyroHandle = A3G4250D_init(
148 &gyro, "Gyro", GYRO_PORT, GYRO_CS, A3G4250D_SENSITIVITY, GYRO_AXES, GYRO_SIGN
149 );
150
151 /* BAROMETER */
152
153 // Initialise barometer driver and device handle
154 static BMP581 baro;
155 static DeviceHandle_t baroHandle __attribute__((section(".device_baro"), unused));
156 baroHandle = BMP581_init(
157 &baro, "Baro", BARO_PORT, BARO_CS, BMP581_TEMP_SENSITIVITY, BMP581_PRESS_SENSITIVITY
158 );
159
160 /* GPS */
161
162 // Initialise GPS driver and device handle
163 static GPS gps;
164 static DeviceHandle_t gpsHandle __attribute__((section(".device_gps"), unused));
165 gpsHandle = GPS_init(
166 &gps, "GPS", GPS_INTERFACE, GPS_PORT, GPS_PINS, GPS_BAUD
167 );
168}
169
170/* =============================================================================== */
184
185void vSystemInit(void *argument) {
186
187 // Allow time for external devices to finish startup sequences
188 vTaskDelay(pdMS_TO_TICKS(500));
189
190 vTaskSuspendAll();
191
192 // Initialise event groups for task synchronization and message signaling
193 xTaskEnableGroup = xEventGroupCreate(); // 0: FLASH, 1: HIGHRES, 2: LOWRES, 3: LORA, 7: IDLE
194 xMsgReadyGroup = xEventGroupCreate();
195 xSystemStatusGroup = xEventGroupCreate();
196 xEventGroupSetBits(xSystemStatusGroup, GROUP_SYSTEM_STATUS_PAYLOAD | GROUP_SYSTEM_STATUS_AEROBRAKES);
197
198 xEventGroupSetBits(xMsgReadyGroup, GROUP_MESSAGE_READY_LORA);
199
200 // Initialise USB buffers and mutex
201 xUsbTxBuff = xMessageBufferCreate(USB_TX_SIZE);
202 xUsbRxBuff = xStreamBufferCreate(USB_RX_SIZE, 1);
203 xGpsRxBuff = xStreamBufferCreate(GPS_RX_SIZE, 1);
204
205 xUsbMutex = xSemaphoreCreateMutex();
206
207 // Initialise LoRa buffer
208 xLoRaTxBuff = xMessageBufferCreate(LORA_BUFF_SIZE);
209
210 /* -------------------------- Device Initialization ---------------------------- */
211
212 vDeviceInit();
213
214 // Initialise circular memory buffer
215 MemBuff _mem;
216 static StateHandle_t __attribute__((section(".state_mem"), unused)) mem;
217 mem.state = &_mem;
218 memcpy(mem.name, "Memory", STATE_NAME_LENGTH);
219
220 uint8_t buff[MEM_BUFF_SIZE];
221 MemBuff_init(&_mem, buff, MEM_BUFF_SIZE, FLASH_PAGE_SIZE);
222
223 // Initialise shell
224 static Shell shell;
225 Shell_init(&shell);
226
227 /* --------------------------- State Initialization -----------------------------*/
228
229 // Tilt state variable
230 static StateHandle_t __attribute__((section(".state_tilt"), unused)) tilt;
231 static float _tilt = 0.0f;
232 tilt.state = &_tilt;
233 memcpy(tilt.name, "Tilt", STATE_NAME_LENGTH);
234
235 // Cosine state variable
236 static StateHandle_t __attribute__((section(".state_cosine"), unused)) cosine;
237 static float _cosine = 0.0f;
238 cosine.state = &_cosine;
239 memcpy(cosine.name, "Cosine", STATE_NAME_LENGTH);
240
241 // Altitude state variable
242 static StateHandle_t __attribute__((section(".state_altitude"), unused)) altitude;
243 static float _altitude = 0.0f;
244 altitude.state = &_altitude;
245 memcpy(altitude.name, "Altitude", STATE_NAME_LENGTH);
246
247 // Velocity state variable
248 static StateHandle_t __attribute__((section(".state_velocity"), unused)) velocity;
249 static float _velocity = 0.0f;
250 velocity.state = &_velocity;
251 memcpy(velocity.name, "Velocity", STATE_NAME_LENGTH);
252
253 // Flight state variable
254 static StateHandle_t __attribute__((section(".state_flightState"), unused)) flightState;
255 static enum State _flightState = PRELAUNCH;
256 flightState.state = &_flightState;
257 memcpy(flightState.name, "FlightState", STATE_NAME_LENGTH);
258
259 // Rotation quaternion state variable
260 static StateHandle_t __attribute__((section(".state_qRot"), unused)) qRot;
261 static Quaternion _qRot;
262 Quaternion_init(&_qRot);
263 qRot.state = &_qRot;
264 memcpy(qRot.name, "RotationQuaternion", STATE_NAME_LENGTH);
265
266 // Attitude vector state variable
267 static StateHandle_t __attribute__((section(".state_vAttitude"), unused)) vAttitude;
268 static float _vAttitude[3] = {0, 0, 1};
269 vAttitude.state = _vAttitude;
270 memcpy(vAttitude.name, "AttitudeVector", STATE_NAME_LENGTH);
271
272 // Attitude vector state variable
273 static StateHandle_t __attribute__((section(".state_vLaunch"), unused)) vLaunch;
274 static float _vLaunch[3] = {0, 0, 1};
275 vLaunch.state = _vLaunch;
276 memcpy(vLaunch.name, "LaunchVector", STATE_NAME_LENGTH);
277
278 // Sliding window average velocity
279 static StateHandle_t __attribute__((section(".state_avgVel"), unused)) avgVel;
280 static SlidingWindow _avgVel = {};
281 avgVel.state = &_avgVel;
282 memcpy(avgVel.name, "AvgVelBuffer", STATE_NAME_LENGTH);
283
284 // Sliding window average velocity
285 static StateHandle_t __attribute__((section(".state_avgPress"), unused)) avgPress;
286 static SlidingWindow _avgPress = {};
287 avgPress.state = &_avgPress;
288 memcpy(avgPress.name, "AvgPressBuffer", STATE_NAME_LENGTH);
289
290 // Initialize pressure sliding window average
291 float avgPressBuff[AVG_BUFF_SIZE];
292 SlidingWindow_init(avgPress.state, avgPressBuff, AVG_BUFF_SIZE);
293
294 // Initialize velocity sliding window average
295 float avgVelBuff[AVG_BUFF_SIZE];
296 SlidingWindow_init(avgVel.state, avgVelBuff, AVG_BUFF_SIZE);
297
298 /**********************************************************************************
299 * TASK INIT *
300 **********************************************************************************/
301
302 static Handles handles;
303
305 xTaskCreate(vHDataAcquisition, "HDataAcq", 512, &_mem, configMAX_PRIORITIES - 2, &handles.xHDataAcquisitionHandle);
306 xTaskCreate(vLDataAcquisition, "LDataAcq", 512, &_mem, configMAX_PRIORITIES - 3, &handles.xLDataAcquisitionHandle);
307 xTaskCreate(vStateUpdate, "StateUpdate", 512, &handles, configMAX_PRIORITIES - 4, &handles.xStateUpdateHandle);
308 xTaskCreate(vFlashBuffer, "FlashData", 512, &_mem, configMAX_PRIORITIES - 1, &handles.xFlashBufferHandle);
309 xTaskCreate(vLoRaSample, "LoRaSample", 256, NULL, configMAX_PRIORITIES - 6, &handles.xLoRaSampleHandle);
310 xTaskCreate(vLoRaTransmit, "LoRaTx", 256, NULL, configMAX_PRIORITIES - 5, &handles.xLoRaTransmitHandle);
311 xTaskCreate(vUsbTransmit, "UsbTx", 256, NULL, configMAX_PRIORITIES - 6, &handles.xUsbTransmitHandle);
312 xTaskCreate(vUsbReceive, "UsbRx", 256, &shell, configMAX_PRIORITIES - 6, &handles.xUsbReceiveHandle);
313 xTaskCreate(vIdle, "Idle", 256, &_mem, tskIDLE_PRIORITY, &handles.xIdleHandle);
314 xTaskCreate(vPayloadTransmit, "PayloadTx", 512, NULL, configMAX_PRIORITIES - 6, &handles.xPayloadTransmitHandle);
315 xTaskCreate(vGpsTransmit, "GpsRead", 512, NULL, configMAX_PRIORITIES - 6, &handles.xGpsTransmitHandle);
316
317 buzzer(3215);
318 xTaskResumeAll();
319
320#ifdef TRACE
321 xTraceEnable(TRC_START);
322#endif
323
324 // Suspend the system initialization task (only needs to run once)
325 vTaskSuspend(NULL);
326}
327
332 __disable_irq();
333 NVIC_SetPriority(EXTI1_IRQn, 9);
334 NVIC_EnableIRQ(EXTI1_IRQn);
335 NVIC_SetPriority(USART6_IRQn, 10);
336 NVIC_EnableIRQ(USART6_IRQn);
337 NVIC_SetPriority(USART3_IRQn, 10);
338 NVIC_EnableIRQ(USART3_IRQn);
339 EXTI->RTSR |= (0x02 | 0x04);
340 EXTI->IMR |= (0x02 | 0x04);
341 SYSCFG->EXTICR[0] &= (~(0XF0));
342 SYSCFG->EXTICR[0] = 0x230;
343 __enable_irq();
344}
345
346// Unsure of actual fix for linker error
347// temporary (lol) solution
348void _init() {}
DeviceHandle_t A3G4250D_init(A3G4250D *, char[DEVICE_NAME_LENGTH], GPIO_TypeDef *, unsigned long, const float, const uint8_t *, const int8_t *)
Initialiser for a A3G4250D gyroscope.
Definition a3g4250d.c:27
DeviceHandle_t BMP581_init(BMP581 *, char[DEVICE_NAME_LENGTH], GPIO_TypeDef *, unsigned long, const float, const float)
Initialiser for a BMP581 barometer.
Definition bmp581.c:27
DeviceHandle_t Flash_init(Flash *, char[DEVICE_NAME_LENGTH], GPIO_TypeDef *, unsigned long, int, long)
Initialise flash struct.
Definition flash.c:33
Definition gps.h:62
DeviceHandle_t KX134_1211_init(KX134_1211 *, char[DEVICE_NAME_LENGTH], GPIO_TypeDef *, unsigned long, const uint8_t, const uint8_t *, const int8_t *)
Initialiser for a KX134-1211 accelerometer.
Definition kx134_1211.c:25
DeviceHandle_t LoRa_init(LoRa *, char[DEVICE_NAME_LENGTH], GPIO_TypeDef *, unsigned long, Bandwidth, SpreadingFactor, CodingRate)
Initializes the LoRa module with specified configuration parameters.
Definition lora.c:37
DeviceHandle_t UART_init(UART *, char[DEVICE_NAME_LENGTH], USART_TypeDef *, GPIO_TypeDef *, UART_Pins, uint32_t, OversampleMode)
Initialiser for a UART device interface.
Definition uart.c:26
Struct definition for UART interface.
Definition uart.h:53
void vSystemInit(void *pvParameters)
Initialisation of RTOS tasks.
Definition main.c:185
void configure_interrupts()
Definition main.c:331
int Shell_init(Shell *)
Initializes the shell, registering programs from shell vector.
Definition shell.c:45
Definition shell.h:34
Definition flash.h:30
Definition lora.h:95