本帖最后由 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外部中断不可以去抖动 |