遇到的问题
在学习外部中断时,要用TCRT5000模块输入的下降沿来计数,中断方式选择了下降沿触发中断。
但使用以下中断代码时,无论遇到TCRT5000模块的D0口输出的上升沿还是下降沿,计数都会加1。
void EXTI15_10_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line14) == SET)
{
Count_Sensor ++; //计数值自增一次
EXTI_ClearITPendingBit(EXTI_Line14);
}
}
解决方法
初步判断是TCRT5000模块的D0口输出波形在上升沿或下降沿处存在较大的抖动,导致芯片无法识别上升沿或下降沿,但是身边没有示波器,所以无法实际判断。
通过修改代码来改进:进入中断后,先延时,等抖动消失后,判断相应的GPIO口是否为低电平,如果是,就说明当前是一个下降沿,就可以计数加1。
void EXTI15_10_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line14) == SET)
{
//加上延时,以避免抖动
Delay_ms(100);
/*如果出现数据乱跳的现象,可再次判断引脚电平,加上延时,以避免抖动*/
if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14) == 0)
{
Count_Sensor ++; //计数值自增一次
}
EXTI_ClearITPendingBit(EXTI_Line14);
}
}