Hate to jump on you.
Servicing a push button with this type of Interrupt Service Routine (ISR) is just a mistake. Think about how many times it is referred to in a single push... Did you de-bounce the switch in hardware?
I think you are not SEEING the point of what Sam is saying.
You are not listening, you are not following the rule of interrupts. "Do very little in an interrupt"
Think about it, , how many edges does a switch make on a push or release?
What is your baud rate??? How long does printf take to get a string out?
? FAR LONGER than that switch will bounce ON-OFF-ON. That my friend, is what Sam was talking about, , , Re-entrance........ big problems.
Set flags for the 'main' code to deal with.
NEVER CALL A FUNCTION IN AN INTERRUPT
If you do, you will learn quick. Or, , , you will be asking why it doesn't work, , , or complain it is the compilers fault.
Try the whole thing in assembly, write the whole thing and see, again, it doesn't work to do much of anything in an INTERRUPT routine. Learn the golden rule, , just set flags, don't do anything that takes any time to speak of with respect to the rate of incoming interrupts. The ENTIRE ISR needs to be done in less time than the expected rate of interrupts, by maybe 50%. Otherwise, , when will the non-interrupt code run?
Please listen to help, the help given is correct, a great collection of minds from great people are here, helping you. Your mind learns better when you are not on the defense.
Think like a chip in these cases, the devil lurks in the details. Think like the robot you program, what does it see, how will it re-act???