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

 
 
 
Reply to this topicStart new topic
> STM32F103 ADC, Вопрос по примеру DoubleMode
Max_Shaman
сообщение Dec 2 2014, 11:40
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 33
Регистрация: 21-04-07
Из: Odessa
Пользователь №: 27 227



Привет.

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

CODE
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 - Dec 2 2014, 19:38
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
hd44780
сообщение Dec 2 2014, 14:41
Сообщение #2


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

Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980



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

За один цикл работы DMA кладёт в буфер 2 2-байтовых слова. Поэтому размер элемента массива - uint32_t - 4 байта.
DMA_InitStructure.DMA_BufferSize = 16; - DMA сделает 16 выборок из АЦП и забъёт данными весь массив.

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


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
Max_Shaman
сообщение Dec 2 2014, 15:00
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 33
Регистрация: 21-04-07
Из: Odessa
Пользователь №: 27 227



Цитата(hd44780 @ Dec 2 2014, 17:41) *
За один цикл работы 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 - Dec 2 2014, 15:17
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Dec 2 2014, 20:14
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



чтобы обрабатывать не каждое полученное значение по мере их получения, а собрать пачку из 8 - 16 - Н отсчетов, тем временем делая какую-то полезную работу, а потом разом их обработать, усреднить или еще что? Как такая теория?
Go to the top of the page
 
+Quote Post
Max_Shaman
сообщение Dec 2 2014, 22:13
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 33
Регистрация: 21-04-07
Из: Odessa
Пользователь №: 27 227



Цитата(Golikov A. @ Dec 2 2014, 23:14) *
чтобы обрабатывать не каждое полученное значение по мере их получения, а собрать пачку из 8 - 16 - Н отсчетов, тем временем делая какую-то полезную работу, а потом разом их обработать, усреднить или еще что? Как такая теория?


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

Сообщение отредактировал Max_Shaman - Dec 2 2014, 22:14
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 17:49
Рейтинг@Mail.ru


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