Skip to main content
WrenchInTheWorks
Associate II
Jul 5, 2025 9:37 AM UTC
Solved

Wake-up form EXTI not working on STM32G0B1 custom board

Hello,

I'm attempting to make my MCU shift between STOP and RUN mode using a button. When I press the button the CPU stops, however, upon pressing again it fails to start the CPU. I know this form the LED indicators.

The strange part is that when I place a debug point, or anything debug related, the CPU wakes and immediately and runs the ISR as if it were waiting for the stop mode to resume.

Is there some setting I need to enable to get the GPIOs to funtion in stop0? 

I have had a look at other forum posts and MX examples but have not seen anything, or I have missed it.

My ISR:

void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin) {
 if (GPIO_Pin == Button_Pin && powerDownState == 0)
 {
 	powerDownState = 1;

 	HAL_GPIO_WritePin(Green_LED_GPIO_Port,Green_LED_Pin, GPIO_PIN_RESET); // Enable pull-up on button

 HAL_SuspendTick();
 HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON, PWR_STOPENTRY_WFI);
 }
 else
 {
 	HAL_ResumeTick();

 powerDownState = 0;

 HAL_GPIO_WritePin(Green_LED_GPIO_Port, Green_LED_Pin, GPIO_PIN_SET);
 }
}

 

GPIO_Init:

void MX_GPIO_Init(void)
{

 GPIO_InitTypeDef GPIO_InitStruct = {0};

 /* GPIO Ports Clock Enable */
 __HAL_RCC_GPIOB_CLK_ENABLE();
 __HAL_RCC_GPIOA_CLK_ENABLE();
 __HAL_RCC_GPIOD_CLK_ENABLE();

 /*Configure GPIO pin Output Level */
 HAL_GPIO_WritePin(Green_LED_GPIO_Port, Green_LED_Pin, GPIO_PIN_RESET);

 /*Configure GPIO pin Output Level */
 HAL_GPIO_WritePin(Button_Drive_GPIO_Port, Button_Drive_Pin, GPIO_PIN_RESET);

 /*Configure GPIO pin : Green_LED_Pin */
 GPIO_InitStruct.Pin = Green_LED_Pin;
 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 HAL_GPIO_Init(Green_LED_GPIO_Port, &GPIO_InitStruct);

 /*Configure GPIO pin : Button_Pin */
 GPIO_InitStruct.Pin = Button_Pin;
 GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 HAL_GPIO_Init(Button_GPIO_Port, &GPIO_InitStruct);

 /*Configure GPIO pin : Button_Drive_Pin */
 GPIO_InitStruct.Pin = Button_Drive_Pin;
 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 HAL_GPIO_Init(Button_Drive_GPIO_Port, &GPIO_InitStruct);

 /* EXTI interrupt init*/
 HAL_NVIC_SetPriority(EXTI2_3_IRQn, 3, 0);
 HAL_NVIC_EnableIRQ(EXTI2_3_IRQn);

}

Cheers,
Michael

 

This topic has been closed for replies.
TDK
TDKBest answer
Jul 5, 2025 1:32 PM UTC

Don't enter stop mode within an interrupt. The interrupt can't pre-empt itself.

Set a flag and handle going to sleep within the main loop.

"If you feel a post has answered your question, please click ""Accept as Solution""."

2 replies

TDK
TDKBest answer
Jul 5, 2025 1:32 PM UTC

Don't enter stop mode within an interrupt. The interrupt can't pre-empt itself.

Set a flag and handle going to sleep within the main loop.

"If you feel a post has answered your question, please click ""Accept as Solution""."
MM..1
Super User
Jul 5, 2025 1:49 PM UTC

Use STOP in ISR callback is possible only with good knowledge and prepare registers state ... As @TDK  write never doit this way...