Shaman_Max 0 2 декабря, 2014 Опубликовано 2 декабря, 2014 (изменено) · Жалоба Привет. Рассматривая фирменный код поддержки, пример кода инициализации 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 ??? Изменено 2 декабря, 2014 пользователем IgorKossak [codebox] для длинного кода, [code] - для короткого!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
hd44780 0 2 декабря, 2014 Опубликовано 2 декабря, 2014 · Жалоба Всё там нормально. Никаких неадекватностей нет. За один цикл работы DMA кладёт в буфер 2 2-байтовых слова. Поэтому размер элемента массива - uint32_t - 4 байта. DMA_InitStructure.DMA_BufferSize = 16; - DMA сделает 16 выборок из АЦП и забъёт данными весь массив. Если Вы зададите DMA_InitStructure.DMA_BufferSize = 2, то он заполнит только 2 элемента массива из 16. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Shaman_Max 0 2 декабря, 2014 Опубликовано 2 декабря, 2014 (изменено) · Жалоба За один цикл работы 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-мь раз ??? Изменено 2 декабря, 2014 пользователем Max_Shaman Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 2 декабря, 2014 Опубликовано 2 декабря, 2014 · Жалоба чтобы обрабатывать не каждое полученное значение по мере их получения, а собрать пачку из 8 - 16 - Н отсчетов, тем временем делая какую-то полезную работу, а потом разом их обработать, усреднить или еще что? Как такая теория? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Shaman_Max 0 2 декабря, 2014 Опубликовано 2 декабря, 2014 (изменено) · Жалоба чтобы обрабатывать не каждое полученное значение по мере их получения, а собрать пачку из 8 - 16 - Н отсчетов, тем временем делая какую-то полезную работу, а потом разом их обработать, усреднить или еще что? Как такая теория? Хорошая теория и правильная. Чет сегодня не выспался я, извините. Изменено 2 декабря, 2014 пользователем Max_Shaman Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться