STM32 EXTI, kesmeyi tetiklemiyor


0

Açılması (kısaca basıldığında) ve kapatması (uzun süre basılı tutulduğunda) düğmeli bir cihaz üzerinde çalışıyorum. MCU bir STM32L432'dir. Düğme PB0'a bağlı. EXTI'yi durma modu 2'den uyandırma kaynağı olarak kullanmak istiyorum.

Netlik için düşük güç modu olaylarını atladım.

Ana döngüde düğmeyi yoklayacağım. 3 saniyeden uzun süre basılı tutulursa bu işlevi çağırırım:

   void power_shutdown(void){

    volatile uint32_t x = 10000000;
    while (x--){ //ugly delay for button bounce, this one is ~2s
        while (PIN_BTN_LOW){} //wait for the button to be released
    }

    //configure button interrupt
    SYSCFG->EXTICR[0] = SYSCFG_EXTICR1_EXTI0_PB; //PB0 connected to EXTI0
    EXTI->IMR1 = 0x01; //enable EXTI0 interrupt
    EXTI->FTSR1 = 0x01; //EXTI0 line falling edge trigger enable

    //turn off LEDs
    PIN_LED_GREEN_HIGH();
    PIN_LED_BLUE_HIGH();

    debugf("PR1 %08X", EXTI->PR1); //this is always 0x00000000
    debugf("PR2 %08X", EXTI->PR2); //this is always 0x00000000

    NVIC_EnableIRQ(EXTI0_IRQn);

    PIN_LED_BLUE_LOW();

    //dummy loop - entry to low power mode will be here
    while (1){}
}

Aşağıdaki kesme işleyicisine sahibim:

void EXTI0_IRQHandler(void){
    PIN_LED_BLUE_HIGH();
    PIN_LED_GREEN_LOW();
    while (1){} //dummy loop for debugging
    //TODO: system reset here
}

Düğmeye basıldığında işleyicinin çağrılmasını bekliyorum. power_shutdown()Düğmeyi yoklamadan çağırırsam (bir süre sonra otomatik olarak), düğmeye basıldığında EXTI0 işleyicisi uygun şekilde aranır, ancak düğmeye daha önce basılmışsa (normal kullanım durumunda olduğu gibi), daha sonra düğmeye basmazsanız ' t İşleyiciyi tetikleyin.

Ayrıca EXTI->SWIER1 = 0x1;kukla döngüsünden önceki bir yazılımı kesmeye zorlarsam , işleyiciye yalnızca düğmeye daha önce basılmadığı takdirde çağrılır. Düğmeye daha önce basılmışsa, bekleyen bit EXTI->PR1ayarlanmış olsa bile işleyici çağrılmaz .

Varsayılan işleyici ve sabit hata işleyicileri yükledim (girilmedi). Bu durum, hata ayıklayıcının bağlı olup olmamasından bağımsız olarak bağımsız olarak gerçekleşir. Fonksiyonu sadece bir kere çağırdığımı biliyorum, çünkü sondaki aptal döngü.

Düğmeye daha önce basılmışsa, EXTI'nın kesilmesi nasıl tetiklenir?


Evet - __HAL_RCC_SYSCFG_CLK_ENABLE();başlangıçta ararım .
filo

Evet. Ne zaman istersem GPIOB->IDR & GPIO_IDR_ID0_Msk, düğme doğru tepki veriyor, çekme etkin.
filo

Doğru, çünkü işlevi bir süre sonra çağırırsam (örneğin, bir düğmeye basmadan) ve ardından düğmeye basarsanız, işleyici beklendiği gibi çağrılır.
filo

Yanıtlar:


0

Üzgünüm, sorunuzu yanlış anladım. Sorun, kesme bayrağını temizlemiyorsanız veya ISR'den çıkmıyorsanız. Bunun yerine, işleyiciniz sadece sonsuz bir döngüye girer. Kesme bayrağını temizlemeli, böylece tekrar tetiklenip çıkabilsin.


0

Sorunu buldum. Test sırasında power_shutdown()manuel olarak aradığımda ana döngüde (ve beklendiği gibi davranılırken), düğme örneklemesi bir zamanlayıcı kesintili geri çağırma sırasında yapıldı (yani ISR ​​bağlamında). EXTI işleyicisine hiçbir zaman çağrı yapılamadı, çünkü power_shutdown()zaten ISR bağlamındaydı (ve asla geri dönmek niyetinde değildi).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.