|
STM32F4 ADC DMA ? |
|
|
|
Jul 22 2012, 14:14
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Помогите пожалуйста. Хочу запустить АЦД непрерывно на оцифровку последовательно 12 каналов, чтобы складывало с массив. Вот код. Не могу понять - после инициализации DMA, в его регисторах все нули. Пробовал заускать программу - в массиве тоже все нули. Код //volatile u16 ADCConvertedValue[12]; <- the results are here void adc_init(void){ ADC_InitTypeDef ADC_InitStruct; ADC_CommonInitTypeDef ADC_CommonInitStruct; DMA_InitTypeDef DMA_InitStructure; // ports are already configured RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); // enable clocking of ADC1 RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_DMA2,ENABLE); // enable clocking of DMA2 //==Configure DMA2 - Channel0 Stream 4== DMA_InitStructure.DMA_Channel = DMA_Channel_0; DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->DR; DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t) &ADCConvertedValue; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; DMA_InitStructure.DMA_BufferSize = 12; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(DMA2_Stream4, &DMA_InitStructure); DMA_Cmd( DMA2_Stream4, ENABLE); // ADC: ADC_DeInit(); // turn ADC off ADC_CommonInitStruct.ADC_Mode =ADC_Mode_Independent; ADC_CommonInitStruct.ADC_Prescaler =ADC_Prescaler_Div4; ADC_CommonInitStruct.ADC_DMAAccessMode =ADC_DMAAccessMode_Disabled; ADC_CommonInitStruct.ADC_TwoSamplingDelay =ADC_TwoSamplingDelay_5Cycles; ADC_CommonInit(&ADC_CommonInitStruct); ADC_StructInit(&ADC_InitStruct); ADC_InitStruct.ADC_Resolution =ADC_Resolution_12b; ADC_InitStruct.ADC_ScanConvMode =ENABLE; ADC_InitStruct.ADC_ContinuousConvMode =ENABLE; ADC_InitStruct.ADC_DataAlign =ADC_DataAlign_Right;//Left; ADC_InitStruct.ADC_NbrOfConversion =12; ADC_Init(ADC1,&ADC_InitStruct); //----channels order ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1,ADC_SampleTime_480Cycles);// PC0 ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2,ADC_SampleTime_480Cycles);// PC1 ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 3,ADC_SampleTime_480Cycles);// PC2 ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 4,ADC_SampleTime_480Cycles);// PC3 ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 5,ADC_SampleTime_480Cycles);// PA0 ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 6,ADC_SampleTime_480Cycles);// PA1 ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 7,ADC_SampleTime_480Cycles);// PA2 ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 8,ADC_SampleTime_480Cycles);// PA3 ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 9,ADC_SampleTime_480Cycles);// PA6 ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 10,ADC_SampleTime_480Cycles);// PA7 ADC_RegularChannelConfig(ADC1, ADC_Channel_14,11,ADC_SampleTime_480Cycles);// PC4 ADC_RegularChannelConfig(ADC1, ADC_Channel_15,12,ADC_SampleTime_480Cycles);// PC5 // enable ADC and DMA: ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE); ADC_DMACmd(ADC1, ENABLE); //Enable ADC1 DMA ADC_Cmd(ADC1, ENABLE); //Enable ADC1 ADC_SoftwareStartConv(ADC1); // start ADC conversions } //----------------------------- Проц stm32f407, J-Link, Keil 4.23
|
|
|
|
|
 |
Ответов
|
Jan 9 2014, 08:17
|
Частый гость
 
Группа: Участник
Сообщений: 90
Регистрация: 12-12-13
Пользователь №: 79 587

