Цитата
что так что так
В таком случае предлагаю попробовать еще один "рабочий" вариант EXTI->PR |= 0
И оставить в итоге EXTI->PR = EXTI_PR_PR0, когда синус с этих ног уйдет.
Во всем остальном соглашусь с
smk - код очень странный из-за смеси SPL и доступа к регистрам.
Куда читабельнее записать просто EXTI->PR = (1 << 0)
PS. В cortex-m хорошо, что прерывания защелкиваются в противном случае потери из-за "|=" были бы гарантированы.
PS2. По хорошему еще нужно проверять есть ли условие
Код
void EXTI9_5_IRQHandler(void)
{
cnt1++;
if(EXTI->PR & (1 << 6))
{
cnt2++;
EXTI->PR = (1 << 6);
}
}
Без этого никак при консолидированных обработчиках сразу от нескольких источников. И в некоторых случаях возможно повторное вхождение в прерывание - данную тему затрагивали на форуме, и некоторые участники, можно сказать, ощутили это явление на "собственной шкуре" (я в их числе).
Например, попробуйте на высоких уровнях оптимизации очищать флаг в самом конце прерывания без предварительной проверки условия.
Есть мнение, что cnt1 и cnt2 будут сильно отличаться даже при единственном источнике EXTI6...