Всё! Сдаюсь!
В SPL АЦП запускал - настроилосьи работало. На CMSIS что то буксую...
Задача: Настроить DMA, настроить АЦП1+АЦП2 в фаст интерливе, 1,5 Cycle, однократный ручной запуск (SWSTART), 160 отсчётов.
Делаю настройку DMA:
Спойлер
Код:
/***********************************************************************/
/*************** ИНИЦИАЛИЗАЦИЯ АЦП1+АЦП2 ЧЕРЕЗ ДМА ******************/
/***********************************************************************/
void Init_ADC_DMA(void)
{
/******* Настраиваем DMA1_Channel1 для ADC1+ADC2 *********/
// Сброс DMA1_Channel1
DMA1_Channel1->CCR &= (uint16_t)(~DMA_CCR1_EN); // Отключить DMA1_Channel1
DMA1_Channel1->CCR = 0;
DMA1_Channel1->CNDTR = 0;
DMA1_Channel1->CPAR = 0;
DMA1_Channel1->CMAR = 0;
DMA1->IFCR |= (uint32_t)(DMA_ISR_GIF1 | DMA_ISR_TCIF1 | DMA_ISR_HTIF1 | DMA_ISR_TEIF1); // Сброс прерываний
// Настройка DMA1_Channel1
DMA1_Channel1->CCR &= (uint32_t)0xFFFF800F; // Сброс битов MEM2MEM, PL, MSIZE, PSIZE, MINC, PINC, CIRC, DIR
RCC->AHBENR |= RCC_AHBENR_DMA1EN; // подаём такты на DMA1
DMA1_Channel1->CPAR = (uint32_t)&ADC1->DR; // адрес периферийного устройства
DMA1_Channel1->CMAR = (uint32_t)&BUFFER_ADC; // адрес памяти
DMA1_Channel1->CCR |= DMA_CCR1_MINC; // увеличиваем адрес памяти
DMA1_Channel1->CNDTR = buffer_size; // количество ячеек для АЦП
DMA1_Channel1->CCR |= DMA_CCR1_MSIZE_0; // Half-word
DMA1_Channel1->CCR |= DMA_CCR1_PSIZE_0; // Half-word
DMA1_Channel1->CCR |= DMA_CCR1_PL; // Наивысший приоритет (ADC1+ADC2)->DMA->SRAM
DMA1_Channel1->CCR |= DMA_CCR1_TCIE; // прерывание по окончанию передачи
DMA1_Channel1->CCR |= DMA_CCR1_EN; // разрешаем работу DMA
Настраиваю АЦП1 и АЦП2 в фаст интерлив:
Спойлер
Код:
/******* Настраиваем ADC1+ADC2 (interleaved) *********/
// ADC_Deinit
RCC->APB2RSTR |= RCC_APB2RSTR_ADC1RST; // Сброс модуля АЦП1
RCC->APB2RSTR &= ~RCC_APB2RSTR_ADC1RST;
RCC->APB2RSTR |= RCC_APB2RSTR_ADC2RST; // Сброс модуля АЦП2
RCC->APB2RSTR &= ~RCC_APB2RSTR_ADC2RST;
RCC->CFGR &=~ RCC_CFGR_ADCPRE_DIV2; // Fsmpl=PCLK/2
// Включить тактирование ADC1 и ADC2
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;
RCC->APB2ENR |= RCC_APB2ENR_ADC2EN;
// ADC1
ADC1->CR1 = 0;
ADC1->CR1 |= (ADC_CR1_DUALMOD_0 | ADC_CR1_DUALMOD_1 | ADC_CR1_DUALMOD_2); // Fast-интелив ADC1+ADC2
ADC1->CR2 = 0;
ADC1->CR2 |= (ADC_CR2_DMA | ADC_CR2_CONT); // Задействуем DMA и непрерывный режим
ADC1->CR2 &=~ ADC_CR2_EXTTRIG;
ADC1->CR2 |= ADC_CR2_EXTSEL; // запуск от SWSTART
ADC1->SQR1 &=~ ADC_SQR1_L; // 1 преобразование
ADC1->SQR3 &=~ ADC_SQR3_SQ1; // Канал 0
ADC1->SMPR2 &=~ ADC_SMPR2_SMP0; // 1.5 cycle
// ADC2
ADC2->CR1 = 0;
ADC2->CR1 |= (ADC_CR1_DUALMOD_0 | ADC_CR1_DUALMOD_1 | ADC_CR1_DUALMOD_2); // Fast-интелив ADC1+ADC2
ADC2->CR2 = 0;
ADC2->CR2 |= (ADC_CR2_DMA | ADC_CR2_CONT); // Задействуем DMA и непрерывный режим
ADC2->CR2 |= ADC_CR2_EXTTRIG; // зачем ???
ADC2->CR2 |= ADC_CR2_EXTSEL; // запуск от SWSTART
ADC2->SQR1 &=~ ADC_SQR1_L; // 1 преобразование
ADC2->SQR3 &=~ ADC_SQR3_SQ1; // Канал 0
ADC2->SMPR2 &=~ ADC_SMPR2_SMP0; // 1.5 cycle
ADC1->CR2 |= ADC_CR2_DMA; // Включить DMA
ADC1->CR2 |= ADC_CR2_ADON; // Включить ADC1
ADC1->CR2 |= ADC_CR2_RSTCAL; // Сброс калибровки ADC1
while(ADC1->CR2 & ADC_CR2_RSTCAL) {} // Ждём пока сбросится ADC1
ADC1->CR2 |= ADC_CR2_CAL; // Калибруемся
while (!(ADC1->CR2 & ADC_CR2_CAL)); // Ждём окончания
ADC2->CR2 |= ADC_CR2_ADON; // Включить ADC2
ADC2->CR2 |= ADC_CR2_RSTCAL; // Сброс калибровки ADC2
while(ADC2->CR2 & ADC_CR2_RSTCAL) {} // Ждём пока сбросится ADC2
ADC2->CR2 |= ADC_CR2_CAL; // Калибруемся
while (!(ADC2->CR2 & ADC_CR2_CAL)); // Ждём окончания
Пускаю так:
Спойлер
Код:
// Стартуем !!!
ADC1->CR2 |= ADC_CR2_SWSTART; // SWSTART
while(DMA1->ISR & DMA_ISR_TCIF1) {} // Ждём когда флаг окончания передачи
DMA1->IFCR |= DMA_IFCR_CTCIF1; // Сбросим флаг
DMA1_Channel1->CNDTR = buffer_size; // Пинаем ДМА
uint8_t i, j;
for(i = 0; i < 160; i++)
{
BUFFER2_ADC_16[j++] = BUFFER_ADC[i] >> 16; // из ADC2
BUFFER1_ADC_16[j++] = BUFFER_ADC[i] & 0xFFFF; // из ADC1
}
Вроде всё по RM и примерам с ST делал, а так же ковырялся в исходниках SPL.
Возможно где то что то я уже изменил, глаз замылен, так что сорри.
ЧЯДНТ?
Уж извините что заставляю копаться в моём коде...
Спасибо.