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->PR1
ayarlanmış 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?
GPIOB->IDR & GPIO_IDR_ID0_Msk
, düğme doğru tepki veriyor, çekme etkin.
__HAL_RCC_SYSCFG_CLK_ENABLE();
başlangıçta ararım .