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

 
 
> 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
4 страниц V   1 2 3 > »   
Start new topic
Ответов (1 - 14)
Allregia
сообщение Jul 23 2012, 07:27
Сообщение #2


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

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Ошибка была чисто механическая:

RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_DMA2,ENABLE); // enable clocking of DMA2

вместо

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE); // enable clocking of DMA2
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 23 2012, 07:44
Сообщение #3


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Allregia @ Jul 23 2012, 10:27) *
Ошибка была чисто механическая:

А не надо библиотеками пользоваться. Уж сколько раз говорено. Сам прошел через это.
Go to the top of the page
 
+Quote Post
kan35
сообщение Jul 23 2012, 08:02
Сообщение #4


Знающий
****

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



Цитата(ViKo @ Jul 23 2012, 11:44) *
А не надо библиотеками пользоваться. Уж сколько раз говорено. Сам прошел через это.

Вы прошли через то, что путали слова clock и reset?
и когда перестали пользоваться библиотеками, то вам помогло? laughing.gif
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 23 2012, 08:11
Сообщение #5


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(kan35 @ Jul 23 2012, 11:02) *
Вы прошли через то, что путали слова clock и reset?
и когда перестали пользоваться библиотеками, то вам помогло? laughing.gif

Нет, до этого не доходило. Но как же трудно было искать в html-документации эти функции, состав структур. Куда логичнее посмотреть содержимое регистров в руководстве на микроконтроллер, и использовать только описание этих битов из stm32f10x.h (в моем случае). И места занимает намного меньше во флэшь-памяти. А, главное, чувствуешь себя хозяином микроконтроллера, а не приемышем каким-то. sm.gif
Go to the top of the page
 
+Quote Post
Allregia
сообщение Jul 23 2012, 10:32
Сообщение #6


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

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Цитата(ViKo @ Jul 23 2012, 09:44) *
А не надо библиотеками пользоваться.


С чего вдруг?!

Цитата
Но как же трудно было искать в html-документации эти функции,

А зачем их там искать?
Честно говоря, я даже не подозревал о существовании "html-документации", поэтому смотрю просто в .с и .h файлах самих библиотк, там зачастую более чем остаточно информации - смотрю в .с функцию, перед ней расписаны ее аргументы, все варианты.
В .h смотрю структуру и ее варанты ее параметров.
Go to the top of the page
 
+Quote Post
kan35
сообщение Jul 23 2012, 10:42
Сообщение #7


Знающий
****

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



Allregia,
абсолютно правильный подход. Еще добавлю, что все библиотеки построены по одному сценарию с добавлением специфических функций соответствующих данной периферии. Весь функционал функций закодирован в имени этих функций (простите).
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 23 2012, 11:15
Сообщение #8


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(kan35 @ Jul 23 2012, 13:42) *
Allregia,
абсолютно правильный подход

