реклама на сайте
подробности

 
 
> STM32F4 ADC DMA ?
Allregia
сообщение Jul 22 2012, 14:14
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
kan35
сообщение Jul 23 2012, 13:30
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



Это плюс несомненно.
А вообще, вы задавались вопросом "почему появились библиотеки периферии" - очень просто: периферия стала жутко сложная, регистры 32 битные - битов дополна. И программировать их напрямую как минимум долго, неудобно и надо постоянно рыться в референсмануале на 1000 страниц. Некоторым головастым и рукастым мужикам это вполне подсилу и они непринужденно лопатят горы информации. А таким как мне на это уйдет куча времени и сил. И за несколько лет не встретилось мне еще задачи где потребовалась бы прямая работа с регистрами.

Это конечно все лирика, но все же доверять только собственным исходным кодам практика довольно пагубная для инженера, согласитесь.
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Jul 23 2012, 20:04
Сообщение #3


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(kan35 @ Jul 23 2012, 16:30) *
Это плюс несомненно.
А вообще, вы задавались вопросом "почему появились библиотеки периферии" - очень просто: периферия стала жутко сложная, регистры 32 битные - битов дополна. И программировать их напрямую как минимум долго, неудобно и надо постоянно рыться в референсмануале на 1000 страниц.

Это конечно все лирика, но все же доверять только собственным исходным кодам практика довольно пагубная для инженера, согласитесь.


О сложностях, кстати.
Да, периферия стала сложная поэтому не надо ее еще усложнять дополнительными абстракциями.
Для меня, например, не постижимо по названию функции TIM2_Init понять зачем она нужна и что делает.
Запомнить ее назначение можно только постоянно с ней имея дело (вынужденно, поскольку дольше приходится писать инициализацию) и детально просмотрев ее код, поскольку здесь нет ничего интуитивно понятного.
Гораздо проще найти в мануале описание таймера где все регистры описаны на паре страниц, и записать этот десяток регистров используя битовые маски.

Заимствовать исходники нужно когда они выполняют действительно объемные задачи.
А здесь пару строк записи в регистры заменяют огромными библиотеками.
Go to the top of the page
 
+Quote Post
kan35
сообщение Jul 24 2012, 04:10
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



Цитата(AlexandrY @ Jul 24 2012, 00:04) *
Для меня, например, не постижимо по названию функции TIM2_Init понять зачем она нужна и что делает.
Запомнить ее назначение можно только постоянно с ней имея дело (вынужденно, поскольку дольше приходится писать инициализацию) и детально просмотрев ее код, поскольку здесь нет ничего интуитивно понятного.
Гораздо проще найти в мануале описание таймера где все регистры описаны на паре страниц, и записать этот десяток регистров используя битовые маски.

Резонное замечание. Однако для того, чтобы впадать в отчаяние видя гору функций с непонятными именами (хотя на мой взгляд достаточно понятными) можно обратиться к примерам, которые включены в библиотеку, а так же включен пустой шаблон (template) от которого можно быстро стартовать. В этих примерах разобраны наиболее востребованные режимы работы периферии, например, для ADC приведено кажется более 10 способов обслуживания. Просто копируете оттуда нужный код и его модифицируете.
Библиотека selfdocumented и с помощью "go to definition" можно быстро прыгнуть к поснению.
Есть еще мощная штука - "Find in files" :-) - быстро все ставит на свои места
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
|- - ViKo   Цитата(kan35 @ Jul 23 2012, 16:30) Это ко...   Jul 23 2012, 19:38
|- - VslavX   Цитата(AlexandrY @ Jul 23 2012, 23:04) А ...   Jul 24 2012, 03:50
|- - 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
- - Haamu   Необходимо измерить сигнал с нескольких каналов по...   Jan 9 2014, 08:17


Reply to this topicStart new topic
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th August 2025 - 06:28
Рейтинг@Mail.ru


Страница сгенерированна за 0.01473 секунд с 7
ELECTRONIX ©2004-2016