这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 在T0EXT(PA7)上装了一个按键,每次按键触发CAPIF中断好几次,并且捕获

共3条 1/1 1 跳转至

在T0EXT(PA7)上装了一个按键,每次按键触发CAPIF中断好几次,并且捕获值一直为零的原因?

工程师
2024-08-31 10:09:18     打赏

我在T0_EXT(PA7)上装了一个按键,每次按键触发CAPIF中断好几次,并且捕获值一直为零

主函数代码如下:int32_t main(void)
{        

    //初始始化部份省略
    NVIC_EnableIRQ(TMR0_IRQn);
    tiMER_Open(TIMER0, TIMER_CONTINUOUS_MODE, 1);
    TIMER_SET_PRESCALE_VALUE(TIMER0, 0);
    TIMER_SET_CMP_VALUE(TIMER0, 0xFFFFFF);
    TIMER_EnableEventCounter(TIMER0, TIMER_COUNTER_FALLING_EDGE);//使能事件计        数模式
    TIMER_EnableCapture(TIMER0, TIMER_CAPTURE_FREE_COUNTING_MODE, TIMER_CAPTURE_FALLING_EDGE);//使能捕获模式
    TIMER_EnableCaptureDebounce(TIMER0);    TIMER_EnableInt(TIMER0);
    TIMER_EnableCaptureInt(TIMER0);               
    TIMER_Start(TIMER0);

    for(;;);
    return 0;
}

中断函数
static int cnt=0;
void TMR0_IRQHandler(void)
{
    if(TIMER_GetCaptureIntFlag(TIMER0) == 1)
    {
        uint32_t au32CAPValue;
        /* Clear Timer0 capture trigger interrupt flag */        
        au32CAPValue = TIMER_GetCaptureData(TIMER0)
        TIMER_ClearCaptureIntFlag(TIMER0);
        printf("capture int_cnt=%d , captureVal=%d n",cnt++,au32CAPValue);        
                        
    }
}




关键词: 中断     按键     CAPIF     捕获    

助工
2024-08-31 10:09:48     打赏
2楼

数器,下降沿触发
    while(1){
        //等待按键按下
        if (GPIO_GET_IN_DATA(PA7) == 0){
            //等待按键释放
            while(GPIO_GET_IN_DATA(PA7) == 0){}
            //输出捕获值
            printf("Capture Value: %dn", TIMER_GetCaptureData(TIMER0, 0));
        }
    }
}

你遇到这个问题的原因可能是因为在按键按下的过程中,由于按键的反弹问题,导致了多次产生中断。为了解决这个问题,你可以在代码中加入按键去抖的操作。

例如,在按键按下后,可以延时一段时间(几十毫秒)再进行捕获操作,这样可以避免按键反弹引起的多次中断。

另外,你还可以使用外部中断的边沿触发模式,将其设置为上升沿触发或者下降沿触发,这样可以更精确地捕获按键的信号。


专家
2024-08-31 11:26:02     打赏
3楼

感谢楼主分享


共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]