cancel
Showing results for 
Search instead for 
Did you mean: 

no one can help me understand how to use the DMA? please: '(

orn
Associate II
Posted on October 08, 2012 at 12:47

hi,

I modified an example of the ST microcontroller STM32F4xx need to acquire three channels with a single ADC and using the DMA, but I do not know how to retrieve the data. can you give me a hand? I'll post the code! Thank you and sorry for the English

/* Includes ------------------------------------------------------------------*/
#include ''stm32f4xx.h''
#include ''stm324xg_eval.h''
#include ''stm324xg_eval_lcd.h''
#include <
stdio.h
>
/** @addtogroup STM32F4xx_StdPeriph_Examples
* @{
*/
/** @addtogroup ADC_ADC3_DMA
* @{
*/ 
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* used to display the ADC converted value on LCD */
#define PRINT_ON_LCD
#define ADC3_DR_ADDRESS ((uint32_t)0x4001224C)
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
__IO uint16_t ADC3ConvertedValue = 0;
__IO uint16_t ADC3ConvertedValue2 = 0;
__IO uint32_t ADC3ConvertedVoltage = 0;
__IO uint32_t ADC3ConvertedVoltage2 = 0;
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
void ADC3_CH_9_14_15_DMA_Config(void);
#ifdef PRINT_ON_LCD
void Display_Init(void);
void Display(void);
#endif /* PRINT_ON_LCD */
/**
* @brief Main program
* @param None
* @retval None
*/
int main(void)
{
#ifdef PRINT_ON_LCD
/* LCD Display init */
Display_Init();
#endif
/* ADC3 configuration *******************************************************/
/* - Enable peripheral clocks */
/* - DMA2_Stream0 channel2 configuration */
/* - Configure ADC Channe9 14 15 pin as analog input */
/* - Configure ADC3 Channe9 14 15 */
ADC3_CH_9_14_15_DMA_Config();
/* Start ADC3 Software Conversion */ 
ADC_SoftwareStartConv(ADC3);
while (1)
{
#ifdef PRINT_ON_LCD
/* Display ADC3 converted value on LCD */
Display();
#endif
}
}
/**
* @brief ADC3 channel07 with DMA configuration
* @param None
* @retval None
*/
void ADC3_CH_9_14_15_DMA_Config(void)
{
ADC_InitTypeDef ADC_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;
DMA_InitTypeDef DMA_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable ADC3, DMA2 and GPIO clocks ****************************************/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 | RCC_AHB1Periph_GPIOF, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE);
/* DMA2 Stream0 channel2 configuration **************************************/
DMA_InitStructure.DMA_Channel = DMA_Channel_2; 
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC3_DR_ADDRESS;
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ADC3ConvertedValue;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
DMA_InitStructure.DMA_BufferSize = 3; 
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
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_Stream0, &DMA_InitStructure);
DMA_Cmd(DMA2_Stream0, ENABLE);
/* Configure ADC3 Channe 9 14 15 pin as analog input ******************************/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5; 
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
GPIO_Init(GPIOF, &GPIO_InitStructure);
/* ADC Common Init **********************************************************/
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
ADC_CommonInit(&ADC_CommonInitStructure);
/* ADC3 Init ****************************************************************/
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfConversion = 3; //Perchè effettuo ttue e tre le conversioni dall'ADC3
ADC_Init(ADC3, &ADC_InitStructure);
/* ADC3 regular channel7 configuration *************************************/
/****MODIFICATO*****/
ADC_RegularChannelConfig(ADC3, ADC_Channel_9, 1, ADC_SampleTime_3Cycles); /****MODIFICATO*****/
ADC_RegularChannelConfig(ADC3, ADC_Channel_14, 2, ADC_SampleTime_3Cycles); /****MODIFICATO*****/
ADC_RegularChannelConfig(ADC3, ADC_Channel_15, 3, ADC_SampleTime_3Cycles); /****MODIFICATO*****/
/* Enable DMA request after last transfer (Single-ADC mode) */
ADC_DMARequestAfterLastTransferCmd(ADC3, ENABLE);
/* Enable ADC3 DMA */
ADC_DMACmd(ADC3, ENABLE);
/* Enable ADC3 */
ADC_Cmd(ADC3, ENABLE);
}
#ifdef PRINT_ON_LCD
/**
* @brief Display ADC converted value on LCD
* @param None
* @retval None
*/
void Display(void)
{
uint32_t v=0,mv=0,v2,mv2;
uint8_t text[50];
ADC3ConvertedVoltage = ADC3ConvertedValue *3300/0xFFF;
v=(ADC3ConvertedVoltage)/1000;
mv = (ADC3ConvertedVoltage%1000)/100;
sprintf((char*)text,'' ADC = %d,%d V '',v,mv);
LCD_DisplayStringLine(LINE(6),text);
// I do not know how to take the data from channel 14 or 15 ... Help!//
v2=(ADC3ConvertedVoltage2)/1000;
mv2 = (ADC3ConvertedVoltage2%1000)/100;
sprintf((char*)text,'' ADC = %d,%d V '',v2,mv2);
LCD_DisplayStringLine(LINE(7),text);
}
/**
* @brief Display Init (LCD)
* @param None
* @retval None
*/
void Display_Init(void)
{
/* Initialize the LCD */
STM324xG_LCD_Init();
/* Clear the LCD */ 
LCD_Clear(White);
/* Set the LCD Text size */
LCD_SetFont(&Font8x12);
/* Set the LCD Back Color and Text Color*/
LCD_SetBackColor(Blue);
LCD_SetTextColor(White);
/* Display */
LCD_DisplayStringLine(LINE(0x13), '' ADC conversion w/ DMA transfer example '');
/* Set the LCD Text size */
LCD_SetFont(&Font16x24);
/* Display */
LCD_DisplayStringLine(LINE(0), ''ADC Ch7 Conv @2.4Msps'');
/* Set the LCD Back Color and Text Color*/
LCD_SetBackColor(White);
LCD_SetTextColor(Blue);
/* Display */
LCD_DisplayStringLine(LINE(2),'' Turn RV1(PF.09) '');
LCD_DisplayStringLine(LINE(4),'' Potentiometer '');
}
#endif /* PRINT_ON_LCD */
#ifdef USE_FULL_ASSERT
/**
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t* file, uint32_t line)
{ 
/* User can add his own implementation to report the file name and line number,
ex: printf(''Wrong parameters value: file %s on line %d\r\n'', file, line) */
/* Infinite loop */
while (1)
{
}
}
#endif
/**
* @}
*/ 
/**
* @}
*/ 
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/

