2016-04-01 56 views
3

如何,我可以通過下面這段代碼有2箇中斷,帶一個處理器:STM32中斷HANDELING如果條件

SYSCFG->EXTICR[0] |= SYSCFG_EXTICR1_EXTI0_PB | SYSCFG_EXTICR1_EXTI1_PC; 
EXTI->IMR = EXTI_IMR_MR0 | EXTI_IMR_MR1; 
EXTI->RTSR = EXTI_RTSR_TR0| EXTI_RTSR_TR1; 
/* Configure NVIC for External Interrupt */ 
/* (6) Enable Interrupt on EXTI0_1 */ 
/* (7) Set priority for EXTI0_1 */ 
NVIC_EnableIRQ(EXTI0_1_IRQn); /* (6) */ 
NVIC_SetPriority(EXTI0_1_IRQn,0); /* (7) */ 

這是處理程序excecute代碼:

void EXTI0_1_IRQHandler(void) 
{ 
    if ((EXTI->PR & EXTI_PR_PR1) == EXTI_PR_PR1) /* Check line 1 has triggered the IT */ 
    { 
    EXTI->PR = EXTI_PR_PR1; /* Clear the pending bit */ 
    GPIOC->ODR |= 1<<0; 
    } 
    if ((EXTI->PR & EXTI_PR_PR0) == EXTI_PR_PR0) /* Check line 0 has triggered the IT */ 
    { 
    EXTI->PR = EXTI_PR_PR0; /* Clear the pending bit */ 
    GPIOC->ODR &= ~(1<<0); 
} 
} 

的代碼工作正常時,點擊連接到PC1的按鈕,指示燈亮起,當我點擊連接到PB0的按鈕時,指示燈熄滅。 在我的if結構中,我檢查哪一行處於活動狀態,但我也希望僅通過單擊PC1打開LED,而不是單擊第一行上的另一個引腳,這與第0行相同,但我不知道如何才能改變if結構的條件。

微控制器是STM32F091。

+0

所以你說,你打開這條線GPIOC-> ODR LED &=〜(1 << 0); ? –

+0

我對此抱有懷疑&&(GPIOB-> IDR&GPIO_IDR_0)。 –

+0

對不起,這是我嘗試過的東西,但我刪除了代碼的一部分,是否有任何建議,我可以使用?我在我的問題中編輯代碼;) – Sandeerius

回答

0
  1. 第一:每個EXTIx線不能連接多個引腳(A..Fx)(參見RM0091第177頁)。因此,EXTI行0 IRQ嚴格對應於代碼中的一個引腳:C0。
  2. 第二:不要使用服務按鈕的IRQ。您必須實現反彈濾波器,並且最好的辦法是通過定時器檢查按鈕的引腳狀態。人類的反應大約是200ms,真正推動按鈕會產生持續時間100-200ms的脈衝。因此,你需要用12-24ms和RAM每個按鈕兩個字節定時器...查看波紋管的代碼示例:

    uint8_t btn_state = (uint8_t)0x0, btn_mask = (uint8_t)0x1; 
    void some_tim_irq_handler(void) 
    { 
        if (GPIOC->IDR & (uint16_t)0x1) { // PC0 up 
         btn_state |= btn_mask; 
        } else {       // PC0 down 
         btn_state &= (uint8_t)~btn_mask; 
        } 
        btn_mask <<= (uint8_t)0x1;  // mask cycle 
        if (btn_state == (uint8_t)0x0) { 
         // One state 
         return; 
        } 
        if (btn_state == (uint8_t)0xFF) { 
         // Second state 
        } 
    }