簡體   English   中英

STM32中斷Handeling如果條件

[英]STM32 Interrupt Handeling if condition

我如何通過以下代碼使用一個處理程序進行2次中斷:

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) */

這是處理程序執行的代碼:

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的按鈕時,代碼工作正常,LED亮起,當我點擊連接到PB0的按鈕時,LED熄滅。 在我的if結構中,我檢查哪條線是活動的,但我也希望LED只通過點擊PC1而不是點擊第1行的另一個引腳而打開,對於第0行也是如此,但我不知道如何更改if結構的條件。

微控制器是STM32F091。

  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 } } 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM