Прерывания не срабатывают - PullRequest
0 голосов
/ 31 мая 2019

Вопрос будет удален в ближайшее время.Сделал глупую ошибку, эти 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;   
        }
}

1 Ответ

0 голосов
/ 01 июня 2019

Вы также должны очистить ожидающий IRQ в NVIC, что-то вроде

NVIC_ClearPendingIRQ (EXTI0_IRQn);

Кроме того, вам нужно убедиться, что в таблице векторов прерываний есть правильные записи для ваших обработчиков. Обычно таблица векторов прерываний находится в файле запуска, но это зависит от вашей системы.

...