#adc-dma
7 REPLIES 7
Posted on October 08, 2012 at 15:33

You'd want to be using a contiguous array.

__IO uint16_t ADC3ConvertedValue

s[3];
Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..
orn
Associate II
Posted on October 08, 2012 at 15:51

Clive you are my hero! 🙂

but I make some other error because it does not work .... could you help me again? I am attaching the main thanks

/* Includes ------------------------------------------------------------------*/
#include ''stm32f4xx.h''
#include ''stm324xg_eval.h''
#include ''stm324xg_eval_lcd.h''
#include <
stdio.h
>
/** @addtogroup STM32F4xx_StdPeriph_Examples
* @{
*/
/** @addtogroup ADC_ADC3_DMA
* @{
*/ 
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* used to display the ADC converted value on LCD */
#define PRINT_ON_LCD
/* if you are not using the LCD, you can monitor the converted value by adding
the variable ''ADC3ConvertedValue'' to the debugger watch window */
#define ADC3_DR_ADDRESS ((uint32_t)0x4001224C)
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
__IO uint16_t ADC3ConvertedValue[3] = {0,0,0};
__IO uint32_t ADC3ConvertedVoltage = 0;
__IO uint32_t ADC3ConvertedVoltage2 = 0;
__IO uint32_t ADC3ConvertedVoltage3 = 0;
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
void ADC3_CH_9_14_15_DMA_Config(void);
#ifdef PRINT_ON_LCD
void Display_Init(void);
void Display(void);
#endif /* PRINT_ON_LCD */
/**
* @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_stm32f4xx.s) before to branch to application main.
To reconfigure the default setting of SystemInit() function, refer to
system_stm32f4xx.c file
*/
#ifdef PRINT_ON_LCD
/* LCD Display init */
Display_Init();
#endif
/* ADC3 configuration *******************************************************/
/* - Enable peripheral clocks */
/* - DMA2_Stream0 channel2 configuration */
/* - Configure ADC Channel7 pin as analog input */
/* - Configure ADC3 Channel7 */
ADC3_CH_9_14_15_DMA_Config();
/* Start ADC3 Software Conversion */ 
ADC_SoftwareStartConv(ADC3);
while (1)
{
ADC3ConvertedVoltage2=ADC3ConvertedValue[1]*3300/0xFFF;
ADC3ConvertedVoltage = ADC3ConvertedValue[0] *3300/0xFFF;
#ifdef PRINT_ON_LCD
/* Display ADC3 converted value on LCD */
Display();
#endif
}
}
/**
* @brief ADC3 channel07 with DMA configuration
* @param None
* @retval None
*/
void ADC3_CH_9_14_15_DMA_Config(void)
{
ADC_InitTypeDef ADC_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;
DMA_InitTypeDef DMA_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable ADC3, DMA2 and GPIO clocks ****************************************/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 | RCC_AHB1Periph_GPIOF, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE);
/* DMA2 Stream0 channel2 configuration **************************************/
DMA_InitStructure.DMA_Channel = DMA_Channel_2; 
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC3_DR_ADDRESS;
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ADC3ConvertedValue;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
DMA_InitStructure.DMA_BufferSize = 3; 
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
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_Stream0, &DMA_InitStructure);
DMA_Cmd(DMA2_Stream0, ENABLE);
/********************************************/
/* DMA2 Stream1 channel2 configuration MODIFICATO **************************************/
/********************************************/
/* Configure ADC3 Channel7 pin as analog input ******************************/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5; /*MODIFICATO*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
GPIO_Init(GPIOF, &GPIO_InitStructure);
/* ADC Common Init **********************************************************/
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
ADC_CommonInit(&ADC_CommonInitStructure);
/* ADC3 Init ****************************************************************/
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfConversion = 3; //Perchè effettuo ttue e tre le conversioni dall'ADC3
ADC_Init(ADC3, &ADC_InitStructure);
/* ADC3 regular channel7 configuration *************************************/
/****MODIFICATO*****/
ADC_RegularChannelConfig(ADC3, ADC_Channel_9, 1, ADC_SampleTime_3Cycles); /****MODIFICATO*****/
ADC_RegularChannelConfig(ADC3, ADC_Channel_14, 2, ADC_SampleTime_3Cycles); /****MODIFICATO*****/
ADC_RegularChannelConfig(ADC3, ADC_Channel_15, 3, ADC_SampleTime_3Cycles); /****MODIFICATO*****/
/* Enable DMA request after last transfer (Single-ADC mode) */
ADC_DMARequestAfterLastTransferCmd(ADC3, ENABLE);
/* Enable ADC3 DMA */
ADC_DMACmd(ADC3, ENABLE);
/* Enable ADC3 */
ADC_Cmd(ADC3, ENABLE);
}
#ifdef PRINT_ON_LCD
/**
* @brief Display ADC converted value on LCD
* @param None
* @retval None
*/
void Display(void)
{
uint32_t v=0,mv=0,v2=0,mv2=0;
uint8_t text[50];
v=(ADC3ConvertedVoltage)/1000;
mv = (ADC3ConvertedVoltage%1000)/100;
v2=(ADC3ConvertedVoltage2)/1000;
mv2 = (ADC3ConvertedVoltage2%1000)/100;
sprintf((char*)text,'' ADC = %d,%d V '',v,mv);
LCD_DisplayStringLine(LINE(6),text);
sprintf((char*)text,'' ADC = %d,%d V '',v2,mv2);
LCD_DisplayStringLine(LINE(7),text);
}
/**
* @brief Display Init (LCD)
* @param None
* @retval None
*/
void Display_Init(void)
{
/* Initialize the LCD */
STM324xG_LCD_Init();
/* Clear the LCD */ 
LCD_Clear(White);
/* Set the LCD Text size */
LCD_SetFont(&Font8x12);
/* Set the LCD Back Color and Text Color*/
LCD_SetBackColor(Blue);
LCD_SetTextColor(White);
/* Display */
LCD_DisplayStringLine(LINE(0x13), '' ADC conversion w/ DMA transfer example '');
/* Set the LCD Text size */
LCD_SetFont(&Font16x24);
/* Display */
LCD_DisplayStringLine(LINE(0), ''ADC Ch7 Conv @2.4Msps'');
/* Set the LCD Back Color and Text Color*/
LCD_SetBackColor(White);
LCD_SetTextColor(Blue);
/* Display */
LCD_DisplayStringLine(LINE(2),'' Turn RV1(PF.09) '');
LCD_DisplayStringLine(LINE(4),'' Potentiometer '');
}
#endif /* PRINT_ON_LCD */
#ifdef USE_FULL_ASSERT
/**
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t* file, uint32_t line)
{ 
/* User can add his own implementation to report the file name and line number,
ex: printf(''Wrong parameters value: file %s on line %d

'', file, line) */
/* Infinite loop */
while (1)
{
}
}
#endif
/**
* @}
*/ 
/**
* @}
*/ 
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/

