cancel
Showing results for 
Search instead for 
Did you mean: 

STM32F4 Discovery ADC+USART

mahmoud
Associate
Posted on July 28, 2013 at 19:03

Hallo Guys,

I'm working on project which implies analog to digital conversion and at same time transfering the converted data to the PC through the serial port. I've read couple of examples and was led to the following code .... when processing the code, it gives me 0 errors. But during debugging, i couldn't watch the variable data and nothing appears to the port''using putty''. Sorry guys, i tried but no progress.

Does anybody have an  idea what could be the problem !!

Thanks for all

Mahmoud 

-------------------------------------------------------------------------------------

#include ''stm32f4xx.h''

#include ''stm32f4xx_adc.h''

#include ''stm32f4xx_gpio.h''

#include ''stm32f4xx_rcc.h''

#include ''stm32f4_discovery.h''

void RCC_Configuration(void)

{

  /* --------------------------- System Clocks Configuration -----------------*/

  /* USART3 clock enable */

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);

  /* GPIOB clock enable */

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

}

void GPIO_Configuration(void)

{

  GPIO_InitTypeDef GPIO_InitStructure;

  /*-------------------------- GPIO Configuration ----------------------------*/

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOB, &GPIO_InitStructure);

  /* Connect USART pins to AF */

  GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_USART3);//PC10(AF)=USART3_TX

  GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_USART3);//PC11(AF)=USART3_RX

}

void USART3_Configuration(void)

{

    USART_InitTypeDef USART_InitStructure;

  /* USARTx configuration ------------------------------------------------------*/

  USART_InitStructure.USART_BaudRate = 9600;

  USART_InitStructure.USART_WordLength = USART_WordLength_8b;

  USART_InitStructure.USART_StopBits = USART_StopBits_1;

  USART_InitStructure.USART_Parity = USART_Parity_No;

  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

  USART_Init(USART3, &USART_InitStructure);

  USART_Cmd(USART3, ENABLE);

}

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

 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 = 1;//I think this one is clear :p

 ADC_init_structure.ADC_ScanConvMode = DISABLE;//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);

}

uint16_t 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 main(void)

{

RCC_Configuration();

        GPIO_Configuration();

USART3_Configuration();

adc_configure();

  while(1)

  {

     uint16_t Data =0;

     while(USART_GetITStatus(USART3, USART_IT_RXNE) == RESET); // Wait for Char

 

     USART_ReceiveData(USART3); // Collect Char

     Data = adc_convert(); // Collect Char

     while(USART_GetITStatus(USART3, USART_IT_TXE) == RESET); // Wait for Empty

     USART_SendData(USART3, Data); // Echo Char

 }

  while(1); //Don't want to exit

}

2 REPLIES 2
Posted on July 28, 2013 at 20:35

You have some pin selections which clash with on board peripherals, PB10 and PC0

If you're starting each conversion manually then it's not doing continuous conversions, decide which you want.

I would set up the channels before enabling the ADC.

The USART3 stuff doesn't look too bad, but be cognizant that you are sending 8-bit binary values which the terminal may display as junk. If the baud rate appears wrong, then make sure HSE_VALUE reflect the 8 MHz crystal on the board, along with the associated settings in system_stm32f4xx.c

Also be aware how you have connected the USART up to the PC, the STM32 does not output RS232 compatible levels.

You seem to be pulling in more include files than are necessary, make sure you have you project structured correctly, with an stm32f4xx_conf.h in your folder, and the other include directories pathed properly.
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 July 29, 2013 at 02:52

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

The structure being initialized has seven members. This one is not required for your setup, but if you don't leave it initialized to some valid value (as you have done), strange conversion results can happen.

This is my once every 3 months or so tutorial on this topic for newcomers to the F4. Perhaps someday ST will comment the example code to remove the puzzle.

Cheers, Hal