Делаю проект с шестью регулярными каналами АЦП. Данные забираю через DMA. Вначале и АЦП и ПДП запускались сразу и вопросов не возникало.
Позже появилась необходимость запускать АЦП по таймеру (задержка на считывание данных и отключение питания во время простоя включены). В принципе ничего сложного нет, все это есть в примерах и в интернете. Но.
Во-первых: не понятен нюанс с битами EOC и EOCS и задержкой. Если в ADC_CR2 бит EOCS установить в 1, то бит EOC будет выставлятся при завершении преобразования каждого канала. Хотя если смотреть описание самого бита EOC в регистре ADC_SR, то там написано наоборот (Conversion complete (EOCS=0), or sequence of conversions complete (EOCS=1)). Плюс в описании к хардварным задержкам также есть сноска и там указано (When ADC_CR2_EOCS = 1, the delay is inserted after each sequence of regular group
conversions). Раздел про АЦП RM0038
Во-вторых: разьясните, пожалуйста, правильно ли я считаю времена. Время преобразования одного канала = ((384+12)/16000000) = 24,75 мкс
Код: Выделить всё
ADC_InitStructure.ADC_ScanConvMode = ENABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Falling;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T9_TRGO;
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfConversion = ADC_Nomber_of_Conv;
ADC_Init(ADC1, &ADC_InitStructure);
ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_384Cycles);
ADC_RegularChannelConfig(ADC1,ADC_Channel_1,2,ADC_SampleTime_4Cycles);
ADC_RegularChannelConfig(ADC1,ADC_Channel_19,3,ADC_SampleTime_384Cycles);
ADC_RegularChannelConfig(ADC1,ADC_Channel_16,4,ADC_SampleTime_384Cycles);
ADC_RegularChannelConfig(ADC1,ADC_Channel_17,5,ADC_SampleTime_384Cycles);
ADC_RegularChannelConfig(ADC1,ADC_Channel_7,6,ADC_SampleTime_384Cycles);
ADC_EOCOnEachRegularChannelCmd(ADC1, ENABLE);//?
ADC_PowerDownCmd(ADC1, ADC_PowerDown_Idle_Delay, ENABLE);
ADC_DelaySelectionConfig(ADC1, ADC_DelayLength_Freeze);
ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);
ADC_DMACmd(ADC1, ENABLE);
ADC_TempSensorVrefintCmd(ENABLE);
ADC_Cmd(ADC1, ENABLE);
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_ADONS) == RESET);
// ADC_SoftwareStartConv(ADC1); 