EXTI code on STM32F4 doesn't work properly
This line looks suspect:
EXTI-&gt;PR |= EXTI_PR_PR13;
The user manual tells you to write a '1' bit to clear the interrupt. That line does not quite do what you expect. Why you might ask? The register you read is not the same register you write. This is why doing a read/modify/write is not correct in this situation.
the required code is:
EXTI-&gt;PR = EXTI_PR_PR13;
or if you want to clear all flags in this register:
EXTI-&gt;PR |= EXTI_PR;
You might also want to check that EXTI_PR_PR13 is actually a bit mask and not a bit number. eg: a bit mask might be (1 &lt;&lt; 13) and the bit number is 13.
There might be other issues with your code, but the above is what jumped out at me as it is a common mistake.
Other observations:
it is generally bad juju to put a delay in an isr. In this instance it is test code,  but tying up a processor with a delay is not good practice. Use a timer to generate a tick (or use systick).
using pushbutton/switches external signals with external interrupts. Ok if you want to wake the cpu from sleep, but beyond that disable the external interrupt and use a timer tick to poll the input and filter/debounce it. Switches work in the realm of 10's of milliseconds. Interrupts on a STM F4 series are sub-microsecond. Use interrupts where you need the fast response.