2024-11-30 07:40 AM - edited 2024-11-30 07:42 AM
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == GPIO_PIN_1)
{
uint32_t current_time = HAL_GetTick();
if ((current_time - last_interrupt_time) > 500)
{
last_interrupt_time = current_time;
Button++;
}
}
}
while (1)
{
if (Button== 2) {
Button= 0;
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14,GPIO_PIN_SET)
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
Hello. The code I wrote with external interrupt does not work.
If I press the button with intervals shorter than 500ms, it should not detect these button bounces..
If I press the watch button for more than 500ms, I want it to detect it.
Even if I press the watch button for more than 500ms, the value of the button variable does not increase.
If I just write the code below, the button variable increases, but because of the button bounces, even though I want it to increase by +1, it increases like +5 to +10.
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == GPIO_PIN_1)
{
Button++;
}
}
Why aren't my codes at the beginning of the message working?
2024-12-01 09:37 AM
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == GPIO_PIN_1)
{
Button++;
}
}
If I write only this code into EXTI then the Button variable increases uncontrollably.
2024-12-01 09:44 AM
You have no cap parallel to the button... still?
So don't ++ , it's just nonsense.
Except you want to count how many times it's bouncing.
2024-12-01 09:44 AM - edited 2024-12-01 09:49 AM
Is Button declared properly, with volatile attribute?
Basic button handling in SysTick ISR:
https://community.st.com/t5/stm32-mcus-products/external-interrupt-and-button-debounce/m-p/722909
No capacitor needed. ;)
2024-12-01 10:04 PM - edited 2024-12-01 10:04 PM
I don't have a capacitor.
volatile uint8_t button_state = 0; // Butonun kararlı durumu
volatile uint8_t button_debounce_flag = 0;
volatile uint16_t debounce_counter = 0; // Debounce için sayaç
#define DEBOUNCE_THRESHOLD 50 // 50 ms debounce süresi
void SysTick_Handler(void)
{
// SysTick ISR
if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == GPIO_PIN_RESET) // Butona basıldı mı?
{
if (debounce_counter < DEBOUNCE_THRESHOLD)
debounce_counter++;
if (debounce_counter >= DEBOUNCE_THRESHOLD && button_debounce_flag == 0)
{
button_state = 1; // Butona basıldığını kaydet
button_debounce_flag = 1; // Daha fazla işlem yapmayı engelle
}
}
else
{
debounce_counter = 0; // Sayaç sıfırlanır
button_debounce_flag = 0; // Tekrar algılama açılır
button_state = 0; // Butonun bırakıldığını kaydet
}
}
while (1)
{
if (button_state)
{
// Butona basıldığında yapılacak işlemler
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); // Örnek: LED toggle
}
}
it doesn't work.
2024-12-02 12:25 AM
The code you may find by following the link form my post above does work.
Your code is toggling the LED indefinitely while button_state is nonzero.