|
Необходимо измерить сигнал с нескольких каналов последовательно, сохраняя данные в память через DMA. Измерять надо крайне быстро. Действую таким образом: выбираю канал, запускаю АЦП. Вот кусок кода: Код 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 } } Вот инициализация (тоже кусок): Код 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_CommonInit(&ADC_CommonInitStruct)? Какая частота тактирования у АЦП? В заблуждение ввел предделитель в вышеупомянутой ADC_CommonInitStruct. Если я работаю только с одним АЦП, его тактовая частота будет равна частоте шины APB2 без всяких предделителей? Если чатстота APB2 = 84 МГц, а частота ядра 168Мгц, то в моем случае на оцифровку одного канала будет 15*(186/84) = 15*2 = 30 системных тиков. Верно? Если да, то поидее должен успеть оцифровать до запуска следующего канала. Но для подстраховки, перед запуском очередного преобразования, как лучше проверить (поять же, максимально быстро) завершилось ли предыдущее преобразование? Пробовал перед началом преобразования проверять флаг конца преобразования (EOC), но он похоже сбрасывается, когда DMA забирает данные в память.
Сообщение отредактировал Haamu - Jan 9 2014, 08:28
|
|
|
|
Сообщений в этой теме
Allregia STM32F4 ADC DMA ? Jul 22 2012, 14:14 Allregia Ошибка была чисто механическая:
RCC_AHB1PeriphRe... Jul 23 2012, 07:27 ViKo Цитата(Allregia @ Jul 23 2012, 10:27) Оши... Jul 23 2012, 07:44  kan35 Цитата(ViKo @ Jul 23 2012, 11:44) А не на... Jul 23 2012, 08:02   ViKo Цитата(kan35 @ Jul 23 2012, 11:02) Вы про... Jul 23 2012, 08:11  Allregia Цитата(ViKo @ Jul 23 2012, 09:44) А не на... Jul 23 2012, 10:32 kan35 Allregia,
абсолютно правильный подход. Еще добавлю... Jul 23 2012, 10:42 ViKo Цитата(kan35 @ Jul 23 2012, 13:42) Allreg... Jul 23 2012, 11:15  Allregia Цитата(ViKo @ Jul 23 2012, 13:15) Так-так... Jul 23 2012, 11:51   ViKo Цитата(Allregia @ Jul 23 2012, 14:51) Мож... Jul 23 2012, 12:10    Allregia Цитата(ViKo @ Jul 23 2012, 14:10) А на эт... Jul 23 2012, 12:46     ViKo Цитата(Allregia @ Jul 23 2012, 15:46) Кон... Jul 23 2012, 12:58 kan35 Не преувеличивайте. Инициализация периферии занима... Jul 23 2012, 11:47 ViKo Цитата(kan35 @ Jul 23 2012, 14:47) за иде... Jul 23 2012, 11:49  Allregia Цитата(ViKo @ Jul 23 2012, 13:49) За нее.... Jul 23 2012, 12:34   ViKo Цитата(Allregia @ Jul 23 2012, 15:34) Сра... Jul 23 2012, 12:37 kan35 ViKo,
Оптимизация ради оптимизации приносит только... Jul 23 2012, 12:48 kan35 Это плюс несомненно.
А вообще, вы задавались вопро... Jul 23 2012, 13:30 ViKo Цитата(kan35 @ Jul 23 2012, 16:30) Это ко... Jul 23 2012, 19:38 AlexandrY Цитата(kan35 @ Jul 23 2012, 16:30) Это пл... Jul 23 2012, 20:04  VslavX Цитата(AlexandrY @ Jul 23 2012, 23:04) А ... Jul 24 2012, 03:50  kan35 Цитата(AlexandrY @ Jul 24 2012, 00:04) Дл... Jul 24 2012, 04:10   demiurg_spb Я использую библиотеки и могу сказать, что они сле... Jul 24 2012, 06:51 Сергей Борщ А почему все зациклились на инициализации? Разве б... Jul 24 2012, 09:48 demiurg_spb Цитата(Сергей Борщ @ Jul 24 2012, 13:48) ... Jul 24 2012, 16:16 Allregia Цитата(Сергей Борщ @ Jul 24 2012, 11:48) ... Jul 24 2012, 17:42  demiurg_spb Цитата(Allregia @ Jul 24 2012, 21:42) Код... Jul 24 2012, 17:47   _Артём_ Цитата(demiurg_spb @ Jul 24 2012, 20:47) ... Jul 24 2012, 18:51    demiurg_spb Тот кто привык щи лаптем хлебать того уже более пр... Jul 24 2012, 19:05     _Артём_ Цитата(demiurg_spb @ Jul 24 2012, 22:05) ... Jul 24 2012, 19:57      Allregia Цитата(_Артём_ @ Jul 24 2012, 21:57) Да к... Jul 25 2012, 05:24      demiurg_spb Цитата(_Артём_ @ Jul 24 2012, 23:57) Чем ... Jul 25 2012, 05:47       Allregia Цитата(demiurg_spb @ Jul 25 2012, 07:47) ... Jul 25 2012, 07:18        ViKo Цитата(Allregia @ Jul 25 2012, 10:18) Пом... Jul 25 2012, 07:30         Allregia Цитата(ViKo @ Jul 25 2012, 09:30) Но, вид... Jul 25 2012, 11:48          ViKo Цитата(Allregia @ Jul 25 2012, 14:48) 99.... Jul 25 2012, 11:57           Allregia Цитата(ViKo @ Jul 25 2012, 13:57) Верю. Д... Jul 25 2012, 14:46   Allregia Цитата(demiurg_spb @ Jul 24 2012, 19:47) ... Jul 24 2012, 19:42 kan35 ViKo,
никто не отрицает, что работа через библиоте... Jul 25 2012, 12:26 ViKo Цитата(kan35 @ Jul 25 2012, 15:26) никто ... Jul 25 2012, 12:50  kan35 Цитата(ViKo @ Jul 25 2012, 16:50) Еще нед... Jul 26 2012, 05:52   ViKo Цитата(kan35 @ Jul 26 2012, 08:52) Viko, ... Jul 26 2012, 07:58 kan35 То, что по DMA работа (пусть даже внешняя память--... Jul 26 2012, 08:36 ViKo Цитата(kan35 @ Jul 26 2012, 11:36) То, чт... Jul 26 2012, 08:45 kan35 Действитеьлно, флаг ловить лучше в прерывании. DMA... Jul 26 2012, 08:58 ViKo Цитата(kan35 @ Jul 26 2012, 11:58) Действ... Jul 26 2012, 10:41 kan35 В основной программе ждать семафора, в прерывании ... Jul 26 2012, 12:00 Allregia Вопрос немного в сторону, про М4 и настройки Кейла... Jul 26 2012, 20:29 ViKo На все ваши вопросы здесь уже были ответы. Поищите... Jul 31 2012, 09:35 Allregia Цитата(ViKo @ Jul 31 2012, 11:35) На все ... Aug 2 2012, 14:03 сарматъ помогите пожалуйста, пытаюсь запустить ацп вот так... Nov 19 2012, 05:34 сарматъ конкретно не работает непрерывное преобразование п... Nov 19 2012, 09:03 сарматъ все равно надо каждый раз делать
ADC1->CR2... Nov 19 2012, 12:40 Flexz Перепишите на обычные (regular) каналы, injected н... Nov 19 2012, 15:28 сарматъ упс... а в f100 работали...
спасибо Nov 19 2012, 15:37
13 чел. читают эту тему (гостей: 13, скрытых пользователей: 0)
Пользователей: 0
|
|
|