Sterling
Sterling
DIIDevHeads IoT Integration Server
Created by Sterling on 9/27/2024 in #firmware-and-baremetal
Debouncing Joystick Input for Frequency Control on STM32 NUCLEO-F401RE
I’m using the STM32 NUCLEO-F401RE microcontroller and have programmed a speaker to change frequency when the joystick is pushed up or down. However, I’m encountering two issues: 1. The frequency sometimes changes multiple times when the joystick is pressed, suggesting the ISR is being triggered more than once. 2. Although the InterruptIn object is set to trigger on the rising edge, it sometimes also triggers on the falling edge when the joystick returns to neutral. I haven’t implemented debouncing yet, and I’m using a digital joystick connected to pins A2 and A3 without external pull-up/down resistors. Here's the code:
void upISR()
{
if (greenLED.getStatus())
{
myTicker.detach();
frequency += 200;
myTicker.attach(callback(&spkr, &Speaker::toggle), 0.5/frequency);
}
}

int main()
{
InterruptIn up(A2);
InterruptIn down(A3);
InterruptIn fire(D4);

up.rise(&upISR);
down.rise(&downISR);
fire.rise(&toggleISR);

redLED.on();

while (1) {}
}
void upISR()
{
if (greenLED.getStatus())
{
myTicker.detach();
frequency += 200;
myTicker.attach(callback(&spkr, &Speaker::toggle), 0.5/frequency);
}
}

int main()
{
InterruptIn up(A2);
InterruptIn down(A3);
InterruptIn fire(D4);

up.rise(&upISR);
down.rise(&downISR);
fire.rise(&toggleISR);

redLED.on();

while (1) {}
}
Could these issues be due to the lack of debouncing? What’s the best way to handle this, and should I be using external pull-up/down resistors to improve reliability? Any advice would be most appreciated guys 🙏🏽
3 replies