//================================================================================ // ADC0_enter_DefaultMode_from_RESET //================================================================================ extern void ADC0_enter_DefaultMode_from_RESET(void) { // $[ADC_Init] ADC_Init_TypeDef init = ADC_INIT_DEFAULT; ADC_InitScan_TypeDef scanInit = ADC_INITSCAN_DEFAULT; init.ovsRateSel = false;//关闭过采样 init.timebase = ADC_TimebaseCalc(0); init.prescale = ADC_PrescaleCalc(7000000, 0); ADC_Init(ADC0, &init); // [ADC_Init]$ // $[ADC_InitSingle] // [ADC_InitSingle]$ // $[ADC_InitScan] scanInit.reference = adcRefVDD;//3.31V scanInit.input = ADC_SCANCTRL_INPUTMASK_CH4 | //轮询通道CH4、CH5、CH6(PD4\PD5\PD6) ADC_SCANCTRL_INPUTMASK_CH5 | ADC_SCANCTRL_INPUTMASK_CH6; scanInit.resolution = adcRes8Bit;//8位分辨率 // [ADC_InitScan]$ ADC_InitScan(ADC0, &scanInit); }
/***************************************************************************//** * @brief * Configure ADC and DMA for this application. *******************************************************************************/ static void guitarADCConfig(void) { DMA_CfgDescr_TypeDef descrCfg; DMA_CfgChannel_TypeDef chnlCfg; ADC_Init_TypeDef init = ADC_INIT_DEFAULT; ADC_InitScan_TypeDef scanInit = ADC_INITSCAN_DEFAULT; /* Configure DMA usage by ADC */ cbInData.cbFunc = guitarDMAInCb; cbInData.userPtr = NULL; /* Set up high pri channel with callback with request from ADC scan complete. */ chnlCfg.highPri = true; chnlCfg.enableInt = true; chnlCfg.select = DMAREQ_ADC0_SCAN; chnlCfg.cb = &cbInData; DMA_CfgChannel(GUITAR_DMA_AUDIO_IN, &chnlCfg); /* Configure datasize, increment and primary, alternate structure for pingpong. */ descrCfg.dstInc = dmaDataInc2; descrCfg.srcInc = dmaDataIncNone; descrCfg.size = dmaDataSize2; descrCfg.arbRate = dmaArbitrate1; descrCfg.hprot = 0; DMA_CfgDescr(GUITAR_DMA_AUDIO_IN, true, &descrCfg); DMA_CfgDescr(GUITAR_DMA_AUDIO_IN, false, &descrCfg); DMA_ActivatePingPong(GUITAR_DMA_AUDIO_IN, false, guitarAudioInBuffer1, (void *)((uint32_t) &(ADC0->SCANDATA)), (GUITAR_AUDIO_BUFFER_SAMPLES * 2) - 1, guitarAudioInBuffer2, (void *)((uint32_t) &(ADC0->SCANDATA)), (GUITAR_AUDIO_BUFFER_SAMPLES * 2) - 1); /* Configure ADC */ /* Keep warm due to "high" frequency sampling */ init.warmUpMode = adcWarmupKeepADCWarm; /* Init common issues for both single conversion and scan mode */ /* 0 means, figure out the base frequency based on current cmu config. */ init.timebase = ADC_TimebaseCalc(0); /* Calculate necessary prescaler to get 4MHz adc clock with current cmu configuration. */ init.prescale = ADC_PrescaleCalc(4000000, 0); /* Sample potentiometer by tailgating in order to not disturb fixed rate */ /* audio sampling. */ init.tailgate = true; ADC_Init(ADC0, &init); /* Init for scan sequence use (audio in right/left channels). */ scanInit.prsSel = adcPRSSELCh0; scanInit.prsEnable = true; scanInit.reference = adcRefVDD; scanInit.input = ADC_SCANCTRL_INPUTMASK_CH6 | ADC_SCANCTRL_INPUTMASK_CH7; ADC_InitScan(ADC0, &scanInit); }
static void ADCConfig(void) { DMA_CfgDescr_TypeDef descrCfg; DMA_CfgChannel_TypeDef chnlCfg; ADC_Init_TypeDef init = ADC_INIT_DEFAULT; ADC_InitScan_TypeDef scanInit = ADC_INITSCAN_DEFAULT; /* Configure DMA usage by ADC */ cbInData.cbFunc = adcCb; cbInData.userPtr = NULL; chnlCfg.highPri = true; chnlCfg.enableInt = true; chnlCfg.select = DMAREQ_ADC0_SCAN; chnlCfg.cb = &cbInData; DMA_CfgChannel(DMA_CHANNEL_ADC, &chnlCfg); descrCfg.dstInc = dmaDataInc2; descrCfg.srcInc = dmaDataIncNone; descrCfg.size = dmaDataSize2; descrCfg.arbRate = dmaArbitrate1; descrCfg.hprot = 0; DMA_CfgDescr(DMA_CHANNEL_ADC, true, &descrCfg); DMA_CfgDescr(DMA_CHANNEL_ADC, false, &descrCfg); DMA_ActivatePingPong(DMA_CHANNEL_ADC, false, sourceP, (void *)((uint32_t) &(ADC0->SCANDATA)), N - 1, sourceS, (void *)((uint32_t) &(ADC0->SCANDATA)), N - 1); /* Indicate starting with primary in-buffer (according to above DMA setup) */ bufferPrimary = true; /* Configure ADC */ /* Keep warm due to "high" frequency sampling */ init.warmUpMode = adcWarmupKeepADCWarm; /* Init common issues for both single conversion and scan mode */ init.timebase = ADC_TimebaseCalc(0); init.prescale = ADC_PrescaleCalc(4000000, 0); /* Sample potentiometer by tailgating in order to not disturb fixed rate */ /* audio sampling. */ init.tailgate = true; ADC_Init(ADC0, &init); /* Init for scan sequence use (audio in right/left channels). */ scanInit.prsSel = adcPRSSELCh0; scanInit.prsEnable = true; scanInit.reference = adcRefVDD; scanInit.input = ADC_SCANCTRL_INPUTMASK_CH6 | ADC_SCANCTRL_INPUTMASK_CH7; ADC_InitScan(ADC0, &scanInit); }
void setupADC( void ) { ADC_Init_TypeDef adcInit = ADC_INIT_DEFAULT; adcInit.timebase = ADC_TimebaseCalc(0); adcInit.prescale = ADC_PrescaleCalc(4000000, 0); adcInit.warmUpMode = adcWarmupKeepADCWarm; adcInit.tailgate = true; ADC_Init(ADC0, &adcInit); ADC_InitScan_TypeDef adcInitScan = ADC_INITSCAN_DEFAULT; adcInitScan.prsSel = adcPRSSELCh0; adcInitScan.prsEnable = true; adcInitScan.reference = adcRefVDD; adcInitScan.input = ADC_SCANCTRL_INPUTMASK_CH6 | ADC_SCANCTRL_INPUTMASK_CH7; ADC_InitScan(ADC0, &adcInitScan); }
/***************************************************************************//** * @brief * Configure ADC usage for this application. *******************************************************************************/ static void accelADCConfig(void) { ADC_Init_TypeDef init = ADC_INIT_DEFAULT; ADC_InitScan_TypeDef scanInit = ADC_INITSCAN_DEFAULT; /* Init common issues for both single conversion and scan mode */ init.timebase = ADC_TimebaseCalc(0); init.prescale = ADC_PrescaleCalc(4000000, 0); ADC_Init(ADC0, &init); /* Init for scan sequence use (accelerometer X, Y and Z axis). */ scanInit.reference = adcRefVDD; scanInit.input = ADC_SCANCTRL_INPUTMASK_CH2 | ADC_SCANCTRL_INPUTMASK_CH3 | ADC_SCANCTRL_INPUTMASK_CH4; ADC_InitScan(ADC0, &scanInit); }
/***************************************************************************//** * @brief * Configure ADC usage for this application. *******************************************************************************/ static void preampADCConfig(void) { DMA_CfgDescr_TypeDef descrCfg; DMA_CfgChannel_TypeDef chnlCfg; ADC_Init_TypeDef init = ADC_INIT_DEFAULT; ADC_InitSingle_TypeDef singleInit = ADC_INITSINGLE_DEFAULT; ADC_InitScan_TypeDef scanInit = ADC_INITSCAN_DEFAULT; /* Configure DMA usage by ADC */ cbInData.cbFunc = preampDMAInCb; cbInData.userPtr = NULL; chnlCfg.highPri = true; chnlCfg.enableInt = true; chnlCfg.select = DMAREQ_ADC0_SCAN; chnlCfg.cb = &cbInData; DMA_CfgChannel(PREAMP_DMA_AUDIO_IN, &chnlCfg); descrCfg.dstInc = dmaDataInc2; descrCfg.srcInc = dmaDataIncNone; descrCfg.size = dmaDataSize2; descrCfg.arbRate = dmaArbitrate1; descrCfg.hprot = 0; DMA_CfgDescr(PREAMP_DMA_AUDIO_IN, true, &descrCfg); DMA_CfgDescr(PREAMP_DMA_AUDIO_IN, false, &descrCfg); DMA_ActivatePingPong(PREAMP_DMA_AUDIO_IN, false, preampAudioInBuffer1, (void *)((uint32_t)&(ADC0->SCANDATA)), (PREAMP_AUDIO_BUFFER_SIZE * 2) - 1, preampAudioInBuffer2, (void *)((uint32_t)&(ADC0->SCANDATA)), (PREAMP_AUDIO_BUFFER_SIZE * 2) - 1); /* Indicate starting with primary in-buffer (according to above DMA setup) */ preampProcessPrimary = true; /* Configure ADC */ /* Keep warm due to "high" frequency sampling */ init.warmUpMode = adcWarmupKeepADCWarm; /* Init common issues for both single conversion and scan mode */ init.timebase = ADC_TimebaseCalc(0); init.prescale = ADC_PrescaleCalc(4000000, 0); /* Sample potentiometer by tailgating in order to not disturb fixed rate */ /* audio sampling. */ init.tailgate = true; ADC_Init(ADC0, &init); /* Init for single conversion use (potentiometer). */ singleInit.reference = adcRefVDD; singleInit.input = adcSingleInpCh5; /* According to DVK HW design */ singleInit.resolution = adcRes8Bit; /* Use at least 8 bit since unlinear voltage */ ADC_InitSingle(ADC0, &singleInit); /* Init for scan sequence use (audio in right/left channels). */ scanInit.prsSel = adcPRSSELCh0; scanInit.prsEnable = true; scanInit.reference = adcRefVDD; scanInit.input = ADC_SCANCTRL_INPUTMASK_CH0 | ADC_SCANCTRL_INPUTMASK_CH1; ADC_InitScan(ADC0, &scanInit); }
/******************************************************************//** * @brief * Configure ADC device * * @details * * @note * * @param[in] dev * Pointer to device descriptor * * @param[in] cmd * ADC control command * * @param[in] args * Arguments * * @return * Error code *********************************************************************/ static rt_err_t rt_adc_control( rt_device_t dev, rt_uint8_t cmd, void *args) { RT_ASSERT(dev != RT_NULL); struct efm32_adc_device_t *adc; adc = (struct efm32_adc_device_t *)(dev->user_data); switch (cmd) { case RT_DEVICE_CTRL_SUSPEND: /* Suspend device */ dev->flag |= RT_DEVICE_FLAG_SUSPENDED; adc->adc_device->CMD = ADC_CMD_SINGLESTOP | ADC_CMD_SCANSTOP; break; case RT_DEVICE_CTRL_RESUME: /* Resume device */ dev->flag &= ~RT_DEVICE_FLAG_SUSPENDED; switch (adc->mode) { case ADC_MODE_SINGLE: ADC_Start(adc->adc_device, adcStartSingle); break; case ADC_MODE_SCAN: ADC_Start(adc->adc_device, adcStartScan); break; case ADC_MODE_TAILGATE: ADC_Start(adc->adc_device, adcStartScanAndSingle); break; default: return -RT_ERROR; } break; case RT_DEVICE_CTRL_ADC_MODE: { /* change device setting */ struct efm32_adc_control_t *control; control = (struct efm32_adc_control_t *)args; switch (control->mode) { case ADC_MODE_SINGLE: ADC_InitSingle(adc->adc_device, control->singleInit); break; case ADC_MODE_SCAN: ADC_InitScan(adc->adc_device, control->scanInit); break; case ADC_MODE_TAILGATE: ADC_InitSingle(adc->adc_device, control->singleInit); ADC_InitScan(adc->adc_device, control->scanInit); break; default: return -RT_ERROR; } adc->mode = control->mode; } break; case RT_DEVICE_CTRL_ADC_RESULT: switch (adc->mode) { case ADC_MODE_SINGLE: while (adc->adc_device->STATUS & ADC_STATUS_SINGLEACT); *((rt_uint32_t *)args) = ADC_DataSingleGet(adc->adc_device); break; case ADC_MODE_SCAN: while (adc->adc_device->STATUS & ADC_STATUS_SCANACT); *((rt_uint32_t *)args) = ADC_DataScanGet(adc->adc_device); break; case ADC_MODE_TAILGATE: while (adc->adc_device->STATUS & ADC_STATUS_SCANACT); *((rt_uint32_t *)args) = ADC_DataScanGet(adc->adc_device); while (adc->adc_device->STATUS & ADC_STATUS_SINGLEACT); *((rt_uint32_t *)args + 1) = ADC_DataSingleGet(adc->adc_device); break; default: return -RT_ERROR; } break; } return RT_EOK; }