首页 文章

STM32中断Handeling如果条件

提问于
浏览
3

我如何通过以下代码使用一个处理程序进行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 回答

  • 0
    • 第一:每个EXTIx线路不能连接多个引脚(A..Fx)(参见RM0091第177页) . 所以EXTI第0行IRQ严格对应一个引脚:代码中的C0 .

    • 第二:不要将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
        }
    }
    

相关问题