2024-11-19 05:20 AM - last edited on 2024-11-19 05:25 AM by SofLit
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
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()
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.
after reading a lot and some puzzling, i cannot get it to work.
thanks
2024-11-19 05:24 AM - edited 2024-11-19 05:29 AM
Hello @johannv99 ,
As it's linked to platformio, better to ask your question in their forum: https://community.platformio.org/
We can help you with STM32CubeIDE, in that case you need to share your ioc file.
2024-11-19 05:49 AM - edited 2024-11-19 07:44 AM
Hello again:
You need to activate the NVIC of EXTI line.
Since you are using STM32F0DISCOVERY board, I'm making a simple example to toggle LD4 (Blue) using user button connected on PA0 (just make sure SB3 solder bridge is soldered).
EXTI pin definition and IRQ:
#define UserButton1_Pin GPIO_PIN_0
#define UserButton1_GPIO_Port GPIOA
#define UserButton1_EXTI_IRQn EXTI0_1_IRQn
EXTI NVIC needs to be activated:
/* EXTI interrupt init*/
HAL_NVIC_SetPriority(EXTI0_1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI0_1_IRQn);
PA0 IO config (RCC GPIO port enable is already generated for __HAL_RCC_GPIOA_CLK_ENABLE() and __HAL_RCC_GPIOC_CLK_ENABLE():(
/*Configure GPIO pin : UserButton1_Pin */
GPIO_InitStruct.Pin = UserButton1_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(UserButton1_GPIO_Port, &GPIO_InitStruct);
The GPIO EXTI callback needs to be put in between /* USER CODE XXXX 4 */
/* USER CODE BEGIN 4 */
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
}
}
/* USER CODE END 4 */
The EXTI IRQ handler:
void EXTI0_1_IRQHandler(void)
{
/* USER CODE BEGIN EXTI0_1_IRQn 0 */
/* USER CODE END EXTI0_1_IRQn 0 */
HAL_GPIO_EXTI_IRQHandler(UserButton1_Pin);
/* USER CODE BEGIN EXTI0_1_IRQn 1 */
/* USER CODE END EXTI0_1_IRQn 1 */
}
Attached the project with CubeIDE/CubeMx.
Hope it helps.
2024-11-19 06:44 AM
thanks for your time and support !!
I checked the SB3 solder jumper it has a soldering bridge ( it is original how it came from STM ).
( also, i tested reading the input variable for the push button it goes high and low )
this is my ioc file.
also i choose on
Toolchain / IDE EWARM
your example has : STM32CubeIDE
this looks good now.
HAL_NVIC_SetPriority(EXTI0_1_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI0_1_IRQn);
now it is intresting if i push a button the board halts.
also when set a breakpoint in. HAL_GPIO_EXTI_Callback() function.
it looks like it is not fired.
2024-11-19 06:48 AM
after some debugging i found it hangs on.
this loop.
2024-11-19 06:55 AM
Hello,
Sorry I didn't understand this statement:
@johannv99 wrote:
now it is intresting if i push a button the board halts.
What do you mean by "halts"?
@johannv99 wrote:
also when set a breakpoint in. HAL_GPIO_EXTI_Callback() function.
This is because you set EXTI in event mode and not in interrupt mode and the NVIC configuration is missing. Fixed you ioc file in attachement.
You need to set interrupt mode:
And in NVIC menu to enable EXTI line 0:
PS:
@johannv99 wrote:
Toolchain / IDE EWARM
your example has : STM32CubeIDE
You can regenerate the code I've attached previously to generate EWARM project:
Hope it helps.
2024-11-19 07:25 AM
> void EXTI0_IRQHandler(void)
Note, that in STM32F0xx there is no dedicated EXTI0 interrupt. See Interrupts and events chapter in RM0091. Note, that @SofLit above used:
> void EXTI0_1_IRQHandler(void)
JW
2024-11-19 07:28 AM
@johannv99 wrote:
after some debugging i found it hangs on.
this loop.
/*** @brief This is the code that gets called when the processor receives an* unexpected interrupt. This simply enters an infinite loop, preserving* the system state for examination by a debugger.** @PAram None* @retval : None*/.section .text.Default_Handler,"ax",%progbitsDefault_Handler:Infinite_Loop:b Infinite_Loop.size Default_Handler, .-Default_Handler
That's because you enabled the EXTI NVIC but you didn't declare the EXTI IRQ handler ..
Did you test the ioc I shared? Use the user button (blue button on the board) to trigger the EXTI interrupt on PA0.
2024-11-19 07:39 AM
f The INT Source Is EXTI Line9 (A9 Pin)
part of your comment I see here 9 then you cant use EXTI0 . MX in normal planet generate right code for this, your job is only user clalback. I like platformio for ESP32, but for STM seems require some years to be realy usable.
2024-11-19 08:43 AM
to answer the question where it "hangs" ( infinite loop )
after push the button...
it is this file generated by cubeMx
( startup_stm32f051x8.s )