打印
[Cortex-M0技术交流]

M0外部中断去抖动

[复制链接]
3251|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 xyz549040622 于 2012-4-22 10:06 编辑

也算一篇笔记吧。这个简单的问题搞了有两天了。M0的外部中断是否可以去抖动?【总觉得算法或者程序哪里有问题,希望前辈们提提意见】【欢迎跟帖讨论】

***经过lee老师指导,一楼算法有误,和李老师的谈话分析见二楼,改进后的程序见三楼

1.配置GPB15为外部中断,没有使能去抖动

uint8_t Buffer[2];
void KEY_Init(void)
{
DrvGPIO_Open(KEY1,E_IO_INPUT);//15脚设置为输入
DrvGPIO_InitFunction(E_FUNC_EXTINT1);//配置为外部中断1
DrvGPIO_EnableEINT1(E_IO_FALLING,E_MODE_LEVEL,EINT1CALLBACK);//设置外部中断方式,上升沿,边沿
//DrvGPIO_EnableDebounce(KEY1);//使能15脚去抖动
//DrvGPIO_SetDebounceTime(6,E_DBCLKSRC_10K);//设置去抖动时间1600Us,不管设置几个引脚去抖动,只有一个设置时间

}

void EINT1CALLBACK(void)
{
         
        i = i + 1;
        
        if(i == 2000)
        {
                i = 1;
        }
        
        Buffer[1] = i;
        if(Buffer[1] == 1)
        Buffer[0] = 0;
        if((Buffer[1]-Buffer[0]) == 1)
        printf("去抖动\n");
        else  printf("没有去抖动\n");
        
        Buffer[0] = Buffer[1];
        
}
int main()
{
        KEY_Init();
        
    while(1);
}
按下按键的时候一直输出“去抖动”,而设置为电平触发,低电平触发,说明一直存在抖动行为,取消按键,输出停止


2.1.配置GPB15为外部中断,使能去抖动

uint32_t i = 0;
uint8_t Buffer[2];
void KEY_Init(void)
{
DrvGPIO_Open(KEY1,E_IO_INPUT);//15脚设置为输入
DrvGPIO_InitFunction(E_FUNC_EXTINT1);//配置为外部中断1
DrvGPIO_EnableEINT1(E_IO_FALLING,E_MODE_LEVEL,EINT1CALLBACK);//设置外部中断方式,上升沿,边沿
DrvGPIO_EnableDebounce(KEY1);//使能15脚去抖动
DrvGPIO_SetDebounceTime(6,E_DBCLKSRC_10K);//设置去抖动时间1600Us,不管设置几个引脚去抖动,只有一个设置时间

}

void EINT1CALLBACK(void)
{
         
        i = i + 1;
        
        if(i == 2000)
        {
                i = 1;
        }
        
        Buffer[1] = i;
        if(Buffer[1] == 1)
        Buffer[0] = 0;
        if((Buffer[1]-Buffer[0]) == 1)
        printf("去抖动\n");
        else  printf("没有去抖动\n");
        
        Buffer[0] = Buffer[1];
        
}
int main()
{
        KEY_Init();
        
    while(1);
}
依然可以发现,一直输出“去抖动”因此可以说明。M0外部中断不可以去抖动,取消按键,输出停止


PS:总结经验:1.要想实现M0外部中断不要跳变,可设置为边沿,上升沿促发,此时,按一下,只输出一个“去抖动”。
                     2.如果新建一个.C文件,中断回调函数必须声明。extern void EINT1CALLBACK(void);
                     3.M0外部中断不可以去抖动

相关帖子

沙发
xyz549040622|  楼主 | 2012-4-22 10:05 | 只看该作者








使用特权

评论回复
板凳
xyz549040622|  楼主 | 2012-4-22 10:11 | 只看该作者
本帖最后由 xyz549040622 于 2012-4-22 10:13 编辑

1.不使能GPB15中断[code]uint32_t i = 0;

void KEY_Init(void)
{
DrvGPIO_Open(KEY1,E_IO_INPUT);//15脚设置为输入
DrvGPIO_InitFunction(E_FUNC_EXTINT1);//配置为外部中断1
DrvGPIO_EnableEINT1(E_IO_FALLING,E_MODE_EDGE,EINT1CALLBACK);//设置外部中断方式,下降沿沿,边沿
//DrvGPIO_EnableDebounce(KEY1);//使能15脚去抖动
//DrvGPIO_SetDebounceTime(6,E_DBCLKSRC_10K);//设置去抖动时间1600Us,不管设置几个引脚去抖动,只有一个设置时间

}

void EINT1CALLBACK(void)
{
         
        i = i + 1;
        
        if(i == 2000)
        {
                i = 0;
        }
        
}
int main()
{
        KEY_Init();
        
    while(1)
        {
      printf("i = %d \n",i);
        }
}

结果发现按下一次,i只加一次,没有发现抖动。
PS:结果,发现在边沿触发,下降沿触发的时候,基本没有抖动,难道边沿触发就没有抖动?

使用特权

评论回复
地板
suiwei| | 2012-7-13 09:46 | 只看该作者
顶一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:qq群: 嵌入式系统arm初学者 224636155←← +→→点击-->小 i 精品课全集,21ic公开课~~←←→→点击-->小 i 精品课全集,给你全方位的技能策划~~←←

2754

主题

19237

帖子

104

粉丝