Так-таки "абсолютно"?
Я инициализирую, например, порты следующим образом (с помощью своих макроопределений):
Код
;;;192    void GPIO_init(void)
000076  4849              LDR      r0,|L1.412|
;;;193    {
;;;194    /* Разрешить тактирование портов A, B, C */
;;;195      RCC->AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN | RCC_AHBENR_GPIOCEN;
000078  301c              ADDS     r0,r0,#0x1c
00007a  6801              LDR      r1,[r0,#0]
00007c  f0410107          ORR      r1,r1,#7
000080  6001              STR      r1,[r0,#0]
;;;196    
;;;197    /* Инициализировать GPIOA */
;;;198      GPIO_INIT(A,
000082  494b              LDR      r1,|L1.432|
000084  4849              LDR      r0,|L1.428|
000086  6008              STR      r0,[r1,#0]
000088  2000              MOVS     r0,#0
00008a  8088              STRH     r0,[r1,#4]
00008c  4a49              LDR      r2,|L1.436|
00008e  608a              STR      r2,[r1,#8]
000090  2214              MOVS     r2,#0x14
000092  60ca              STR      r2,[r1,#0xc]
000094  f44f72b8          MOV      r2,#0x170
000098  620a              STR      r2,[r1,#0x20]
00009a  4a47              LDR      r2,|L1.440|
00009c  624a              STR      r2,[r1,#0x24]
;;;199        MD_GPO, OT_PP, SP_400K, PL_NP, AF_SYSTEM,    // PA0
;;;200        MD_AF,  OT_PP, SP_400K, PL_PU, AF_USART2,    // PA1
;;;201        MD_AF,  OT_PP, SP_400K, PL_PU, AF_TIM2,        // PA2
;;;202    //    MD_GPO, OT_PP, SP_10M,  PL_PD, AF_SYSTEM,    // PA3 - Test
;;;203        MD_AN,  OT_PP, SP_400K, PL_NP, AF_SYSTEM,    // PA3 - ADC3 LQFP48
;;;204        MD_AN,  OT_PP, SP_400K, PL_NP, AF_SYSTEM,    // PA4 - ADC4
;;;205        MD_AN,  OT_PP, SP_400K, PL_NP, AF_SYSTEM,    // PA5 - ADC5
;;;206        MD_AN,  OT_PP, SP_400K, PL_NP, AF_SYSTEM,    // PA6 - ADC6 = VAC1
;;;207        MD_AN,  OT_PP, SP_400K, PL_NP, AF_SYSTEM,    // PA7 - ADC7 = VAC2
;;;208        MD_AF,  OT_PP, SP_10M,  PL_NP, AF_SYSTEM,    // PA8 - MSO (USART1)
;;;209        MD_AF,  OT_PP, SP_10M,  PL_NP, AF_USART1,    // PA9 - USART1_TX
;;;210        MD_AF,  OT_PP, SP_10M,  PL_NP, AF_USART1,    // PA10 - USART1_RX
;;;211        MD_AF,  OT_PP, SP_10M,  PL_NP, AF_USART1,    // PA11
;;;212        MD_AF,  OT_PP, SP_10M,  PL_NP, AF_USART1,    // PA12
;;;213        MD_AF,  OT_PP, SP_10M,  PL_NP, AF_SYSTEM,    // PA13 - JTMS-SWDAT
;;;214        MD_AF,  OT_PP, SP_10M,  PL_NP, AF_SYSTEM,    // PA14 - JTCK-SWCLK
;;;215        MD_AF,  OT_PP, SP_10M,  PL_NP, AF_SYSTEM);    // PA15 - JTDI
;;;216    
;;;217    /* Инициализировать GPIOB */

и т.д.
Взгляните, во что выливается код инициализации при использовании библиотечных функций. Потом посмеемся и поплачем...
Go to the top of the page
 
+Quote Post
kan35
сообщение Jul 23 2012, 11:47
Сообщение #9


Знающий
****

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



Не преувеличивайте. Инициализация периферии занимает исчезающе малую долю реального кода.
Велика ли будет экономия? Позволит ли она вам взять более дешевый камень? врядли... код будет быстрее? - ну может быть при очень определенных условиях...
так за что же борьба? за идею наверное bb-offtopic.gif
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 23 2012, 11:49
Сообщение #10


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(kan35 @ Jul 23 2012, 14:47) *
за идею наверное

За нее. За "абсолютно правильный подход".

Еще пример. Сравните с кодом из сообщения топикстартера. Не убеждает?
Код
void ADC_init(void)
{
/* Разрешить тактирование ADC1 */
  RCC->CR |= RCC_CR_HSION;        // Такты на преобразователь
  RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;    // Такты на интерфейс

// ADON == 0 //
/* 12-bit , Power Down during Idle phase, Scan Mode */
  ADC1->CR1 = ADC_CR1_PDI | ADC_CR1_SCAN;
/* Sample Time 16 cycles (1 us) for all channels */
  ADC1->SMPR1 = ADC1->SMPR2 = ADC1->SMPR3 = 0x2<<27 | 0x2<<24 |
  0x2<<21 | 0x2<<18 | 0x2<<15 | 0x2<<12 | 0x2<<9 | 0x2<<6 | 0x2<<3 | 0x2<<0;
/* Right alignment, DMA mode disabled, No delay, ADC On */
  ADC1->CR2 = ADC_CR2_ADON;
/* Wait while !ADONS */
  while (!(ADC1->SR & ADC_SR_ADONS));
// ADONS == 1 //
/* External Trigger on the rising edge for injected channels,  TIM7_TRGO event */
  // ADC1->CR2 = ADC_CR2_JEXTEN_0 | ADC_CR2_JEXTSEL_3 | ADC_CR2_JEXTSEL_1;
  ADC1->CR2 |= ADC_CR2_JEXTEN_0 | ADC_CR2_JEXTSEL_0;        // TIM9_TRGO
/* Injected channels data offset = 0 */
/* LQFP64 - 4 injected conversions, 15, 14, 7, 6 channels */
  // ADC1->JSQR = 0x3<<20 | 15<<15 | 14<<10 | 7<<5 | 6<<0;
/* LQFP48 - 4 injected conversions, 8, 3, 7, 6 channels */  
  ADC1->JSQR = 0x3<<20 | 3<<15 | 8<<10 | 7<<5 | 6<<0;  
/* Читать регистры ADC_JDRx, когда установится бит JEOC */
}
Go to the top of the page
 
+Quote Post
Allregia
сообщение Jul 23 2012, 11:51
Сообщение #11


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

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Цитата(ViKo @ Jul 23 2012, 13:15) *
Так-таки "абсолютно"?
Я инициализирую, например, порты следующим образом (с помощью своих макроопределений):


Может еще предложите (не дай бог, конечно) на ассемблере писать? sm.gif

Цитата
Взгляните, во что выливается код инициализации при использовании библиотечных функций. Потом посмеемся и поплачем...

А кого это .. волнует? Сколько занимает обьем инициализации, по отношению к остальной програме? 0.01% ? sm.gif
Я лично не хочу вообще думать от всяких иициализациях процессора и тому пдобной ерунде, важнее сама задача.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 23 2012, 12:10
Сообщение #12


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Allregia @ Jul 23 2012, 14:51) *
Может еще предложите (не дай бог, конечно) на ассемблере писать? sm.gif

На это отвечу словами kan35: Не преувеличивайте! sm.gif
Цитата
Сколько занимает обьем инициализации, по отношению к остальной програме? 0.01% ? sm.gif
Я лично не хочу вообще думать от всяких иициализациях процессора и тому пдобной ерунде, важнее сама задача.

А на это отвечу - Не преуменьшайте. Подумайте хотя бы раз. Посмотрите, сколько флэш-памяти съедает инициализация, сообщите конкретную цифру. Думаю, что и под 10% можно отхватить, для микроконтроллеров с малым объемом. Если устраивает - пользуйтесь. Меня - не устраивает.
Go to the top of the page
 
+Quote Post
Allregia
сообщение Jul 23 2012, 12:34
Сообщение #13


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

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Цитата(ViKo @ Jul 23 2012, 13:49) *
За нее. За "абсолютно правильный подход".

Еще пример. Сравните с кодом из сообщения топикстартера. Не убеждает?


Сравнил. По сравнеиню с моим - Жуть и Кошмар sm.gif
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 23 2012, 12:37
Сообщение #14


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Allregia @ Jul 23 2012, 15:34) *
Сравнил. По сравнеиню с моим - Жуть и Кошмар sm.gif

"Цифру, сестра! Цифру!" (с)
Go to the top of the page
 
+Quote Post
Allregia
сообщение Jul 23 2012, 12:46
Сообщение #15


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

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Цитата(ViKo @ Jul 23 2012, 14:10) *
А на это отвечу - Не преуменьшайте. Подумайте хотя бы раз. Посмотрите, сколько флэш-памяти съедает инициализация, сообщите конкретную цифру.


Конкретно указанная выше функция занимет 70 байт.
Я наверное просто лопнул бы от счастья сьекономить на ней 10-20 байт....
И даже если бы таких инициализаций было бы полсотня (что в 5 раз болше чем в реале) - подумать только целый килобайт бы сьекономил!
Ну был бы это PIC12 или 16 я бы еще подумал....


(справедливости ради - 70 это сама функция, вызываемые ею библиотечные - еще 200, тоже офигенная экономия).

Цитата
Думаю, что и под 10% можно отхватить, для микроконтроллеров с малым объемом.


Если Вы не заметили, у используемого мною МК меньше чем с 512кБ в этой серии и не бывает.
Конкретная задача у меня сейчас заняла около 70кб.

Цитата(ViKo @ Jul 23 2012, 14:37) *
"Цифру, сестра! Цифру!" (с)


Какую "цифру"? Там Ваш текст а не цифры. Вот и текст этот - "Жуть и Кошмар" sm.gif



P.S. Но примечательно другое - я написал сообщение вчера днем. 1111493779.gif

И за весь вечер и все утро не нашлось ни одного человека. который бы чем-то помог.
Зато когда я сам написал что разобрался - тут сразу советчиков стало намного больше laughing.gif

Короче, давайте на этом закончим.
Go to the top of the page
 
+Quote Post

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

 


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


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