element14 Community
element14 Community
    Register Log In
  • Site
  • Search
  • Log In Register
  • About Us
  • Community Hub
    Community Hub
    • What's New on element14
    • Feedback and Support
    • Benefits of Membership
    • Personal Blogs
    • Members Area
    • Achievement Levels
  • Learn
    Learn
    • Ask an Expert
    • eBooks
    • element14 presents
    • Learning Center
    • Tech Spotlight
    • STEM Academy
    • Webinars, Training and Events
    • Learning Groups
  • Technologies
    Technologies
    • 3D Printing
    • FPGA
    • Industrial Automation
    • Internet of Things
    • Power & Energy
    • Sensors
    • Technology Groups
  • Challenges & Projects
    Challenges & Projects
    • Design Challenges
    • element14 presents Projects
    • Project14
    • Arduino Projects
    • Raspberry Pi Projects
    • Project Groups
  • Products
    Products
    • Arduino
    • Avnet Boards Community
    • Dev Tools
    • Manufacturers
    • Multicomp Pro
    • Product Groups
    • Raspberry Pi
    • RoadTests & Reviews
  • Store
    Store
    • Visit Your Store
    • Choose another store...
      • Europe
      •  Austria (German)
      •  Belgium (Dutch, French)
      •  Bulgaria (Bulgarian)
      •  Czech Republic (Czech)
      •  Denmark (Danish)
      •  Estonia (Estonian)
      •  Finland (Finnish)
      •  France (French)
      •  Germany (German)
      •  Hungary (Hungarian)
      •  Ireland
      •  Israel
      •  Italy (Italian)
      •  Latvia (Latvian)
      •  
      •  Lithuania (Lithuanian)
      •  Netherlands (Dutch)
      •  Norway (Norwegian)
      •  Poland (Polish)
      •  Portugal (Portuguese)
      •  Romania (Romanian)
      •  Russia (Russian)
      •  Slovakia (Slovak)
      •  Slovenia (Slovenian)
      •  Spain (Spanish)
      •  Sweden (Swedish)
      •  Switzerland(German, French)
      •  Turkey (Turkish)
      •  United Kingdom
      • Asia Pacific
      •  Australia
      •  China
      •  Hong Kong
      •  India
      •  Korea (Korean)
      •  Malaysia
      •  New Zealand
      •  Philippines
      •  Singapore
      •  Taiwan
      •  Thailand (Thai)
      • Americas
      •  Brazil (Portuguese)
      •  Canada
      •  Mexico (Spanish)
      •  United States
      Can't find the country/region you're looking for? Visit our export site or find a local distributor.
  • Translate
  • Profile
  • Settings
STM32F4DISCOVERY Expansion Boards
  • Products
  • Dev Tools
  • STM32F4DISCOVERY Expansion Boards
  • More
  • Cancel
STM32F4DISCOVERY Expansion Boards
Forum Learning the STM32F4Discovery
  • Blog
  • Forum
  • Documents
  • Files
  • Members
  • Mentions
  • Sub-Groups
  • Tags
  • More
  • Cancel
  • New
Join STM32F4DISCOVERY Expansion Boards to participate - click to join for free!
Actions
  • Share
  • More
  • Cancel
Forum Thread Details
  • State Suggested Answer
  • Replies 12 replies
  • Answers 3 answers
  • Subscribers 7 subscribers
  • Views 1605 views
  • Users 0 members are here
Related

Learning the STM32F4Discovery

philip-1992
philip-1992 over 12 years ago

Hi everyone,

 

I have an upcoming project for my finals as electrical engineer and the project consists of a design of a touch screen interface for micro controller. As I am not that familiar programming I bought the STM discovery, extention and LCD boards in order to get more familiar with the programming. I am using IAR embedded software and downloaded the examples available on this forum. I started with an example that regards the LCD the project's name is LCD_35T. Currently I am struggling understanding a few things mainly the GPIO configuration found under the stm32f4_discovery_lcd.c. I have downloaded the manual of the STM board and read the sections of GPIO (page 185-203 from the manual). However I cannot understand what each instruction is doing to each pin. Is there an explaination like a tutorial of this example?

 

Thank you in advance.

  • Sign in to reply
  • Cancel
