[Cortex-M0技术交流] M0外部中断去抖动

[复制链接]
4016|3
 楼主| xyz549040622 发表于 2012-4-21 17:53 | 显示全部楼层 |阅读模式
本帖最后由 xyz549040622 于 2012-4-22 10:06 编辑

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

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

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

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

  9. }

  10. void EINT1CALLBACK(void)
  11. {
  12.          
  13.         i = i + 1;
  14.         
  15.         if(i == 2000)
  16.         {
  17.                 i = 1;
  18.         }
  19.         
  20.         Buffer[1] = i;
  21.         if(Buffer[1] == 1)
  22.         Buffer[0] = 0;
  23.         if((Buffer[1]-Buffer[0]) == 1)
  24.         printf("去抖动\n");
  25.         else  printf("没有去抖动\n");
  26.         
  27.         Buffer[0] = Buffer[1];
  28.         
  29. }
  30. int main()
  31. {
  32.         KEY_Init();
  33.         
  34.     while(1);
  35. }
按下按键的时候一直输出“去抖动”,而设置为电平触发,低电平触发,说明一直存在抖动行为,取消按键,输出停止


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

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

  10. }

  11. void EINT1CALLBACK(void)
  12. {
  13.          
  14.         i = i + 1;
  15.         
  16.         if(i == 2000)
  17.         {
  18.                 i = 1;
  19.         }
  20.         
  21.         Buffer[1] = i;
  22.         if(Buffer[1] == 1)
  23.         Buffer[0] = 0;
  24.         if((Buffer[1]-Buffer[0]) == 1)
  25.         printf("去抖动\n");
  26.         else  printf("没有去抖动\n");
  27.         
  28.         Buffer[0] = Buffer[1];
  29.         
  30. }
  31. int main()
  32. {
  33.         KEY_Init();
  34.         
  35.     while(1);
  36. }
依然可以发现,一直输出“去抖动”因此可以说明。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 精品课全集,给你全方位的技能策划~~←←

2841

主题

19330

帖子

110

粉丝
快速回复 在线客服 返回列表 返回顶部