cancel
Showing results for 
Search instead for 
Did you mean: 

stm32 adc multi channel

vaibhavsharma63
Associate II
Posted on June 08, 2013 at 12:15

The original post was too long to process during our migration. Please click on the attachment to read the original post.
This discussion is locked. Please start a new topic to ask your question.
22 REPLIES 22
Posted on June 08, 2013 at 12:35

Looks to be a tool problem with the code generation, suggest you take it to the CooCox forum or GNU/GCC devs.

You could try a different optimization level, ie not -O0
Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..
vaibhavsharma63
Associate II
Posted on June 10, 2013 at 06:49

right now i am using coocox software.but i did nt find solution .could you forward me some adc multichannel sample code .

Posted on June 10, 2013 at 19:26

You'll need to review the forum posts, and firmware examples. I don't distribute a package of examples.

I can't fix issues with your tools, you will need to find a different tool chain if the one you have doesn't compile/link code properly. Support for CooCox will need to be sought from them, perhaps via their forum, they do not participate here.

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..
vaibhavsharma63
Associate II
Posted on June 11, 2013 at 11:55

hey ..i am facing a problem in this code .i attached two potentiometer  on pc0 and pc5.i am getting same value when i rotate one potentiometer and another is fixed.so plz guide me how could i get value of 2 potentiometer on different channel..here is my code

#include ''stm32f4xx_adc.h''

#include ''stm32f4xx_gpio.h''

#include ''stm32f4xx_rcc.h''

int ConvertedValue = 0;

int ConvertedValue1=0;

//Converted value readed from ADC

void adc_configure(){

 ADC_InitTypeDef ADC_init_structure; //Structure for adc confguration

 GPIO_InitTypeDef GPIO_initStructre; //Structure for analog input pin

 //Clock configuration

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//The ADC1 is connected the APB2 peripheral bus thus we will use its clock source

 RCC_AHB1PeriphClockCmd(RCC_AHB1ENR_GPIOCEN,ENABLE);//Clock for the ADC port!! Do not forget about this one ;)

 //Analog pin configuration

 GPIO_initStructre.GPIO_Pin = GPIO_Pin_0;//The channel 10 is connected to PC0

 GPIO_initStructre.GPIO_Mode = GPIO_Mode_AN; //The PC0 pin is configured in analog mode

 GPIO_initStructre.GPIO_PuPd = GPIO_PuPd_NOPULL; //We don't need any pull up or pull down

 GPIO_Init(GPIOC,&GPIO_initStructre);//Affecting the port with the initialization structure configuration

 //ADC structure configuration

 GPIO_initStructre.GPIO_Pin = GPIO_Pin_5;//The channel 15 is connected to PC5

 GPIO_initStructre.GPIO_Mode = GPIO_Mode_AN; //The PC0 pin is configured in analog mode

 GPIO_initStructre.GPIO_PuPd = GPIO_PuPd_NOPULL; //We don't need any pull up or pull down

 GPIO_Init(GPIOC,&GPIO_initStructre);//Affecting the port with the initialization structure configuration

 //ADC structure configuration

 ADC_DeInit();

 ADC_init_structure.ADC_DataAlign = ADC_DataAlign_Right;//data converted will be shifted to right

 ADC_init_structure.ADC_Resolution = ADC_Resolution_12b;//Input voltage is converted into a 12bit number giving a maximum value of 4096

 ADC_init_structure.ADC_ContinuousConvMode = ENABLE; //the conversion is continuous, the input data is converted more than once

 ADC_init_structure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;// conversion is synchronous with TIM1 and CC1 (actually I'm not sure about this one :/)

 ADC_init_structure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//no trigger for conversion

 ADC_init_structure.ADC_NbrOfConversion = 2;//I think this one is clear :p

 ADC_init_structure.ADC_ScanConvMode = ENABLE;//The scan is configured in one channel

 ADC_Init(ADC1,&ADC_init_structure);//Initialize ADC with the previous configuration

 //Enable ADC conversion

 ADC_Cmd(ADC1,ENABLE);

 //Select the channel to be read from

 ADC_RegularChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_144Cycles);

 ADC_RegularChannelConfig(ADC1,ADC_Channel_15,2,ADC_SampleTime_144Cycles);

}

int adc_convert(){

 ADC_SoftwareStartConv(ADC1);//Start the conversion

 while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));//Processing the conversion

 return ADC_GetConversionValue(ADC1); //Return the converted data

}

int adc_convert1(){

 ADC_SoftwareStartConv(ADC1);//Start the conversion

 while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));//Processing the conversion

 return ADC_GetConversionValue(ADC1); //Return the converted data

}

int main(void){

 adc_configure();//Start configuration

    while(1){//loop while the board is working

     ConvertedValue = adc_convert();//Read the ADC converted value

     ConvertedValue1 = adc_convert1();//Read the ADC converted value

    }

}

Posted on June 11, 2013 at 14:14

You can't do it like that, you must use DMA for multiple channels on a single ADCx unit.

See example 4/5 down the page. [DEAD LINK /public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Flat.aspx?RootFolder=/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/3%20channels%20on%20ADC1%20and%20DMA&FolderCTID=0x01200200770978C69A1141439FE559EB459D7580009C4E14902C3CDE46A77F0FFD06506F5B&currentviews=123]https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Flat.aspx?RootFolder=%2Fpublic%2FSTe2ecommunities%2Fmcu%2FLists%2Fcortex_mx_stm32%2F3%20channels%20on%20ADC1%20and%20DMA&FolderCTID=0x01200200770978C69A1141439FE559EB459D7580009C4E14902C3CDE46A77F0FFD06506F5B¤tviews=123
Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..
frankmeyer9
Associate II
Posted on June 11, 2013 at 14:35

...

 

       [cc] C:\Users\AKG\AppData\Local\Temp\cciWMwmp.s: Assembler messages:

 

       [cc] C:\Users\AKG\AppData\Local\Temp\cciWMwmp.s:180: Error: offset out of range

 

       [cc] C:\Users\AKG\AppData\Local\Temp\cciWMwmp.s:181: Error: offset out of range

 

       [cc] c:/program files (x86)/gnu tools arm embedded/4.7 2013q1/bin/../lib/gcc/arm-none-eabi/4.7.3/../../../../arm-none-eabi/bin/ld.exe: lto-wrapper failed

 

       [cc] lto-wrapper: C:\Program Files (x86)\GNU Tools ARM Embedded\4.7 2013q1\bin\arm-none-eabi-gcc returned 1 exit status

 

       [cc] collect2.exe: error: ld returned 1 exit status

 

Your toolchain, i.e. the compiler in this case, might have been build without LTO support.

Try removing the ''-flto'' flag.

vaibhavsharma63
Associate II
Posted on June 11, 2013 at 18:32

which path should i follow to remove  ''-flto'' flag.?

vaibhavsharma63
Associate II
Posted on June 11, 2013 at 18:34

which tool chain should i use to assemble the programe ?

Posted on June 11, 2013 at 19:00

which tool chain should i use to assemble the programe ?

 

I'm using Keil, but have reasonably good experiences with Rowley, and IAR. If you're proficient with GNU/GCC something like Yagarto might be workable for you, I've built some flat projects with it.

In terms of supported tools, ST has provided a Template Project, you'd want to be comfortable manipulating that into a new project, and copying in the code I've supplied. The code is sufficiently complete to drop into an existing project, building a project from scratch requires some experience/familiarity with the chosen tools.

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..