cancel
Showing results for 
Search instead for 
Did you mean: 

stm32f0 EXTI cubemx platformio

johannv99
Associate II

my daily job is C# programming, so after a break on stm32,

I started again with platformIO and CubeMx

( and thought how hard can it be to turn a led on and off ? )

 

the problem i have with the STM32F0 discovery ( the green one )

the EXTI IRQ event is not triggered.

 

i found this example.

https://www.youtube.com/watch?v=xawN4Y7uSJ4

this is my platformIO.ini
[platformio]
default_envs = disco_f051r8

[env:disco_f051r8]
platform = ststm32
board = disco_f051r8
framework = stm32cube
board_build.mcu = stm32f051r8t6
upload_protocol = stlink
build_flags = -I./Inc
board_build.f_cpu = 48000000L
 
after adding the include path ( Inc ) it worked.
 
connecting the board,
building
debugging step by step.
etc etc. 
turn a led on and off ,  push   a button reading the value 1 or 0  ( so i know the button is working )
got it quickly working.
 
the the next step is EXTI interrupt.
( made it with CubeMX32 )
very easy to choose the pins and set up everything.
here some more info how it should be done.

https://moons.link/en/post-256/
https://deepbluembedded.com/stm32-external-interrupt-example-lab/

after chanchig the project with the CubeMx32 tool

the function  changed 

MX_GPIO_Init()

 

 __HAL_RCC_GPIOA_CLK_ENABLE();
 __HAL_RCC_GPIOC_CLK_ENABLE();

from what i read in the documentation.

you can override the weak callback function by adding this.

so when the button is pushed the second led toggles.

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if(GPIO_Pin == UserButton1_Pin) // If The INT Source Is EXTI Line9 (A9 Pin)
    {
      HAL_GPIO_TogglePin(LD4_GPIO_Port, LD4_Pin); // Toggle The Output (LED) Pin
    }
}

there should also be an IRQhandler function.

void EXTI0_IRQHandler(void)
{
  /* USER CODE BEGIN EXTI0_IRQn 0 */
  //HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
  /* USER CODE END EXTI0_IRQn 0 */
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
  /* USER CODE BEGIN EXTI0_IRQn 1 */
 
  /* USER CODE END EXTI0_IRQn 1 */
}
 

 

and the last step where i am not sure about is this.

 
set the priotiry and enable the event.
( but i am not very sure what parameters to send with these functions )
 
PVD_IRQn
 
  HAL_NVIC_SetPriority (PVD_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ (PVD_IRQn);
 

 

after reading a lot and some puzzling, i cannot get it to work.

 

thanks

 

13 REPLIES 13

It goes into the Default_Handler because you don't have defined the proper interrupt handler, i.e. EXTI0_1_IRQHandler() (the weak EXTI0_1_IRQHandler in the startup code, which is in that case used, is then just an alias of Default_Handler).

JW


@johannv99 wrote:

to answer the question where it "hangs"  ( infinite loop ) 

 

after push the button...

 

it is this file generated by cubeMx

( startup_stm32f051x8.s )


Did you test the ioc I've shared or not? please answer that question.

Thank you.

To give better visibility on the answered topics, please click on "Accept as Solution" on the reply which solved your issue or answered your question.
johannv99
Associate II

I tried your ioc file and project, but it had the same problem.

 

I think Mr Waclawek could be right.

 

i found 2 similar cases.

this is the loop where it hangs,  ( because of the Default_Handler  )

https://community.st.com/t5/stm32-mcus-products/whenever-interrupt-generate-default-handler-infine-loop-execute/td-p/485841

 

here it looks like there is a solution for the startup_stm32F051x8.s file.

https://community.st.com/t5/stm32-mcus-products/exti-irq-with-userbutton-problem/td-p/427227

 

I think slowly i am getting there.

Could you please share the complete poject?

 

To give better visibility on the answered topics, please click on "Accept as Solution" on the reply which solved your issue or answered your question.