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

STM32F103 ADC

Привет.

 

Рассматривая фирменный код поддержки, пример кода инициализации ADC и DMA к нему, заметил неадекватный (большой) размер буфера DMA. При пересчете dma буфер должен быть обьявлен как __IO uint32_t ADC_DualConvertedValueTab[2], но в примере он __IO uint32_t ADC_DualConvertedValueTab[16]; Я так понял что DMA до конца цикла по буферу просто работает дальше размещая 8-мь раз эти паралельные очереди ???

 

ADC_InitTypeDef ADC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
__IO uint32_t ADC_DualConvertedValueTab[16];

/* Private function prototypes -----------------------------------------------*/
void RCC_Configuration(void);
void GPIO_Configuration(void);

/* Private functions ---------------------------------------------------------*/

/**
 * @brief   Main program
 * @param  None
 * @retval None
 */
int main(void)
{
 /*!< At this stage the microcontroller clock setting is already configured, 
   this is done through SystemInit() function which is called from startup
   file (startup_stm32f10x_xx.s) before to branch to application main.
   To reconfigure the default setting of SystemInit() function, refer to
   system_stm32f10x.c file
 */	 

 /* System clocks configuration ---------------------------------------------*/
 RCC_Configuration();

 /* GPIO configuration ------------------------------------------------------*/
 GPIO_Configuration();

 /* DMA1 channel1 configuration ----------------------------------------------*/
 DMA_DeInit(DMA1_Channel1);
 DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_Address;
 DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_DualConvertedValueTab;
 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
 DMA_InitStructure.DMA_BufferSize = 16;
 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
 DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
 DMA_InitStructure.DMA_Priority = DMA_Priority_High;
 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
 DMA_Init(DMA1_Channel1, &DMA_InitStructure);
 /* Enable DMA1 Channel1 */
 DMA_Cmd(DMA1_Channel1, ENABLE);

 /* ADC1 configuration ------------------------------------------------------*/
 ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;
 ADC_InitStructure.ADC_ScanConvMode = ENABLE;
 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
 ADC_InitStructure.ADC_NbrOfChannel = 2;
 ADC_Init(ADC1, &ADC_InitStructure);
 /* ADC1 regular channels configuration */ 
 ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_239Cycles5);	
 ADC_RegularChannelConfig(ADC1, ADC_Channel_17, 2, ADC_SampleTime_239Cycles5);
 /* Enable ADC1 DMA */
 ADC_DMACmd(ADC1, ENABLE);

 /* ADC2 configuration ------------------------------------------------------*/
 ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;
 ADC_InitStructure.ADC_ScanConvMode = ENABLE;
 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
 ADC_InitStructure.ADC_NbrOfChannel = 2;
 ADC_Init(ADC2, &ADC_InitStructure);
 /* ADC2 regular channels configuration */ 
 ADC_RegularChannelConfig(ADC2, ADC_Channel_11, 1, ADC_SampleTime_239Cycles5);
 ADC_RegularChannelConfig(ADC2, ADC_Channel_12, 2, ADC_SampleTime_239Cycles5);
 /* Enable ADC2 external trigger conversion */
 ADC_ExternalTrigConvCmd(ADC2, ENABLE);

 

 

То есть при данной инициализации ADC последовательностей и режима, DMA_InitStructure.DMA_BufferSize можно установить равным 2 ???

Изменено пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого!!!

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


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

Всё там нормально. Никаких неадекватностей нет.

 

За один цикл работы DMA кладёт в буфер 2 2-байтовых слова. Поэтому размер элемента массива - uint32_t - 4 байта.

DMA_InitStructure.DMA_BufferSize = 16; - DMA сделает 16 выборок из АЦП и забъёт данными весь массив.

 

Если Вы зададите DMA_InitStructure.DMA_BufferSize = 2, то он заполнит только 2 элемента массива из 16.

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


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

За один цикл работы DMA кладёт в буфер 2 2-байтовых слова. Поэтому размер элемента массива - uint32_t - 4 байта.

DMA_InitStructure.DMA_BufferSize = 16; - DMA сделает 16 выборок из АЦП и забъёт данными весь массив.

 

Если Вы зададите DMA_InitStructure.DMA_BufferSize = 2, то он заполнит только 2 элемента массива из 16.

 

Это понятно...

 

В DMA цикле я разобрался как он работает, мне непонятно несоответствие в коде при програмировании циклов DMA c количеством циклов параллельных преобразования ADC, вы наверно заметили что очередь в каждом из ADC состоит из двух элементов, а не из 16-ти.

 

Так зачем им надо было в примере дублировать последовательности выборок 14,11 и 17,12 , аж 8-мь раз ??? Каждая выбока в SingleMode 16 бит в Double 32 бита, следовательно две последовательности это такой массив __IO uint32_t ADC_DualConvertedValueTab[2]; Зачем еще дублировать его было 8-мь раз ???

 

 

Изменено пользователем Max_Shaman

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


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

чтобы обрабатывать не каждое полученное значение по мере их получения, а собрать пачку из 8 - 16 - Н отсчетов, тем временем делая какую-то полезную работу, а потом разом их обработать, усреднить или еще что? Как такая теория?

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


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

чтобы обрабатывать не каждое полученное значение по мере их получения, а собрать пачку из 8 - 16 - Н отсчетов, тем временем делая какую-то полезную работу, а потом разом их обработать, усреднить или еще что? Как такая теория?

 

Хорошая теория и правильная. Чет сегодня не выспался я, извините.

Изменено пользователем Max_Shaman

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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