23.10.2015, 10:39
|
|
Гражданин KAZUS.RU
Регистрация: 26.09.2005
Сообщений: 569
Сказал спасибо: 58
Сказали Спасибо 509 раз(а) в 135 сообщении(ях)
|
ADC STM32F303, только CMSIS. Где-то меня застопорило... Подскажите, кто понимает
ADC STM32F303, только CMSIS. Где-то меня застопорило... Подскажите, кто понимает
1. Нет максимального быстродействия АЦП (5 MIPS)
Частота AHB 72 МГц (контролируется)
- в простом цикле:
for (i=0 ; i ‹ BLOCK_ADC ; i++)
{
// while ((ADC1-›ISR & ADC_ISR_EOC) == 0){} ;
ADC_array[i] = ADC1-›DR & ADC_DR_RDATA ;
}
Время преобразования АЦП 0,5 мкс
Вероятно так и должно быть, это время цикла for а не быстродействие АЦП.
С раскоментированным while это время ~0,67 мкс
Но при включении ПДП (DMA) время преобразования АЦП становится ›3 мкс
Игрался и с синхронным клоком
RCC-›AHBENR |= RCC_AHBENR_ADC12EN; //подаем тактирование АЦП
ADC1_2_COMMON-›CCR |= ADC12_CCR_CKMODE_0; // | ADC12_CCR_CKMODE_1;
и с асинхронным
RCC-›CFGR2 |= RCC_CFGR2_ADCPRE12_DIV1; // при RCC-›CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
RCC-›AHBENR |= RCC_AHBENR_ADC12EN; //Без этой инициализации АЦП не заводится
ADC1_2_COMMON-›CCR &= ~(ADC12_CCR_CKMODE_0 | ADC12_CCR_CKMODE_1);
Простой for 0,5 мкс
ПДП (DMA) ›3 мкс
Где-то я крепко лопухнуля...
Код:
//===============Настройка DMA=============
void InitADC_DMA(void)
{
RCC-›AHBENR |= RCC_AHBENR_DMA1EN; //Тактирование ПДП
DMA1_Channel1-›CPAR = (uint32_t) (&(ADC1-›DR)); // Источник данных АЦП
DMA1_Channel1-›CMAR = (uint32_t)(ADC_array); // Куда грузить
DMA1_Channel1-›CNDTR = BLOCK_ADC; // Сколько грузить
DMA1_Channel1-›CCR |= DMA_CCR_MINC | DMA_CCR_MSIZE_0 | DMA_CCR_PSIZE_0 ;//MSIZE_0 и PSIZE_0 это 16 бит
DMA1_Channel1-›CCR |= DMA_CCR_CIRC; //Периодическая перезапись буфера ПДП
DMA1_Channel1-›CCR |= DMA_CCR_TEIE | DMA_CCR_TCIE ; // Разрешить прерывание
DMA1_Channel1-›CCR |= DMA_CCR_EN; // Разрешить ПДП
NVIC_EnableIRQ(DMA1_Channel1_IRQn);
NVIC_SetPriority(DMA1_Channel1_IRQn,1);
}
//===============Настройка АЦП=============
void AdcInit(void)
{
RCC-›AHBENR |= RCC_AHBENR_GPIOAEN; // Разрешить тактирование порта PORTA
GPIOA-›MODER |= GPIO_MODER_MODER1; //Аналоговый вход PA1/*
RCC-›CFGR2 |= RCC_CFGR2_ADCPRE12_DIV1;
delay_us (20);
RCC-›AHBENR |= RCC_AHBENR_ADC12EN; //подаем тактирование АЦП
ADC1_2_COMMON-›CCR &= ~(ADC12_CCR_CKMODE_0 | ADC12_CCR_CKMODE_1);
ADC1_2_COMMON-›CCR |= ADC12_CCR_CKMODE_0;
ADC1-›CR = 0; // На всякий случай
ADC1-›CR &= ~ADC_CR_ADVREGEN; //Это вроде как выключение регулятора напряжения
ADC1-›CR |= ADC_CR_ADVREGEN_0; // | ADC_CR_ADVREGEN_1;
delay_us (20);
ADC1-›CR |= ADC_CR_ADCAL; //Запуск калибровки
while ((ADC1-›CR & ADC_CR_ADCAL) != 0) {}; //Ожидание ее конца
ADC1-›CR |= ADC_CR_ADEN; //включить АЦП
SinchTime=ADC1-›CALFACT & ADC_CALFACT_CALFACT_S;
send_pac(0xCA); // Отправка пакета
while ((ADC1-›ISR & ADC_ISR_ADRD) == 0) {}; //Ожидание готовности АЦП
send_pac(0xDA); // Отправка пакета
ADC1-›SQR1 |= 1‹‹7; //ADC_SQR1_SQ1_0 //выбор канала PA1
ADC1-›CFGR |= ADC_CFGR_OVRMOD; // Незнаю зачем
ADC1-›CFGR |= ADC_CFGR_CONT; // | (1 ‹‹ 26) | ADC_CFGR_AWDEN | ADC_CFGR_AWDSGL;
// ADC1-›CFGR |= ADC_CFGR_DMAEN | ADC_CFGR_DMACFG; // включаю/выключаю ПДП для АЦП
}
На 103-их и 051-ых кристаллах проблем не возникало, но там 1 мкс...
__________________
Будь проще, дойдет и до синтеза.
|
|
|
|
24.10.2015, 09:30
|
|
Гражданин KAZUS.RU
Регистрация: 26.09.2005
Сообщений: 569
Сказал спасибо: 58
Сказали Спасибо 509 раз(а) в 135 сообщении(ях)
|
Re: ADC STM32F303, только CMSIS. Где-то меня застопорило... Подскажите, кто понимает
Господа, вопрос снят!
Сам виноват - некорректная обработка прерывания ПДП.
Нужно было внимательнее смотреть флаги и...
Обязательно(!) стопорить ПДП АЦП.
Тему решил продолжить, может кому и пригодится, а может и совета дождусь...
Немогу пока объяснить себе следующее:
Прерывание от AWD1 (аналоговый компаратор 1)
На вход АЦП подаю одиночный импульс -› АЦП схватывает и... обрабатывает событие
Код:
void ADC1_2_IRQHandler(void)
{volatile uint8_t AdrDMA;
SinchTime=TIM2-›CNT;//Запоминаю время вызова
AdrDMA = ((uint8_t) (DMA1_Channel1-›CNDTR )) ;//считываю регистр текущего счетчика данных DMA
ADC1-›IER &= ~ADC_IER_AWD1;// Запрет прерывания от AWD
ADC1-›ISR |= ADC_ISR_AWD1; //Очистка флага AWD
//Этот способ работает c редкими исключениями - зависает, в while (AdrDMA... и понятно почему!!!!!!!!!!
// AdrDMA -= 10; //все-таки здесь нужно еще подумать
// while (AdrDMA != (uint8_t) (DMA1_Channel1-›CNDTR)){};
delay_us (5);//Считаю такой метод некорректным, но как-то работает!!!!!
ADC1-›CFGR &= ~ADC_CFGR_DMAEN; //Остановил DMA ADC
ADC1-›CR |= ADC_CR_ADSTP; //остановить АЦП
ADC_array[AdrDMA] = 0x2000;//Метка в массиве - когда сработал AWD
send_dat();//Передача данных на комп для анализа
ADC1-›ISR |= ADC_ISR_EOC;//Сбросить флаг преобразования
ADC1-›CFGR |= ADC_CFGR_DMAEN ; //Разрешил DMA =========================
ADC1-›IER = ADC_IER_AWD1;// Разрешить прерывания от AWD
// NVIC_EnableIRQ(ADC1_2_IRQn);// =================================
ADC1-›CR |= ADC_CR_ADSTART; //Снова запустить процес преобразования
}
Загвоздка в том, что AdrDMA получает значения совершенно не связанные с фронтом приходящего импульса.
Понимаю, что при времени преобразования 0,2 мкс две команды это ощутимо "долго" и DMA при этом щелкал, но синхронизаци отсутствует напрочь (см. рисунок)
На рисунке три асинхронных записи.
В надежде на толкование и помощь...
P.S. Поправка - импульс на рисунке длителность 2 мкс (не 1 мкс, как указано). Длительность цикла записи буфера (127 слов) около 25 мкс.
__________________
Будь проще, дойдет и до синтеза.
Последний раз редактировалось marera; 25.10.2015 в 17:12.
|
|
|
|
06.02.2016, 01:30
|
|
Гражданин KAZUS.RU
Регистрация: 26.09.2005
Сообщений: 569
Сказал спасибо: 58
Сказали Спасибо 509 раз(а) в 135 сообщении(ях)
|
Re: ADC STM32F303, только CMSIS. Где-то меня застопорило... Подскажите, кто понимает
Сообщение от marera
|
Попрежнемему немогу пока объяснить описанное в перд. посте
|
Пояснения:
AdrDMA = ((uint8_t) (DMA1_Channel1-›CNDTR )) ;//считываю регистр текущего счетчика данных DMA
Эта строка просто считывает текущее значение счетчика регистра данных DMA1_Channel1-›CNDTR
Далее - пишу в массив по адресу словленного счетчика DMA значение вдвое больше допустимого от АЦП
ADC_array[AdrDMA] = 0x2000;//Метка в массиве - когда сработал AWD
send_dat();//Передача данных на комп для анализа
Загвоздка так и осталась - метка срабатывания AWD1 (AdrDMA) почему-то получает значения совершенно не связанные с фронтом импульса, который его (срабатывание) вызвал.
Время преобразования 0,2 мкс АЦП и ощутимо для считывания DMA1_Channel1-›CNDTR, но выяснить причину моего непонимания очень хочется.
(В работе-то все прошло, работает как должно, но непонятка осталась)
__________________
Будь проще, дойдет и до синтеза.
|
|
|
|
03.04.2016, 23:18
|
|
Гражданин KAZUS.RU
Регистрация: 26.09.2005
Сообщений: 569
Сказал спасибо: 58
Сказали Спасибо 509 раз(а) в 135 сообщении(ях)
|
Re: ADC STM32F303, только CMSIS. Где-то меня застопорило... Подскажите, кто понимает
Неужели ни кому столь шикарный АЦП 303-го так и не пригодился всерьез?
__________________
Будь проще, дойдет и до синтеза.
|
|
|
|
04.04.2016, 00:05
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.02.2008
Сообщений: 1,812
Сказал спасибо: 126
Сказали Спасибо 605 раз(а) в 422 сообщении(ях)
|
Re: ADC STM32F303, только CMSIS. Где-то меня застопорило... Подскажите, кто понимает
Почему? Использовал, пробовал. Сверхскорость не нужна была. Все работает.
|
|
|
|
04.04.2016, 00:44
|
|
Прописка
Регистрация: 09.02.2011
Сообщений: 164
Сказал спасибо: 1
Сказали Спасибо 27 раз(а) в 22 сообщении(ях)
|
Re: ADC STM32F303, только CMSIS. Где-то меня застопорило... Подскажите, кто понимает
Сообщение от marera
|
AdrDMA = ((uint8_t) (DMA1_Channel1-›CNDTR ))
|
А что, в 303 счетчик в дма 8 битный?
|
|
|
|
04.04.2016, 11:03
|
|
Гражданин KAZUS.RU
Регистрация: 26.09.2005
Сообщений: 569
Сказал спасибо: 58
Сказали Спасибо 509 раз(а) в 135 сообщении(ях)
|
Re: ADC STM32F303, только CMSIS. Где-то меня застопорило... Подскажите, кто понимает
Сообщение от Impartial
|
А что, в 303 счетчик в дма 8 битный?
|
AdrDMA 8-битный (буфер DMA 128 байт), но мысль для подумать о кольце счетчика DMA важная!?!
__________________
Будь проще, дойдет и до синтеза.
|
|
|
|
04.04.2016, 11:37
|
|
Прописка
Регистрация: 09.02.2011
Сообщений: 164
Сказал спасибо: 1
Сказали Спасибо 27 раз(а) в 22 сообщении(ях)
|
Re: ADC STM32F303, только CMSIS. Где-то меня застопорило... Подскажите, кто понимает
Тогда нужно быть уверенным, что обращение к этому регистру дма сгенерировано не байтное.
|
|
|
|
04.04.2016, 21:03
|
|
Гражданин KAZUS.RU
Регистрация: 16.02.2012
Сообщений: 441
Сказал спасибо: 89
Сказали Спасибо 735 раз(а) в 149 сообщении(ях)
|
Re: ADC STM32F303, только CMSIS. Где-то меня застопорило... Подскажите, кто понимает
Цитата:
|
Неужели ни кому столь шикарный АЦП 303-го так и не пригодился всерьез?
|
еще интереснее - запустить в режиме интерлива, и получить 10msps - с экранчиком 320х200 за 4$ уже на уровне начальных не-игрушечных скопов, минимум в 5 раз дешевле...
|
|
|
|
04.04.2016, 22:57
|
|
Почётный гражданин KAZUS.RU
Регистрация: 12.11.2004
Адрес: Москва
Сообщений: 8,587
Сказал спасибо: 704
Сказали Спасибо 4,353 раз(а) в 1,996 сообщении(ях)
|
Re: ADC STM32F303, только CMSIS. Где-то меня застопорило... Подскажите, кто понимает
Сообщение от marera
|
Неужели ни кому столь шикарный АЦП 303-го так и не пригодился всерьез?
|
Портал закрыт. Все ушли #насрач.
__________________
Я не помогаю. Я провоцирую думать.
Не дай вам Бог плохих контактов.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 01:57.
|
|