Posted on October 08, 2012 at 16:45

This is a bit of a blind hack, as I don't have the board in question.

* Includes ------------------------------------------------------------------*/
#include ''stm32f4xx.h''
#include ''stm324xg_eval.h''
#include ''stm324xg_eval_lcd.h''
#include <
stdio.h
>
/** @addtogroup STM32F4xx_StdPeriph_Examples
* @{
*/
/** @addtogroup ADC_ADC3_DMA
* @{
*/
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* used to display the ADC converted value on LCD */
#define PRINT_ON_LCD
/* if you are not using the LCD, you can monitor the converted value by adding
the variable ''ADC3ConvertedValue'' to the debugger watch window */
#define ADC3_DR_ADDRESS ((uint32_t)0x4001224C)
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
__IO uint16_t ADC3ConvertedValue[3] = {0,0,0};
__IO uint32_t ADC3ConvertedVoltage[3];
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
void ADC3_CH_9_14_15_DMA_Config(void);
#ifdef PRINT_ON_LCD
void Display_Init(void);
void Display(void);
#endif /* PRINT_ON_LCD */
/**
* @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_stm32f4xx.s) before to branch to application main.
To reconfigure the default setting of SystemInit() function, refer to
system_stm32f4xx.c file
*/
#ifdef PRINT_ON_LCD
/* LCD Display init */
Display_Init();
#endif
/* ADC3 configuration *******************************************************/
/* - Enable peripheral clocks */
/* - DMA2_Stream0 channel2 configuration */
/* - Configure ADC Channel7 pin as analog input */
/* - Configure ADC3 Channel7 */
ADC3_CH_9_14_15_DMA_Config();
/* Start ADC3 Software Conversion */
ADC_SoftwareStartConv(ADC3);
while (1)
{
int i;
for(i=0; i<3; i++)
ADC3ConvertedVoltage[i] = (ADC3ConvertedValue[i] * 3300)/0x1000;
#ifdef PRINT_ON_LCD
/* Display ADC3 converted value on LCD */
Display();
#endif
}
}
/**
* @brief ADC3 channel07 with DMA configuration
* @param None
* @retval None
*/
void ADC3_CH_9_14_15_DMA_Config(void)
{
ADC_InitTypeDef ADC_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;
DMA_InitTypeDef DMA_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable ADC3, DMA2 and GPIO clocks ****************************************/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 | RCC_AHB1Periph_GPIOF, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE);
/* DMA2 Stream0 channel2 configuration **************************************/
DMA_InitStructure.DMA_Channel = DMA_Channel_2; 
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC3_DR_ADDRESS;
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ADC3ConvertedValue[0];
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
DMA_InitStructure.DMA_BufferSize = 3;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
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_Stream0, &DMA_InitStructure);
DMA_Cmd(DMA2_Stream0, ENABLE);
/********************************************/
/* DMA2 Stream1 channel2 configuration MODIFICATO **************************************/
/********************************************/
/* Configure ADC3 Channel7 pin as analog input ******************************/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5; /*MODIFICATO*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
GPIO_Init(GPIOF, &GPIO_InitStructure);
/* ADC Common Init **********************************************************/
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
ADC_CommonInit(&ADC_CommonInitStructure);
/* ADC3 Init ****************************************************************/
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfConversion = 3; //Perchè effettuo ttue e tre le conversioni dall'ADC3
ADC_Init(ADC3, &ADC_InitStructure);
/* ADC3 regular channel7 configuration *************************************/
/****MODIFICATO*****/
ADC_RegularChannelConfig(ADC3, ADC_Channel_9, 1, ADC_SampleTime_3Cycles); /****MODIFICATO*****/
ADC_RegularChannelConfig(ADC3, ADC_Channel_14, 2, ADC_SampleTime_3Cycles); /****MODIFICATO*****/
ADC_RegularChannelConfig(ADC3, ADC_Channel_15, 3, ADC_SampleTime_3Cycles); /****MODIFICATO*****/
/* Enable DMA request after last transfer (Single-ADC mode) */
ADC_DMARequestAfterLastTransferCmd(ADC3, ENABLE);
/* Enable ADC3 DMA */
ADC_DMACmd(ADC3, ENABLE);
/* Enable ADC3 */
ADC_Cmd(ADC3, ENABLE);
}
#ifdef PRINT_ON_LCD
/**
* @brief Display ADC converted value on LCD
* @param None
* @retval None
*/
void Display(void)
{
uint32_t v=0,mv=0;
uint8_t text[50];
int i;
for(i=0; i<3; i++)
{ 
v=(ADC3ConvertedVoltage[i])/1000;
mv = (ADC3ConvertedVoltage[i]%1000)/100;
sprintf((char*)text,'' ADC = %d,%d V '',v,mv);
LCD_DisplayStringLine(LINE(6+i),text);
}
}
/**
* @brief Display Init (LCD)
* @param None
* @retval None
*/
void Display_Init(void)
{
/* Initialize the LCD */
STM324xG_LCD_Init();
/* Clear the LCD */
LCD_Clear(White);
/* Set the LCD Text size */
LCD_SetFont(&Font8x12);
/* Set the LCD Back Color and Text Color*/
LCD_SetBackColor(Blue);
LCD_SetTextColor(White);
/* Display */
LCD_DisplayStringLine(LINE(0x13), '' ADC conversion w/ DMA transfer example '');
/* Set the LCD Text size */
LCD_SetFont(&Font16x24);
/* Display */
LCD_DisplayStringLine(LINE(0), ''ADC Ch7 Conv @2.4Msps'');
/* Set the LCD Back Color and Text Color*/
LCD_SetBackColor(White);
LCD_SetTextColor(Blue);
/* Display */
LCD_DisplayStringLine(LINE(2),'' Turn RV1(PF.09) '');
LCD_DisplayStringLine(LINE(4),'' Potentiometer '');
}
#endif /* PRINT_ON_LCD */
#ifdef USE_FULL_ASSERT
/**
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t* file, uint32_t line)
{
/* User can add his own implementation to report the file name and line number,
ex: printf(''Wrong parameters value: file %s on line %d

'', file, line) */
/* Infinite loop */
while (1)
{
}
}
#endif
/**
* @}
*/
/**
* @}
*/
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..
raptorhal2
Lead
Posted on October 08, 2012 at 16:47

The 3 results are in

__IO uint16_t ADC3ConvertedValue[3];
 Not in

__IO uint32_t ADC3ConvertedVoltage;
__IO uint32_t ADC3ConvertedVoltage2;
__IO uint32_t ADC3ConvertedVoltage3;
 Cheers, Hal

orn
Associate II
Posted on October 08, 2012 at 17:02

nothing ... but the problem is that it acquires from pins 4 and 5 (GPIOF), but captures only on pin 3 (CN1 pin 18 of the board)

: '(Help me
orn
Associate II
Posted on October 08, 2012 at 21:13

I solved it! :D I changed the following parameters:

  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable, from Disable to Enable

DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable, from Disable to Enable

   ADC_InitStructure.ADC_ScanConvMode = ENABLE, from Disable to Enablee

but I did not understand why now works :\

raptorhal2
Lead
Posted on October 09, 2012 at 00:29

MemoryInc tells the DMA to increment the memory storage location after each conversion.

ScanConvMode tells the ADC to scan the three channels.

After each conversion, the ADC passes the result in its register to the DMA which drops it in the next memory location. The DMA then sits idle waiting for the ADC to convert the next channel.

Cheers, Hal