AnsweredAssumed Answered

STM32F4 Discovery ADC+USART

Question asked by mansour.mahmoud on Jul 28, 2013
Latest reply on Jul 29, 2013 by baird.hal.001
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
}

Outcomes