Перейти к содержанию
    

Помогите пожалуйста.

 

Хочу запустить АЦД непрерывно на оцифровку последовательно 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

вместо

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

А не надо библиотеками пользоваться. Уж сколько раз говорено. Сам прошел через это.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А не надо библиотеками пользоваться. Уж сколько раз говорено. Сам прошел через это.

Вы прошли через то, что путали слова clock и reset?

и когда перестали пользоваться библиотеками, то вам помогло? :laughing:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы прошли через то, что путали слова clock и reset?

и когда перестали пользоваться библиотеками, то вам помогло? :laughing:

Нет, до этого не доходило. Но как же трудно было искать в html-документации эти функции, состав структур. Куда логичнее посмотреть содержимое регистров в руководстве на микроконтроллер, и использовать только описание этих битов из stm32f10x.h (в моем случае). И места занимает намного меньше во флэшь-памяти. А, главное, чувствуешь себя хозяином микроконтроллера, а не приемышем каким-то. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А не надо библиотеками пользоваться.

 

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

 

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

А зачем их там искать?

Честно говоря, я даже не подозревал о существовании "html-документации", поэтому смотрю просто в .с и .h файлах самих библиотк, там зачастую более чем остаточно информации - смотрю в .с функцию, перед ней расписаны ее аргументы, все варианты.

В .h смотрю структуру и ее варанты ее параметров.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Allregia,

абсолютно правильный подход. Еще добавлю, что все библиотеки построены по одному сценарию с добавлением специфических функций соответствующих данной периферии. Весь функционал функций закодирован в имени этих функций (простите).

stdlib.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 */

и т.д.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не преувеличивайте. Инициализация периферии занимает исчезающе малую долю реального кода.

Велика ли будет экономия? Позволит ли она вам взять более дешевый камень? врядли... код будет быстрее? - ну может быть при очень определенных условиях...

так за что же борьба? за идею наверное :bb-offtopic:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

за идею наверное

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

 

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

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 */
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так-таки "абсолютно"?

Я инициализирую, например, порты следующим образом (с помощью своих макроопределений):

 

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

 

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

А кого это .. волнует? Сколько занимает обьем инициализации, по отношению к остальной програме? 0.01% ? :)

Я лично не хочу вообще думать от всяких иициализациях процессора и тому пдобной ерунде, важнее сама задача.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

На это отвечу словами kan35: Не преувеличивайте! :)

Сколько занимает обьем инициализации, по отношению к остальной програме? 0.01% ? :)

Я лично не хочу вообще думать от всяких иициализациях процессора и тому пдобной ерунде, важнее сама задача.

А на это отвечу - Не преуменьшайте. Подумайте хотя бы раз. Посмотрите, сколько флэш-памяти съедает инициализация, сообщите конкретную цифру. Думаю, что и под 10% можно отхватить, для микроконтроллеров с малым объемом. Если устраивает - пользуйтесь. Меня - не устраивает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

Сравнил. По сравнеиню с моим - Жуть и Кошмар :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сравнил. По сравнеиню с моим - Жуть и Кошмар :)

"Цифру, сестра! Цифру!" (с)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А на это отвечу - Не преуменьшайте. Подумайте хотя бы раз. Посмотрите, сколько флэш-памяти съедает инициализация, сообщите конкретную цифру.

 

Конкретно указанная выше функция занимет 70 байт.

Я наверное просто лопнул бы от счастья сьекономить на ней 10-20 байт....

И даже если бы таких инициализаций было бы полсотня (что в 5 раз болше чем в реале) - подумать только целый килобайт бы сьекономил!

Ну был бы это PIC12 или 16 я бы еще подумал....

 

 

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

 

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

 

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

Конкретная задача у меня сейчас заняла около 70кб.

 

"Цифру, сестра! Цифру!" (с)

 

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

 

 

 

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

 

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

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

 

Короче, давайте на этом закончим.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...