Parents
  • mconners
    0 mconners over 12 years ago

    This is one of my favorite resources. There is quite a bit of good info in here. http://www.cs.indiana.edu/~geobrown/book.pdf

     

    If you dowload the software he mentions all of the solution code is in one of the lib directories. Good luck.

     

    Mike

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Reject Answer
    • Cancel
  • philip-1992
    0 philip-1992 over 12 years ago in reply to mconners

    I was wondering about the book you gave me last time, as I read the required hardware chapter I found out that the boards are not the same (he uses STM32 VL and I am using the STM32f4Discovery) and also there are other hardware required. Are all those necessary? Or I can manage to do some examples from the book without the mentioned hardware?

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
  • mconners
    0 mconners over 12 years ago in reply to philip-1992

    Hey Phillip,

     

    Yeah, I had mentioned the processors were different in a follow up post. The code won't change much between the two boards, but you will probably need a different linker script. Google around for that, Folks have made them an posted them to various forums. No you don't have to do all the exercises in the book, pick one or two you are interested in and complete those. I don't know if there is an electronics store (like a radio shack) that may have some of that hardware, but if nothing else, just simulate output by making leds blink.

     

    Also, remember, Google (or bing, or whatever) is your friend, search around for examples for the STM34F4Discovery, I'm sure you'll find more.

     

    Either that or buy the STM32VLDISCOVERY, it's like $12, and buy the hardware in the book, $40-$60, and do all the exercises, you'll learn alot. Everytime you touch either of those boards its an education.

     

    Mike

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
  • philip-1992
    0 philip-1992 over 12 years ago in reply to mconners

    Hi there I found a program which basicly an analogue input is given to PC0 via a potentiometer and through a variable named "ConvertedValue" the user can monitor the actual value of resistance applied by the pot. owever as I tried to Download the code to the board I am getting this error: Error[Li005]: no definition for "SystemInit" [referenced from C:\Users\Philip\Desktop\Potentiometer Read\Project\LCD_35T\EWARM\Discover-More\Obj\startup_stm32f4xx.o]. I checked the whole code and that function isn't referenced anywhere. So my guess is that is has to do with some sort of start up file.. Any guess on how to solve this problem?? The code is below Thank you in advance.

     

    #include "stm32f4_discovery.h"

    #include "stm32f4_discovery_lcd.h"

    #include "stm32f4xx_adc.h"

    #include "stm32f4xx_gpio.h"

    #include "stm32f4xx_rcc.h"

     

     

    int ConvertedValue = 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 image

    //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 image

    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);

    }

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

    adc_configure();//Start configuration

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

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

        }

    }

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
Reply
  • philip-1992
    0 philip-1992 over 12 years ago in reply to mconners

    Hi there I found a program which basicly an analogue input is given to PC0 via a potentiometer and through a variable named "ConvertedValue" the user can monitor the actual value of resistance applied by the pot. owever as I tried to Download the code to the board I am getting this error: Error[Li005]: no definition for "SystemInit" [referenced from C:\Users\Philip\Desktop\Potentiometer Read\Project\LCD_35T\EWARM\Discover-More\Obj\startup_stm32f4xx.o]. I checked the whole code and that function isn't referenced anywhere. So my guess is that is has to do with some sort of start up file.. Any guess on how to solve this problem?? The code is below Thank you in advance.

     

    #include "stm32f4_discovery.h"

    #include "stm32f4_discovery_lcd.h"

    #include "stm32f4xx_adc.h"

    #include "stm32f4xx_gpio.h"

    #include "stm32f4xx_rcc.h"

     

     

    int ConvertedValue = 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 image

    //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 image

    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);

    }

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

    adc_configure();//Start configuration

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

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

        }

    }

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
Children
  • gihu
    0 gihu over 12 years ago in reply to philip-1992

    SystemInit, is in the file system_stm32f4xx.c.

    This file is essential for defining the clock source for the system core, for the timer, and the peripherals.

    ST offer an excel sheet to easily create this file. See:

    http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1533/PF257927

     

    You should add also system_stm32f4xx.h file.

     

    SystemInit() funtion could be called from startup file or from your main program.

     

    Startup, system, and core files are included in different ways depending on the IDE you are using. I use Coocox.

     

    Hope it helps, ask if you have any other issue about it, for me it was a little bit complicated when I was trying to figure out what was every file, and chose IDE.

     

    Regards,

    Miguel

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Reject Answer
    • Cancel
  • philip-1992
    0 philip-1992 over 12 years ago in reply to gihu

    Hi there I really need some guidance on this one. So far I managed to read the value from the pot, do some kind of menu which enables the user to toggle between Voltage, current and resistance. But now I noticed something due to some if statements shown here under:

    if((tst_point.x >= 3000) && (tst_point.x <= 3400))

         {

          sprintf((char*)text," Pot Value: %d Ohms",ConvertedValue);//Display the actual value of the pot on screen

         }

         else if((tst_point.x >= 1900) && (tst_point.x <= 2300))

         {

           Current = Voltage / ConvertedValue;     

           sprintf((char*)text," Current Value: %0.2f A    ",Current);//Display the actual value of the pot on screen

         }

         else if(tst_point.x <= 1200)

         {

           sprintf((char*)text," Voltage = %dV       ",Voltage);//Display the actual value of the pot on screen

         }

     

    The program loads: Mon Sep 02, 2013 15:43:28: 21480 bytes downloaded into FLASH (12.10 Kbytes/sec). The screen shows the initial menu but when I choose an option, the menu doesn't work. After a few trial and error I noticed that when I remove the 2nd if statment the program loads: Mon Sep 02, 2013 15:50:35: 16236 bytes downloaded into FLASH (13.01 Kbytes/sec) and so the touch screen works. Hence I concluded that for the program to work the maximum bytes downloaded into flash must be less than 20000 bytes. Is there a way or a setting to fix this inorder to maximize the bytes? I really do need some help to fix this as my real program will be much larger than that!!

     

    Thanks

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
element14 Community

element14 is the first online community specifically for engineers. Connect with your peers and get expert answers to your questions.

  • Members
  • Learn
  • Technologies
  • Challenges & Projects
  • Products
  • Store
  • About Us
  • Feedback & Support
  • FAQs
  • Terms of Use
  • Privacy Policy
  • Legal and Copyright Notices
  • Sitemap
  • Cookies

An Avnet Company © 2025 Premier Farnell Limited. All Rights Reserved.

Premier Farnell Ltd, registered in England and Wales (no 00876412), registered office: Farnell House, Forge Lane, Leeds LS12 2NE.

ICP 备案号 10220084.

Follow element14

  • X
  • Facebook
  • linkedin
  • YouTube