Удалось добиться стабильной повторяемости. Судя по отладчику, флаг EXTI->PR выставляеться не сразу после подачи питания, а в основном после GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource13);
Код
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)
{
uint32_t tmp = 0x00;
/* Check the parameters */
assert_param(IS_GPIO_EXTI_PORT_SOURCE(GPIO_PortSource));
assert_param(IS_GPIO_PIN_SOURCE(GPIO_PinSource));
tmp = ((uint32_t)0x0F) << (0x04 * (GPIO_PinSource & (uint8_t)0x03));
AFIO->EXTICR[GPIO_PinSource >> 0x02] &= ~tmp;
AFIO->EXTICR[GPIO_PinSource >> 0x02] |= (((uint32_t)GPIO_PortSource) << (0x04 * (GPIO_PinSource & (uint8_t)0x03)));
}
Если возникло прерывание, и мы останавливаем отладку, но питание с МК не убираем, а просто перезапускаем отладку т.е. начинаем с Reset Handler то "EXTI->PR" уже равен 0b010 0000 0000 0000 при запуске. Т.е. значение регистра "EXTI->PR" в ОЗУ не очищается после Reset Handler.
Цитата(Flexz @ Oct 22 2012, 18:31)

В мануале про EXTI_PR написано Reset value: undefined, так что очищать обязательно.
А вообще есть хорошее правило - всегда сбрасывать любые статусы, перед тем как разрешать соответствующее им прерывание, помогает избежать трудно-уловимых глюков.
Действительно написано.. Спасибо вам. Десять раз просмотрел весь это раздел и всё как то этот момент упускал из виду.
У меня ещё вопрос, ниже написано:
"This bit is cleared by writing a 1 into the bit or ..."
т.е. если в прерывание нас привело "EXTI->PR" 0b010 0000 0000 0000, то чтобы снять флаг прерывания мы должны выполнить команду
EXTI->PR = 0b010 0000 0000 0000 верно? В библиотеке так и есть.
А вот что значит ""...or by changing the sensitivity of the edge detector." ?