int main() { /* IOCON_PIO1_5 = 0x000000d0; GPIO1DIR |= 1 << 5; GPIO1MASKED[1 << 5] = 0; for (int i = 0;; i++) { GPIO1MASKED[1 << 5] = i; } */ matrixled_init(); ux_init(); #if ENEBLE_WDT == 1 slowClock(); #endif #if SYSTICK_WAIT == 1 #if ENEBLE_WDT == 1 InitSysTick(120000); #else InitSysTick(12000); // 12,000,000Hz 12,000 -> 10 = 1ms #endif #endif #if ENEBLE_WDT == 0 initUART(); #endif /* for (;;) { playMML("C"); println("TEST\n"); toggleSounder(); wait(10000); } // uart(); */ // bitman(); // bitman2(); for (;;) { if (!ux_state()) { break; } WAIT(10); } for (;;) { animate(DATA_ANIM, LEN_DATA_ANIM); app_mikuji(); // app_keytest(); app_renda(); } return 0; }
int main(void) { ms = 0; InitGPIO(); InitLCD(); InitSysTick(); limpaLCD(); for(;;) { } }
ILI9341::ILI9341(): TftDriver() { InitSysTick(); configTftFsmc(); fsmcSetup(); initTft(); configBacklightPWM(); //setBacklightON(333); //fadeBacklightON(); }
//---------------------------------------------------------------------------------------------------------------------------------------- // Hauptprogramm //---------------------------------------------------------------------------------------------------------------------------------------- int main (void) { // I2C initialisieren I2C_LowLevel_Init(I2C1, I2C_Clockspeed , I2C_OwnAddress); // I2C initialisieren -> Kanal 1, clockspeed, Materadresse // Systick timer initialisieren InitSysTick(); // SysTick timer initialisieren (Ladewert, Clockspeed) // Timer2 initialisieren InitTIM2_PWM(); // Timer 2 initialisieren -> notwendig um PWM Signal auszugeben // Aktiviere Port C für Motor Polarität RCC->APB2ENR |= (1UL << 4); // Enable GPIOC GPIOC->CRL = 0x33333333; // PortC 0..7 als Output -> Output Mode, max speed 50MHz ; General purpose output Open-drain // MPU-6050 initialisieren Init_MPU6050(); // Beschleunigungswerte und Drehraten vom MPU-6050 lesen i2cData[0] = 0x3B; I2C_Write(I2C1, i2cData, 1, I2C_MPUAddress); I2C_Read(I2C1, i2cDataRead, 14, I2C_MPUAddress); // Daten ordnen und abspeichern accY = ((i2cDataRead[2] << 8) | i2cDataRead[3]); accZ = ((i2cDataRead[4] << 8) | i2cDataRead[5]); gyroX = ((i2cDataRead[8] << 8) | i2cData[9]); //Kalibrierung von accY, accZ und gyroX - Werte wurden in einem Versuch ermittelt accY = accY - 150; accZ = accZ - 451.63; gyroX = gyroX + 273.25; //Winkel initialisieren accYangle = (atan2(accY, accZ))*RAD_TO_DEG; // Winkel aus Beschleunigungswerten berechnen setAngle(accYangle); // Kalman-(Start)Winkel setzen gyroAngle = accYangle; // Drehratenwinkel initialisieren compAngle = accYangle; // Komplementärwinkel initialisieren SysTick->CTRL |= 0x01; // Systick timer einschalten - sonst würde dieser bereits vor der Inittialisierung auslösen //while-Schleife um auf den Interrupt des Systick timers zu warten while(1) { }//while }//int main
void TFC_Init() { InitClock(); /* Initialize clock system for 48 MHz */ InitSysTick(); /* Configure the timer and the interrupt to be used to generate the tick of the scheduler */ TFC_InitGPIO(); TFC_InitServos(); TFC_InitMotorPWM(); TFC_InitADCs(); TFC_InitLineScanCamera(); TFC_InitTerminal(); TFC_InitUARTs(); TFC_HBRIDGE_DISABLE; TFC_SetMotorPWM(0,0); TFC_RGB_Init(); TFC_Accel_Init(); }
/** ******************************************************************************* * @brief Initialize OS * @param[in] None * @param[out] None * @retval None * * @par Description * @details This function is called to initialize OS. * * @note You must call this function first,before any other OS API function * * @code There is a example for useage of this function,as follows: * e.g. * ... // Your target initial code. * * OsInit(); // Initial OS. * CreateTask(...); // Create tasks. * ... * OsStart(); // Start multitask. * @endcode ******************************************************************************* */ void CoInitOS(void) { InitSysTick(); /* Initialize system tick. */ InitInt(); /* Initialize PendSV,SVC,SysTick interrupt */ CreateTCBList(); /* Create TCB list. */ #if CFG_EVENT_EN > 0 CreateEventList(); /* Create event control list. */ #endif #if CFG_KHEAP_EN > 0 CoCreateKheap(); /* Create kernel heap within user define */ #endif OsSchedLock(); /* Lock Schedule */ /* Create first task -- IDLE task. */ CoCreateTask( CoIdleTask, Co_NULL, CFG_LOWEST_PRIO, &idle_stk[CFG_IDLE_STACK_SIZE-1], CFG_IDLE_STACK_SIZE ); /* Set PSP for CoIdleTask coming in */ SetEnvironment(&idle_stk[CFG_IDLE_STACK_SIZE-1]); }
//***************************************************************************** // //! initDriver //! //! @param None //! //! @return none //! //! @brief The function initializes a CC3000 device and triggers it to start //! operation // //***************************************************************************** int initDriver(void) { // Init GPIO's pio_init(); // Init Spi init_spi(); // Enable processor interrupts MAP_IntMasterEnable(); // WLAN On API Implementation wlan_init( CC3000_UsynchCallback, sendWLFWPatch, sendDriverPatch, sendBootLoaderPatch, ReadWlanInterruptPin, WlanInterruptEnable, WlanInterruptDisable, WriteWlanPin); // Trigger a WLAN device wlan_start(0); // Turn on the LED 1 (RED) to indicate that we are active and initiated WLAN successfully turnLedOn(1); // Mask out all non-required events from CC3000 wlan_set_event_mask(HCI_EVNT_WLAN_KEEPALIVE|HCI_EVNT_WLAN_UNSOL_INIT |HCI_EVNT_WLAN_ASYNC_PING_REPORT); DispatcherUARTConfigure(SysCtlClockGet()); SysCtlDelay(1000000); // Generate teh event to CLI: send a version string { char cc3000IP[50]; char *ccPtr; unsigned short ccLen; DispatcherUartSendPacket((unsigned char*)pucUARTExampleAppString, sizeof(pucUARTExampleAppString)); ccPtr = &cc3000IP[0]; ccLen = itoa(PALTFORM_VERSION, ccPtr); ccPtr += ccLen; *ccPtr++ = '.'; ccLen = itoa(APPLICATION_VERSION, ccPtr); ccPtr += ccLen; *ccPtr++ = '.'; ccLen = itoa(SPI_VERSION_NUMBER, ccPtr); ccPtr += ccLen; *ccPtr++ = '.'; ccLen = itoa(DRIVER_VERSION_NUMBER, ccPtr); ccPtr += ccLen; *ccPtr++ = '\f'; *ccPtr++ = '\r'; *ccPtr++ = '\0'; DispatcherUartSendPacket((unsigned char*)cc3000IP, strlen(cc3000IP)); } ucStopSmartConfig = 0; // Configure SysTick to occur X times per second, to use as a time // reference. Enable SysTick to generate interrupts. InitSysTick(); return(0); }
int main(void) { /* initialize the core clock and the systick timer */ InitClock(); InitSysTick(); /* initialize the RGB led */ LED_Init(); /* Initialize UART0 */ InitUart0(); /* double rainbow all across the sky */ DoubleFlash(); /* initialize the I2C bus */ I2C_Init(); #if DATA_FUSE_MODE /* signaling for fusion */ FusionSignal_Init(); #endif // DATA_FUSE_MODE /* initialize UART fifos */ RingBuffer_Init(&uartInputFifo, &uartInputData, UART_RX_BUFFER_SIZE); RingBuffer_Init(&uartOutputFifo, &uartOutputData, UART_TX_BUFFER_SIZE); /* initialize UART0 interrupts */ Uart0_InitializeIrq(&uartInputFifo, &uartOutputFifo); Uart0_EnableReceiveIrq(); /* initialize I2C arbiter */ InitI2CArbiter(); /* initialize the IMUs */ InitHMC5883L(); InitMPU6050(); // InitMPU6050(); #if ENABLE_MMA8451Q InitMMA8451Q(); #endif /* Wait for the config messages to get flushed */ //TrafficLight(); DoubleFlash(); RingBuffer_BlockWhileNotEmpty(&uartOutputFifo); #if ENABLE_MMA8451Q /* initialize the MMA8451Q data structure for accelerometer data fetching */ mma8451q_acc_t acc; MMA8451Q_InitializeData(&acc); #endif /* initialize the MPU6050 data structure */ mpu6050_sensor_t accgyrotemp, previous_accgyrotemp; MPU6050_InitializeData(&accgyrotemp); MPU6050_InitializeData(&previous_accgyrotemp); /* initialize the HMC5883L data structure */ hmc5883l_data_t compass, previous_compass; HMC5883L_InitializeData(&compass); HMC5883L_InitializeData(&previous_compass); /* initialize HMC5883L reading */ uint32_t lastHMCRead = 0; const uint32_t readHMCEvery = 1000 / 75; /* at 75Hz, data come every (1000/75Hz) ms. */ /************************************************************************/ /* Fetch scaler values */ /************************************************************************/ #if DATA_FUSE_MODE const fix16_t mpu6050_accelerometer_scaler = mpu6050_accelerometer_get_scaler(); const fix16_t mpu6050_gyroscope_scaler = mpu6050_gyroscope_get_scaler(); const fix16_t hmc5883l_magnetometer_scaler = hmc5883l_magnetometer_get_scaler(); #endif // DATA_FUSE_MODE /************************************************************************/ /* Prepare data fusion */ /************************************************************************/ #if DATA_FUSE_MODE uint32_t last_transmit_time = 0; uint32_t last_fusion_time = systemTime(); fusion_initialize(); #endif // DATA_FUSE_MODE /************************************************************************/ /* Main loop */ /************************************************************************/ for(;;) { /* helper variables to track data freshness */ uint_fast8_t have_gyro_data = 0; uint_fast8_t have_acc_data = 0; uint_fast8_t have_mag_data = 0; /************************************************************************/ /* Determine if sensor data fetching is required */ /************************************************************************/ /* helper variables for event processing */ int eventsProcessed = 0; int readMPU, readHMC; #if ENABLE_MMA8451Q int readMMA; #endif /* atomic detection of fresh data */ __disable_irq(); #if ENABLE_MMA8451Q readMMA = poll_mma8451q; #endif readMPU = poll_mpu6050; poll_mma8451q = 0; poll_mpu6050 = 0; __enable_irq(); /* detection of HMC read */ /* * TODO: read synchronized with MPU */ readHMC = 0; uint32_t time = systemTime(); if ((time - lastHMCRead) >= readHMCEvery) { readHMC = 1; lastHMCRead = time; } /************************************************************************/ /* Fetching MPU6050 sensor data if required */ /************************************************************************/ /* read accelerometer/gyro */ if (readMPU) { LED_BlueOff(); I2CArbiter_Select(MPU6050_I2CADDR); MPU6050_ReadData(&accgyrotemp); /* mark event as detected */ eventsProcessed = 1; /* check for data freshness */ have_acc_data = (accgyrotemp.accel.x != previous_accgyrotemp.accel.x) || (accgyrotemp.accel.y != previous_accgyrotemp.accel.y) || (accgyrotemp.accel.z != previous_accgyrotemp.accel.z); have_gyro_data = (accgyrotemp.gyro.x != previous_accgyrotemp.gyro.x) || (accgyrotemp.gyro.y != previous_accgyrotemp.gyro.y) || (accgyrotemp.gyro.z != previous_accgyrotemp.gyro.z); /* loop current data --> previous data */ previous_accgyrotemp = accgyrotemp; } /************************************************************************/ /* Fetching HMC5883L sensor data if required */ /************************************************************************/ /* read compass data */ if (readHMC) { I2CArbiter_Select(HMC5883L_I2CADDR); HMC5883L_ReadData(&compass); /* mark event as detected */ eventsProcessed = 1; /* check for data freshness */ have_mag_data = (compass.x != previous_compass.x) || (compass.y != previous_compass.y) || (compass.z != previous_compass.z); /* loop current data --> previous data */ previous_compass = compass; } /************************************************************************/ /* Fetching MMA8451Q sensor data if required */ /************************************************************************/ #if ENABLE_MMA8451Q /* read accelerometer */ if (readMMA) { LED_RedOff(); I2CArbiter_Select(MMA8451Q_I2CADDR); MMA8451Q_ReadAcceleration14bitNoFifo(&acc); /* mark event as detected */ eventsProcessed = 1; } #endif /************************************************************************/ /* Raw sensor data output over serial */ /************************************************************************/ #if DATA_FETCH_MODE /* data availability + sanity check * This sent me on a long bug hunt: Sometimes the interrupt would be raised * even if not all data registers were written. This always resulted in a * z data register not being fully written which, in turn, resulted in * extremely jumpy measurements. */ if (readMPU && accgyrotemp.status != 0) { /* write data */ uint8_t type = 0x02; P2PPE_TransmissionPrefixed(&type, 1, (uint8_t*)accgyrotemp.data, sizeof(accgyrotemp.data), IO_SendByte); } /* data availability + sanity check */ if (readHMC && (compass.status & HMC5883L_SR_RDY_MASK) != 0) /* TODO: check if not in lock state */ { uint8_t type = 0x03; P2PPE_TransmissionPrefixed(&type, 1, (uint8_t*)compass.xyz, sizeof(compass.xyz), IO_SendByte); } #if ENABLE_MMA8451Q /* data availability + sanity check */ if (readMMA && acc.status != 0) { uint8_t type = 0x01; P2PPE_TransmissionPrefixed(&type, 1, (uint8_t*)acc.xyz, sizeof(acc.xyz), IO_SendByte); } #endif #endif // DATA_FETCH_MODE /************************************************************************/ /* Sensor data fusion */ /************************************************************************/ #if DATA_FUSE_MODE // if there were sensor data ... if (eventsProcessed) { v3d gyro, acc, mag; // convert, calibrate and store gyroscope data if (have_gyro_data) { sensor_prepare_mpu6050_gyroscope_data(&gyro, accgyrotemp.gyro.x, accgyrotemp.gyro.y, accgyrotemp.gyro.z, mpu6050_gyroscope_scaler); fusion_set_gyroscope_v3d(&gyro); } // convert, calibrate and store accelerometer data if (have_acc_data) { sensor_prepare_mpu6050_accelerometer_data(&acc, accgyrotemp.accel.x, accgyrotemp.accel.y, accgyrotemp.accel.z, mpu6050_accelerometer_scaler); fusion_set_accelerometer_v3d(&acc); } // convert, calibrate and store magnetometer data if (have_mag_data) { sensor_prepare_hmc5883l_data(&mag, compass.x, compass.y, compass.z, hmc5883l_magnetometer_scaler); fusion_set_magnetometer_v3d(&mag); } // get the time differential const uint32_t current_time = systemTime(); const fix16_t deltaT_ms = fix16_from_int(current_time - last_fusion_time); const fix16_t deltaT = fix16_mul(deltaT_ms, F16(0.001)); last_fusion_time = current_time; FusionSignal_Predict(); // predict the current measurements fusion_predict(deltaT); FusionSignal_Update(); // correct the measurements fusion_update(deltaT); FusionSignal_Clear(); #if 0 fix16_t yaw, pitch, roll; fusion_fetch_angles(&roll, &pitch, &yaw); #if 0 float yawf = fix16_to_float(yaw), pitchf = fix16_to_float(pitch), rollf = fix16_to_float(roll); IO_SendInt16((int16_t)yawf); IO_SendInt16((int16_t)pitchf); IO_SendInt16((int16_t)rollf); IO_SendByteUncommited('\r'); IO_SendByte('\n'); #else if (current_time - last_transmit_time >= 100) { /* write data */ uint8_t type = 42; fix16_t buffer[3] = { roll, pitch, yaw }; P2PPE_TransmissionPrefixed(&type, 1, (uint8_t*)buffer, sizeof(buffer), IO_SendByte); last_transmit_time = current_time; } #endif #else if (current_time - last_transmit_time >= 100) { /* write data */ switch (output_mode) { case RPY: { fix16_t roll, pitch, yaw; fusion_fetch_angles(&roll, &pitch, &yaw); /* write data */ uint8_t type = 42; fix16_t buffer[3] = { roll, pitch, yaw }; P2PPE_TransmissionPrefixed(&type, 1, (uint8_t*)buffer, sizeof(buffer), IO_SendByte); break; } case QUATERNION: { qf16 orientation; fusion_fetch_quaternion(&orientation); uint8_t type = 43; fix16_t buffer[4] = { orientation.a, orientation.b, orientation.c, orientation.d }; P2PPE_TransmissionPrefixed(&type, 1, (uint8_t*)buffer, sizeof(buffer), IO_SendByte); break; } case QUATERNION_RPY: { fix16_t roll, pitch, yaw; fusion_fetch_angles(&roll, &pitch, &yaw); qf16 orientation; fusion_fetch_quaternion(&orientation); uint8_t type = 44; fix16_t buffer[7] = { orientation.a, orientation.b, orientation.c, orientation.d, roll, pitch, yaw }; P2PPE_TransmissionPrefixed(&type, 1, (uint8_t*)buffer, sizeof(buffer), IO_SendByte); break; } case SENSORS_RAW: { uint8_t type = 0; fix16_t buffer[6] = { acc.x, acc.y, acc.z, mag.x, mag.y, mag.z }; P2PPE_TransmissionPrefixed(&type, 1, (uint8_t*)buffer, sizeof(buffer), IO_SendByte); break; } } last_transmit_time = current_time; } #endif } #endif // DATA_FUSE_MODE /************************************************************************/ /* Read user data input */ /************************************************************************/ /* as long as there is data in the buffer */ while(!RingBuffer_Empty(&uartInputFifo)) { /* light one led */ LED_RedOn(); /* fetch byte */ uint8_t data = IO_ReadByte(); output_mode = (output_mode_t)data; LED_RedOff(); #if 0 /* echo to output */ IO_SendByte(data); /* mark event as detected */ eventsProcessed = 1; #endif } /************************************************************************/ /* Save energy if you like to */ /************************************************************************/ /* in case of no events, allow a sleep */ if (!eventsProcessed) { /* * Care must be taken with this instruction here, as it can lead * to a condition where after being woken up (e.g. by the SysTick) * and looping through, immediately before entering WFI again * an interrupt would yield a true condition for the branches below. * In this case this loop would be blocked until the next IRQ, * which, in case of a 1ms SysTick timer, could be too late. * * To counter this behaviour, SysTick has been speed up by factor * four (0.25ms). */ #if 0 __WFI(); #endif } } return 0; }