Nucleo F401RE - прерывание не работает

У меня проблема с Nucleo F401RE: когда я пытаюсь вызвать прерывание, изменяя значение на PA9, ничего не происходит :(

Мой код:

void EXTI_Config(){

    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource6);
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource7);
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource8);
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource9);
    EXTI_InitTypeDef buttonEXTI;
    EXTI_StructInit(&buttonEXTI);
    buttonEXTI.EXTI_Line = 0x1E0;
    buttonEXTI.EXTI_Mode = EXTI_Mode_Interrupt;
    buttonEXTI.EXTI_Trigger = EXTI_Trigger_Rising;
    buttonEXTI.EXTI_LineCmd = ENABLE;
    EXTI_Init(&buttonEXTI);

    NVIC_InitTypeDef buttonNVIC;

    buttonNVIC.NVIC_IRQChannel = EXTI9_5_IRQn;
    buttonNVIC.NVIC_IRQChannelPreemptionPriority = 1;
    buttonNVIC.NVIC_IRQChannelSubPriority = 0;
    buttonNVIC.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&buttonNVIC);

    EXTI_ClearFlag(0x1E0);
}

void EXTI9_5_IRQHandler(){
    if(EXTI_GetFlagStatus(EXTI_Line6)==SET){ //works
        EXTI_ClearITPendingBit(EXTI_Line6);
        if (mode==0&&isTimeSet){
            mode=1;
        } else if(mode==1){
            mode=2;
        } else {
            mode=1;
        }
    } else if (EXTI_GetFlagStatus(EXTI_Line7)==SET){ //works
        EXTI_ClearITPendingBit(EXTI_Line7);
        changeValue=2;
    } else if (EXTI_GetFlagStatus(EXTI_Line8)==SET){ //works
        EXTI_ClearITPendingBit(EXTI_Line8);
        changeValue=1;
    } else if (EXTI_GetFlagStatus(EXTI_Line9)==SET){ //don't work :(
        EXTI_ClearITPendingBit(EXTI_Line9);
        settingsApplied=1;
    }
}

Любое другое прерывание работает как шарм, а вот это - нет. На схемах платы этот вывод не вставлен, поэтому я не знаю, почему это происходит :(


person Kris_1313    schedule 05.09.2017    source источник


Ответы (1)


Полагаю, проблема в следующей строке

buttonEXTI.EXTI_Line = 0x1E0;

ваша маска должна быть 0x03C0

чтобы избежать подобных ошибок, вы можете использовать следующий метод:

buttonEXTI.EXTI_Line = EXTI_Line6 | EXTI_Line7 | EXTI_Line8 | EXTI_Line9;
person denis krasutski    schedule 06.09.2017
comment
Привет. Где я могу следовать руководству по такого рода операциям? Я использую только библиотеку mbed, но я хотел бы узнать такие адреса, и вы знаете ... - person Cătălina Sîrbu; 20.12.2019