/** * @brief Application entry point. * @details */ int main(void) { /* System initializations. * - HAL initialization, this also initializes the configured device drivers * and performs the board-specific initializations. * - Kernel initialization, the main() function becomes a thread and the * RTOS is active. */ halInit(); chSysInit(); /* Initializes a serial-over-USB CDC driver. */ sduObjectInit(&SDU1); sduStart(&SDU1, &serusbcfg); /* Activates the USB driver and then the USB bus pull-up on D+. * Note, a delay is inserted in order to not have to disconnect the cable * after a reset. */ usbStop(serusbcfg.usbp); usbDisconnectBus(serusbcfg.usbp); chThdSleepMilliseconds(500); usbConnectBus(serusbcfg.usbp); usbStart(serusbcfg.usbp, &usbcfg); /* Activates the serial driver 4 using the driver's default configuration. */ sdStart(&SD4, NULL); /* Activates the I2C driver 2. */ i2cInit(); i2cStart(&I2CD2, &i2cfg_d2); /* Enables the CRC peripheral clock. */ rccEnableCRC(FALSE); /* Loads settings from external EEPROM chip. */ if (eepromLoadSettings()) { g_boardStatus |= EEPROM_24C02_DETECTED; } /* Initializes the MPU6050 sensor. */ if (mpu6050Init()) { g_boardStatus |= MPU6050_LOW_DETECTED; /* Creates a taken binary semaphore. */ chBSemInit(&bsemNewDataReady, TRUE); /* Creates the MPU6050 polling thread and attitude calculation thread. */ chThdCreateStatic(waPollMPU6050Thread, sizeof(waPollMPU6050Thread), NORMALPRIO + 1, PollMPU6050Thread, NULL); chThdCreateStatic(waAttitudeThread, sizeof(waAttitudeThread), HIGHPRIO, AttitudeThread, NULL); /* Starts motor drivers. */ pwmOutputStart(); /* Starts ADC and ICU input drivers. */ mixedInputStart(); } /* Creates the blinker thread. */ chThdCreateStatic(waBlinkerThread, sizeof(waBlinkerThread), LOWPRIO, BlinkerThread, NULL); /* Normal main() thread activity. */ while (TRUE) { g_chnp = serusbcfg.usbp->state == USB_ACTIVE ? (BaseChannel *)&SDU1 : (BaseChannel *)&SD4; telemetryReadSerialData(); if (eepromIsDataLeft()) { eepromContinueSaving(); } chThdSleepMilliseconds(TELEMETRY_SLEEP_MS); } /* This point should never be reached. */ return 0; }
/** * @brief Configures and activates the CRC peripheral. * * @param[in] crcp pointer to the @p CRCDriver object * * @notapi */ void crc_lld_start(CRCDriver *crcp) { if (crcp->config == NULL) crcp->config = &default_config; rccEnableCRC(FALSE); #if STM32_CRC_PROGRAMMABLE == TRUE crcp->crc->INIT = crcp->config->initial_val; crcp->crc->POL = crcp->config->poly; crcp->crc->CR = 0; switch(crcp->config->poly_size) { case 32: break; case 16: crcp->crc->CR |= CRC_CR_POLYSIZE_0; break; case 8: crcp->crc->CR |= CRC_CR_POLYSIZE_1; break; case 7: crcp->crc->CR |= CRC_CR_POLYSIZE_1 | CRC_CR_POLYSIZE_0; break; default: osalDbgAssert(false, "hardware doesn't support polynomial size"); break; }; if (crcp->config->reflect_data) { crcp->crc->CR |= CRC_CR_REV_IN_1 | CRC_CR_REV_IN_0; } if (crcp->config->reflect_remainder) { crcp->crc->CR |= CRC_CR_REV_OUT; } #else osalDbgAssert(crcp->config->initial_val == default_config.initial_val, "hardware doesn't support programmable initial value"); osalDbgAssert(crcp->config->poly_size == default_config.poly_size, "hardware doesn't support programmable polynomial size"); osalDbgAssert(crcp->config->poly == default_config.poly, "hardware doesn't support programmable polynomial"); osalDbgAssert(crcp->config->reflect_data == default_config.reflect_data, "hardware doesn't support reflect of input data"); osalDbgAssert(crcp->config->reflect_remainder == default_config.reflect_remainder, "hardware doesn't support reflect of output remainder"); #endif #if CRC_USE_DMA == TRUE #if STM32_CRC_PROGRAMMABLE == TRUE crcp->dmamode = STM32_DMA_CR_DIR_M2M | STM32_DMA_CR_PINC | STM32_DMA_CR_MSIZE_BYTE | STM32_DMA_CR_PSIZE_BYTE | STM32_DMA_CR_TEIE | STM32_DMA_CR_TCIE | STM32_DMA_CR_PL(STM32_CRC_CRC1_DMA_PRIORITY); #else crcp->dmamode = STM32_DMA_CR_DIR_M2M | STM32_DMA_CR_PINC | STM32_DMA_CR_MSIZE_WORD | STM32_DMA_CR_PSIZE_WORD | STM32_DMA_CR_TEIE | STM32_DMA_CR_TCIE | STM32_DMA_CR_PL(STM32_CRC_CRC1_DMA_PRIORITY); #endif { bool b; b = dmaStreamAllocate(crcp->dma, STM32_CRC_CRC1_DMA_IRQ_PRIORITY, (stm32_dmaisr_t)crc_lld_serve_interrupt, (void *)crcp); osalDbgAssert(!b, "stream already allocated"); } #endif }