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 Programming error in IAR embedded workbench
  • 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 Verified Answer
  • Replies 9 replies
  • Subscribers 7 subscribers
  • Views 3414 views
  • Users 0 members are here
Related

Programming error in IAR embedded workbench

philip-1992
philip-1992 over 12 years ago

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

    }

}

  • Sign in to reply
  • Cancel
  • michaelkellett
    0 michaelkellett over 12 years ago

    I don't use the IAR tools for ARM but this problem can occur with the Keil (or any other) tools as well. You just need to do some detective work - look in startup_stm32f4xx.c (or perhaps some other kind of source) and find where it refers to SystemInit - could well be in a header file, then make sure you include the path to the source and header files for SystemInit (you may need to search for these in your installation of the IAR tools).

    The other possiblity is to check that you installed the tools correctly (this may be easier said than done ).

     

    MK

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

    Ok I found what the problem was. I had to remove startup_stm32f4xx.s from headers image Thank you. Now that I got it to work actually the aim of all this is to interface with an LCD and Displays the value of the pot on screen in order to learn how to interface with an LCD screen. However as I am using a 10kOhm pot I noticed that the code actually converts the value to a MAXIMUM of 4096 (ADC_init_structure.ADC_Resolution = ADC_Resolution_12b;//Input voltage is converted into a 12bit number giving a maximum value of 4096) so I tried to change that line to "ADC_init_structure.ADC_Resolution = ADC_Resolution_14b" and the following error occurs: Error[Pe020]: identifier "ADC_Resolution_14b" is undefined. Need I define it somewhere in the program?

    • 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 philip-1992

    Never mind. I just read the stm32f4 manual and it has the following configurable resolution: 12bit, 10bit, 8bit and 6 bit

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

    So far I managed to get a value from the pot and now I added some code so that the actual value of the pot is shown on the LCD and as I am downloading it to the STM I get the following error: Error[Li005]: no definition for "LCD_DisplayStringLine" [referenced from C:\Documents\STM32\F4_projects\Projects\PotValue\IAR\Debug\Obj\main.o]. This the only error I get because when I comment the instructions

     

       LCD_DisplayStringLine(LINE(3), (uint8_t *)MESSAGE1);

       LCD_DisplayStringLine(LINE(4), (uint8_t *)MESSAGE2);

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

       LCD_DisplayStringLine(LINE(5),text);

     

    the program is downloaded to the board! Any advice? Please note that I also tried to add the stm32f4_discovery_lcd.c to the libraries but as soon as I add it and debug 29 errors occur stating something like:

    Error[Li006]: duplicate definitions for "ASCII12x12_Table"; in "C:\Documents\STM32\F4_projects\Projects\PotValue\IAR\Debug\Obj\lcd_init.o", and "C:\Documents\

    STM32\F4_projects\Projects\PotValue\IAR\Debug\Obj\stm32f4_discovery_lcd.o"

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

    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
  • shabaz
    0 shabaz over 12 years ago in reply to philip-1992

    Hi Philip,

     

    Here are some tips to help with these types of issues:

    1. It could be logic related, buffer size related or linker related. This covers a large area, but there are only about 30 commands in C, so half a day spent looking at a C book (including reading up on  what occurs during the linking process will be invaluable, in case some issues are related to this (not sure if they are or not)

    2. if you suspect a code size related issue, double-check the toolchain license terms (in case there is a restriction), and also check the linker rules. This is a complex area if you're a beginner, and will require some reading up on how memory gets allocated in a microcontroller. There is no short-cut, no-one knows what allocation is needed for the particular software. The toolchain will report memory usage when you do the compilation and linking, and you need to check that against the allocation you have reserved, for each type of memory in the microcontroller.

    3. Check the logic in the code and see what else could be occurring that may make it work if you remove one of the else if() statements. For example, the issue could be related to the buffer (called 'text' in your code) being too small (so to test that, make the buffer larger, or the text that you want to insert smaller), or due to the code execution dropping out of all of the statements depending on the potentiometer position.

    To help debug, if there isn't any debugger capability, you could use things like an LED to test if code is reaching certain points.

    • 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 shabaz

    Hi shabaz,

     

    I did what you told me and here is what I have come up with so far: Regarding point 2; my license is theStandalone license - IAR Embedded Workbench for ARM, 32K Kickstart Edition 6.60. An being my code size is about 22K, that is not the problem. Point 3 was what caught my eye. I did some investigation work and here is what I came up with: 

           

    sprintf((char*)text," Current Value: %0.2f A    ",Current);

     

    This line is supposly there to show the value of the current to 2 decimal places. Thus when I run the program with this line, eye end up with this : Mon Sep 02, 2013 18:44:34: 21564 bytes downloaded into FLASH (11.72 Kbytes/sec) i.e. the program runs but the menu doesn't work, but when I alter that command to

     

    sprintf((char*)text," Current Value: %d A    ",Current);

     

    The program runs and is  16536 bytes and it works perfectly, aside that the current is 0A since it is a float variable.

     

    So is there something wrong with the code or memory locations? 

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

    It seems to be the longest string in the entire if..else if.. else if statement. Maybe your text buffer size is to small, so you need to check that.

    • 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 shabaz

    This is the whole function. You are refering to the text buffer. Is it this line: uint8_t text [100]; that you are refering? I tried to change it to uint16_t text [100]; but then the following error arise: Error[Pe167]: argument of type "uint16_t *" is incompatible with parameter of type "uint8_t *" C:\Documents\STM32\F4_projects\Projects\130902 - PotValue\Source\Menu.c 126

     

    /**

      ******************************************************************************

      * @file    Menu.c

      * @brief   Displays Menu for user to choose    

      ******************************************************************************

    */

     

     

    /* Includes ------------------------------------------------------------------*/

    #include <stdio.h>

    #include "stm32f4xx.h"

    #include "stm32f4_discovery.h"

    #include "stm32f4_discovery_lcd.h"

    #include "stmpe811qtr.h"

    #include "LCD_Touch_Calibration.h"

     

     

    /* Private define ------------------------------------------------------------*/

    /*Calibration accuracy, + /-x pixels*/

    #define CALIBRATION_RANGE      (10)

     

     

    /*1st calibration point  position*/

    #define CAL_POINT1_X            (50)

    #define CAL_POINT1_Y            (25)

     

     

    /*2nd calibration point position*/

    #define CAL_POINT2_X            (150)

    #define CAL_POINT2_Y            (25)

     

     

    /*3rd calibration point position*/

    #define CAL_POINT3_X            (250)

    #define CAL_POINT3_Y            (25)

     

     

    #define TOUCH_AD_VALUE_MAX    (4000)

    #define TOUCH_AD_VALUE_MIN    (100)

     

     

    #define ABS(X)  ((X) > 0 ? (X) : -(X))

     

     

    #define MESSAGE1   "   Philip Farrugia   "

    #define MESSAGE2   " **** Menu Test **** "

     

     

    int ConvertedValue = 0;

    float Current = 0;

     

     

    /* External function prototypes -----------------------------------------------*/

    extern void delay(__IO uint32_t nCount);

     

     

    /* Private variables ---------------------------------------------------------*/

    Point_Struct point_new1, point_old1;

    /*Variables definition for calibration point*/

    static Point_Struct point_Base[5] = {

      {CAL_POINT1_X,CAL_POINT1_Y},

      {CAL_POINT2_X,CAL_POINT2_Y},

      {CAL_POINT3_X,CAL_POINT3_Y}

    };

                          

     

     

    /* Private functions ---------------------------------------------------------*/

    /**

      * @brief  Lcd_Touch Calibration  test

      * @param  None

      * @retval None

      */

    void menu()

    {

      #define CURSOR_LEN    (10)

     

      uint8_t text [100];

      uint8_t k,i;

      Point_Struct tst_point;

      int tpx_sum = 0,tpy_sum = 0, Voltage = 5;

     

     

      /*Indicates whether Calibration is OK*/

      TS_STATE *pstate = NULL;

     

      //Set text color red

      LCD_SetTextColor(Red);

     

      tpx_sum = 0;

      tpy_sum = 0;

      /*wait for Calibration */

       

      for (k = 0;k < 3;k++)

      {

        LCD_DrawUniLine( point_Base[k].x - CURSOR_LEN,

                         point_Base[k].y,

                         point_Base[k].x + CURSOR_LEN,

                         point_Base[k].y);

     

     

        LCD_DrawUniLine( point_Base[k].x,

                         point_Base[k].y - CURSOR_LEN,

                         point_Base[k].x,

                         point_Base[k].y + CURSOR_LEN);

      }

      /* Set the LCD Text Color */

      LCD_SetTextColor(LCD_COLOR_WHITE);

      LCD_DisplayStringLine(LINE(4), (uint8_t *)MESSAGE1);

      LCD_DisplayStringLine(LINE(5), (uint8_t *)MESSAGE2);

      while(1)

      {//loop while the board is working

       do

        {

          pstate = IOE_TS_GetState();

        }while(!pstate->TouchDetected);

         

        delay(10);

        tpx_sum = 0;

        tpy_sum = 0;

        /*Read AD convert result*/

        for(i = 0; i < 16; i++)

        {

          tpx_sum += IOE_TS_Read_X();

          tpy_sum += IOE_TS_Read_Y();

          delay(2);

        }

        tpx_sum >>= 4;

        tpy_sum >>= 4;

         

        tst_point.x = tpx_sum;

        tst_point.y = tpy_sum;

           

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

         {

           while(!pstate->TouchDetected)

           {

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

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

           LCD_DisplayStringLine(LINE(6),text);

           }

         }

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

         {

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

             Current = Voltage / ConvertedValue;      

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

             LCD_DisplayStringLine(LINE(6),text);

         } 

         else if(tst_point.x <= 1200)

         {

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

           LCD_DisplayStringLine(LINE(6),text);

         }

          delay(50);

      }

    }

    • 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