//***************************************************************************** // // This is the handler for the ADC interrupt. Even though more than one // sequencer is used, they are configured so that this one runs last. // Therefore when this ADC sequencer interrupt occurs, we know all of the ADC // data has been acquired. // //***************************************************************************** void ADC0SS0Handler(void) { // // Clear the interrupts for all ADC sequencers that are used. // MAP_ADCIntClear(ADC0_BASE, 0); MAP_ADCIntClear(ADC1_BASE, 0); // // Retrieve the data from all ADC sequencers // MAP_ADCSequenceDataGet(ADC0_BASE, 0, &g_pui32ADCData[0]); MAP_ADCSequenceDataGet(ADC1_BASE, 0, &g_pui32ADCData[8]); // // Set the time stamp, assume it is what was set for the last match // value. This will be close to the actual time that the samples were // acquired, within a few microseconds. // g_pui32TimeStamp[0] = g_pui32NextMatch[0]; g_pui32TimeStamp[1] = g_pui32NextMatch[1]; // // Increment the ADC interrupt count // g_ui32ADCCount++; }
void ADC0_SampleHandler() { MAP_ADCIntClear(ADC0_BASE, 3); MAP_ADCSequenceDataGet(ADC0_BASE, 3, adc_value); inputData[inputIndex++] = (float) adc_value[0]; if (inputIndex > TEST_LENGTH_SAMPLES - 1) { inputIndex = 0; // 'Permanently disable interrupt' // We will only run the fft once for now MAP_ADCIntDisable(ADC0_BASE, 3); MAP_TimerDisable(TIMER1_BASE, TIMER_A); runFFT(); // Delay for 1 second MAP_SysCtlDelay(g_ui32SysClock / 3); //Re-enable timer and ADC interrupts to run another FFT MAP_ADCIntEnable(ADC0_BASE, 3); MAP_TimerEnable(TIMER1_BASE, TIMER_A); } }
void configureADC() { MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0); MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD); MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER1); MAP_SysCtlDelay(2); // Disable sequencer 0 MAP_ADCSequenceDisable(ADC0_BASE, 3); // // Configure GPIO Pin // MAP_GPIOPinTypeADC(GPIO_PORTD_BASE, GPIO_PIN_7); // ************************** // Configure timer // ************************** MAP_TimerConfigure(TIMER1_BASE, TIMER_CFG_PERIODIC); // Load timer for periodic sampling of ADC MAP_TimerLoadSet(TIMER1_BASE, TIMER_A, g_ui32SysClock/SAMPLING_RATE); // Enable ADC triggering MAP_TimerControlTrigger(TIMER1_BASE, TIMER_A, true); // Trigger ADC on timer A timeout MAP_TimerADCEventSet(TIMER1_BASE, TIMER_ADC_TIMEOUT_A); // ************************** // Configure ADC // ************************** // Clear the interrupt raw status bit (should be done early // on, because it can take several cycles to clear.) MAP_ADCIntClear(ADC0_BASE, 3); // ADC0, Seq 0, Timer triggered, Priority 0 MAP_ADCSequenceConfigure(ADC0_BASE, 3, ADC_TRIGGER_TIMER, 0); // MAP_ADCSequenceConfigure(ADC0_BASE, 3, ADC_TRIGGER_PROCESSOR, 0); /*// Set all 8 sequencer steps to sample from analog channel 5 (PD7) int i; for(i = 0; i < 1; i++) { MAP_ADCSequenceStepConfigure(ADC0_BASE, 0, i, ADC_CTL_CH5 | ADC_CTL_IE | ADC_CTL_END); } // Configure step 7 to trigger interrupt, and be the end of sequence // MAP_ADCSequenceStepConfigure(ADC0_BASE, 0, 7, ADC_CTL_CH5 | ADC_CTL_IE | ADC_CTL_END); */ MAP_ADCSequenceStepConfigure(ADC0_BASE, 3, 0, ADC_CTL_CH4 | ADC_CTL_IE | ADC_CTL_END); MAP_ADCSequenceEnable(ADC0_BASE, 3); // Enable interrupts when sample conversion complete MAP_ADCIntEnable(ADC0_BASE, 3); // Enable NVIC interrupt for ADC0 SS0 MAP_IntEnable(INT_ADC0SS3); MAP_IntMasterEnable(); MAP_TimerEnable(TIMER1_BASE, TIMER_A); }
//***************************************************************************** // // This function is called to start an acquisition running. It determines // which channels are to be logged, enables the ADC sequencers, and computes // the first RTC match value. This will start the acquisition running. // //***************************************************************************** void AcquireStart(tConfigState *psConfig) { uint32_t ui32Idx, pui32RTC[2], ui32SelectedMask; // // Check the parameters // ASSERT(psConfig); if(!psConfig) { return; } // // Update the config state pointer, save the selected item mask // g_psConfigState = psConfig; ui32SelectedMask = psConfig->ui16SelectedMask; // // Get the logging period from the logger configuration. Split the // period into seconds and subseconds pieces and save for later use in // generating RTC match values. // g_pui32MatchPeriod[0] = psConfig->ui32Period >> 8; g_pui32MatchPeriod[1] = (psConfig->ui32Period & 0xFF) << 8; // // Determine how many channels are to be logged // ui32Idx = ui32SelectedMask; g_ui32NumItems = 0; while(ui32Idx) { if(ui32Idx & 1) { g_ui32NumItems++; } ui32Idx >>= 1; } // // Initialize the strip chart manager for a new run. Don't bother with // the strip chart if we are using viewer mode, or sleep-logging. // if((psConfig->ui8Storage != CONFIG_STORAGE_VIEWER) && !psConfig->ui32SleepLogging) { StripChartMgrInit(); StripChartMgrConfigure(ui32SelectedMask); } // // Configure USB for memory stick if USB storage is chosen // if(psConfig->ui8Storage == CONFIG_STORAGE_USB) { USBStickOpenLogFile(0); } else if(psConfig->ui8Storage == CONFIG_STORAGE_FLASH) { // // Flash storage is to be used, prepare the flash storage module. // If already sleep-logging, then pass in the saved flash address // so it does not need to be searched. // if(psConfig->ui32SleepLogging) { FlashStoreOpenLogFile(psConfig->ui32FlashStore); } else { // // Otherwise not sleep logging, so just initialize the flash store, // this will cause it to search for the starting storage address. // FlashStoreOpenLogFile(0); } } // // Enable the ADC sequencers // MAP_ADCSequenceEnable(ADC0_BASE, 0); MAP_ADCSequenceEnable(ADC1_BASE, 0); // // Flush the ADC sequencers to be sure there is no lingering data. // MAP_ADCSequenceDataGet(ADC0_BASE, 0, g_pui32ADCData); MAP_ADCSequenceDataGet(ADC1_BASE, 0, g_pui32ADCData); // // Enable ADC interrupts // MAP_ADCIntClear(ADC0_BASE, 0); MAP_ADCIntClear(ADC1_BASE, 0); MAP_ADCIntEnable(ADC0_BASE, 0); MAP_IntEnable(INT_ADC0SS0); // // If we are not already sleep-logging, then initialize the RTC match. // If we are sleep logging then this does not need to be set up. // if(!psConfig->ui32SleepLogging) { // // Get the current RTC value // do { pui32RTC[0] = HibernateRTCGet(); pui32RTC[1] = HibernateRTCSSGet(); } while(pui32RTC[0] != HibernateRTCGet()); // // Set an initial next match value. Start with the subseconds always // 0 so the first match value will always be an even multiple of the // subsecond match. Add 2 seconds to the current RTC just to be clear // of an imminent rollover. This means that the first match will occur // between 1 and 2 seconds from now. // g_pui32NextMatch[0] = pui32RTC[0] + 2; g_pui32NextMatch[1] = 0; // // Now set the match value // HibernateRTCMatchSet(0, g_pui32NextMatch[0]); HibernateRTCSSMatchSet(0, g_pui32NextMatch[1]); } // // If we are configured to sleep, but not sleeping yet, then enter sleep // logging mode if allowed. // if(psConfig->bSleep && !psConfig->ui32SleepLogging) { // // Allow sleep logging if storing to flash at a period of 1 second // or greater. // if((psConfig->ui8Storage == CONFIG_STORAGE_FLASH) && (psConfig->ui32Period >= 0x100)) { psConfig->ui32SleepLogging = 1; } } // // Enable the RTC interrupts from the hibernate module // HibernateIntClear(HibernateIntStatus(0)); HibernateIntEnable(HIBERNATE_INT_RTC_MATCH_0 | HIBERNATE_INT_PIN_WAKE); MAP_IntEnable(INT_HIBERNATE); // // Logging data should now start running // }