Код
if(ModeStruct.Discreteness_hall) {
if ((step_counter % ModeStruct.Discreteness_hall) == 0) {
ADC1->SQR3 = ADC_Channel_0;
ADC1->CR2 |= ADC_CR2_SWSTART; //Start ADC
}
}
if (ModeStruct.Discreteness_l) {
if ((step_counter % ModeStruct.Discreteness_l) == 0) {
ADC1->SQR3 = ADC_Channel_1;
ADC1->CR2 |= ADC_CR2_SWSTART; //Start ADC
}
}
if (ModeStruct.Discreteness_diff) {
if ((step_counter % ModeStruct.Discreteness_diff) == 0) {
ADC1->SQR3 = ADC_Channel_2;
ADC1->CR2 |= ADC_CR2_SWSTART; //Start ADC
}
}
if ((step_counter % ModeStruct.Discreteness_hall) == 0) {
ADC1->SQR3 = ADC_Channel_0;
ADC1->CR2 |= ADC_CR2_SWSTART; //Start ADC
}
}
if (ModeStruct.Discreteness_l) {
if ((step_counter % ModeStruct.Discreteness_l) == 0) {
ADC1->SQR3 = ADC_Channel_1;
ADC1->CR2 |= ADC_CR2_SWSTART; //Start ADC
}
}
if (ModeStruct.Discreteness_diff) {
if ((step_counter % ModeStruct.Discreteness_diff) == 0) {
ADC1->SQR3 = ADC_Channel_2;
ADC1->CR2 |= ADC_CR2_SWSTART; //Start ADC
}
}
Вот инициализация (тоже кусок):
Код
ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStruct.ADC_ScanConvMode = DISABLE;
ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;
ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStruct.ADC_NbrOfConversion = 1;
ADC_Init(ADC1, &ADC_InitStruct);
ADC_InitStruct.ADC_ScanConvMode = DISABLE;
ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;
ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStruct.ADC_NbrOfConversion = 1;
ADC_Init(ADC1, &ADC_InitStruct);
Столкнулся с такой проблемой, что в какой-то момент очередное преобразование АЦП запускается до того, как завершилось предыдущее, после чего отключается DMA.
Подскажите, как максимально быстро можно проверить, завершилось ли предыдущее преобразование, можно ли запускать следующее?
Пробовал проверять таким вот образом:
Код
ADC1->SQR3 = ADC_Channel_0;
ADC1->CR2 |= ADC_CR2_SWSTART; //Start ADC
while(!(ADC1->SR & (uint32_t)ADC_FLAG_EOC)) {}
ADC1->SR &= ~((uint32_t)ADC_FLAG_EOC);
ADC1->CR2 |= ADC_CR2_SWSTART; //Start ADC
while(!(ADC1->SR & (uint32_t)ADC_FLAG_EOC)) {}
ADC1->SR &= ~((uint32_t)ADC_FLAG_EOC);
Без DMA такой способ работает. Но когда включаю DMA, то флаг окончания преобразования не поднимается, видимо его DMA раньше перехватывает и сам сбрасывает.
Была мысль делать небольшую задержку после запуска преобразования, но что-то я запутался, как рассчитать время, необходимое для завершения перобразования. А конкретно, как определить часосту тактирования АЦП? Частота ядра в моем случае 168МГц, соответстсвенно шина APB2 работает на частоте 84МГц. Значит и частота АЦП 84МГц, или есть еще какие-то предделители? Вводит в заблуждение предделитель в ADC common control register. Учитывается ли этот регистр при работе с одним АЦП или используется только когда запускаю 2 или 3 АЦП одновременно?