प्रश्न शीघ्र ही हटा दिया जाएगा। एक मूर्खतापूर्ण गलती की, इन IRQ को बटनों द्वारा ट्रिगर किया जाना चाहिए। मेरे कहने का मतलब था कि वे अपने आप ही आग क्यों नहीं लगाते।

इंटरप्ट हैंडलर ट्रिगर नहीं होते हैं। यह अधिकांश भाग के लिए एक पुस्तक कोड है। बोर्ड पर आधारित: stm32f411RE न्यूक्लियो।

कोड 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;   
        }
}
0
user1923363 31 मई 2019, 22:13

1 उत्तर

सबसे बढ़िया उत्तर

आपको NVIC में पेंडिंग IRQ को भी क्लियर करना होगा, कुछ इस तरह

NVIC_ClearPendingIRQ (EXTI0_IRQn);

इसके अलावा, आपको यह सुनिश्चित करने की ज़रूरत है कि इंटरप्ट वेक्टर तालिका में आपके हैंडलर के लिए सही प्रविष्टियां हों। आमतौर पर इंटरप्ट वेक्टर टेबल स्टार्टअप फाइल में होती है, लेकिन यह आपके सिस्टम पर निर्भर करती है।

-1
Richard at ImageCraft 31 मई 2019, 23:15