STM32中断处理的if条件

3

以下代码如何使用一个处理程序来实现两个中断:

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时亮起来,而不是在单击第一行上的另一个引脚时亮起来。对于第0行也是如此,但我不知道如何更改if结构的条件。

微控制器是STM32F091。


你的意思是说,你可以通过这行代码 GPIOC->ODR &= ~(1<<0); 打开 LED 吗? - user5585984
我对这个表达式感到怀疑:&& (GPIOB->IDR & GPIO_IDR_0)。 - user5585984
是的,抱歉那是我尝试过的东西,但最终我删除了那部分代码,你有什么建议可以提供吗?我已经在我的问题中编辑了代码 ;) - Sandeerius
1个回答

0
首先:您不能将多个引脚(A..Fx)连接到一个EXTIx线路上(请参阅RM0091第177页)。因此,EXTI线0 IRQ严格对应于一个引脚:您代码中的C0。
其次:不要使用IRQ来服务按钮。您必须实现抖动过滤器,最好的想法是通过计时器检查按钮引脚状态。人类反应大约为200毫秒,真正按下的按钮会产生持续100-200毫秒的脉冲。因此,您需要一个具有12-24毫秒的计时器和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 } }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接