Вопрос будет удален в ближайшее время.Сделал глупую ошибку, эти IRQ должны запускаться кнопками.Я хотел спросить, почему они не стреляют самостоятельно.
Обработчики прерываний не срабатывают.Это код книги по большей части.Плата основана на: stm32f411RE Nucleo.
Код предназначен для f429, но из моего исследования похоже, что все должно быть в порядке.
Редактировать: добавление этой строки приводит к ее срабатыванию, но только один раз:
EXTI->SWIER = EXTI_SWIER_SWIER0|EXTI_SWIER_SWIER2;
Так что мне нужно как-то сбросить флаг для этого.Но почему исходные аппаратные прерывания не срабатывают.
int main(void)
{
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN | RCC_AHB1ENR_GPIOBEN;
RCC->APB2ENR = RCC_APB2ENR_SYSCFGEN;
__DSB();
GPIOA->MODER |= GPIO_MODER_MODE5_0;
GPIOB->PUPDR |= GPIO_PUPDR_PUPD2_0;
SYSCFG->EXTICR[0] = SYSCFG_EXTICR1_EXTI0_PB | SYSCFG_EXTICR1_EXTI2_PB ;
EXTI->FTSR = EXTI_FTSR_TR2;
EXTI->RTSR = EXTI_RTSR_TR0;
EXTI->IMR = EXTI_IMR_MR0 | EXTI_IMR_MR2;
NVIC_EnableIRQ(EXTI0_IRQn);
NVIC_EnableIRQ(EXTI2_IRQn);
while (1);
}
/* main */
void EXTI0_IRQHandler(void)
{
if ( EXTI->PR & EXTI_PR_PR0)
{
EXTI->PR = EXTI_PR_PR0;
GPIOA->ODR ^= GPIO_ODR_OD5; }
}
void EXTI2_IRQHandler(void)
{
if ( EXTI->PR & EXTI_PR_PR2)
{
EXTI->PR = EXTI_PR_PR2;
GPIOA->ODR ^= GPIO_ODR_OD5;
}
}