cancel
Showing results for 
Search instead for 
Did you mean: 

STM32CUBE MX and KEIL5 IDE

Kumar B
Associate II
Posted on March 18, 2018 at 08:30

Hi, I have been using STM32CUBEMX ide for building the code with Keil5 IDE. The issue or bug is the code is working fine when I am placing my code in the main function. But, when I create my own file or outside the main function in it is not affecting the main() function. 

Here is the main function that is working. I have highlighted the working lines with bold letters.

But, when I use the same lines of code in a function or outside the file it is not working why?

int main(void)

{

/* USER CODE BEGIN 1 */

/* USER CODE END 1 */

/* MCU Configuration----------------------------------------------------------*/

/* Reset of all peripherals, Initializes the Flash interface and the Systick. */

HAL_Init();

/* USER CODE BEGIN Init */

/* USER CODE END Init */

/* Configure the system clock */

SystemClock_Config();

/* USER CODE BEGIN SysInit */

/* USER CODE END SysInit */

/* Initialize all configured peripherals */

MX_GPIO_Init();

MX_ADC1_Init();

while (1)

{

HAL_ADC_Start(&hadc1);

adcval=HAL_ADC_GetValue(&hadc1);

Batval=(adcval*2.998)/256;

HAL_ADC_Stop(&hadc1);

HAL_Delay(1000);

}

void my fun(void)

{

HAL_ADC_Start(&hadc1);

adcval=HAL_ADC_GetValue(&hadc1);

Batval=(adcval*2.998)/256;

HAL_ADC_Stop(&hadc1);

HAL_Delay(1000);

}

Can anyone help me out?

15 REPLIES 15
Posted on March 18, 2018 at 12:58

The original post was too long to process during our migration. Please click on the provided URL to read the original post. https://st--c.eu10.content.force.com/sfc/dist/version/download/?oid=00Db0000000YtG6&ids=0680X000006I6eY&d=%2Fa%2F0X0000000bsW%2FjNStl1M2BtSnDzKnFe75V5IVRG0_YtTsYvaYATdaT64&asPdf=false
Posted on March 18, 2018 at 13:13

How do you know that the Batval value is wrong? Are you using the debugger for it?

What is the board you are using? Maybe it's discovery o r nucleo so you could print the Batval through the UART (VCOM)?

What is the Keil compiler optimization setting? Set to 'O0' to be able to debug...

Posted on March 18, 2018 at 13:16

MAke bat() non-void i.e. float and return the value to the main().

Add 'return Batval' in the body of bat()

It makes sens to call the function, do something, and return the outcome.

Then play with the value you get from bat()

Posted on March 19, 2018 at 11:29

When I use HAL for ADC in polling mode I follow this approach to get reliable ADC output:

0690X0000060A4IQAU.png
Posted on March 19, 2018 at 12:34

Mr. Golab I have just found the issue.

The problem is not with global or local variables or with configuration. The culprit is HAL_Delay()

But when I keep HAL_Delay(1) the adc value (actual ) is coming and changing to 

BAT_output=1566577.6 and adcval=134218167

May I know how to manage this HAL_Delay() in functions and other files

Posted on March 19, 2018 at 16:35

Here you can read how to use HAL driver for polling operation. This explain my example provided earlier i.e. HAL_ADC_PollForConversion

Details in stm32f4xx_hal_adc.c

     *** Polling mode IO operation ***

     =================================

     [..]    

       Start the ADC peripheral using HAL_ADC_Start()

       Wait for end of conversion using HAL_ADC_PollForConversion(), at this stage

           user can specify the value of timeout according to his end application      

       To read the ADC converted values, use the HAL_ADC_GetValue() function.

       Stop the ADC peripheral using HAL_ADC_Stop()