学习捕获章节发现:捕获一个按钮上升沿,每捕获到一个上升沿LED取反,上升沿由按键产生,目前硬件
仿真发现,当我按下的时候,确实捕获到上升沿,但当我放开的时候却意外发现又捕获到一次,原因是捕获标志位再次挂起,但不是每次都会,差不多按4次,放开4次中有3次会。求解答,是否捕获原本就必须去抖?还是说我哪里设置错误,以下是我的程序
/*º¯ÊýÃû£º
tiM5_Init
*ÃèÊö £ºTIM5³õʼ»¯
*²ÎÊý £ºÎÞ
*·µ»Ø £ºÎÞ
*/
void TIM5_Init(void)
{
//¶¨Òå½á¹¹Ìå
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
//¿ªÆô¶¨Ê±Ê±ÖÓ
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);
//72M£¨APB2£©Ò»·ÖƵ×÷ΪTIMʱÖÓ
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
//ÏòÉϼÆÊý
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
//¼ÆÊý´ÎÊý
TIM_TimeBaseInitStruct.TIM_Period = 0xffff;
//TIM·ÖƵֵ
TIM_TimeBaseInitStruct.TIM_Prescaler = 71;
//Öظ´¼ÆÊýÆ÷
TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
//ÅäÖÃ
TIM_TimeBaseInit(TIM5,&TIM_TimeBaseInitStruct);
//ÖжÏʹÄÜ
TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE);
//2λÇÀÕ¼ÓÅÏȼ¶
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//ͨµÀTIM1_UP_IRQHandlerÓÅÏȼ¶ÅäÖÃ
NVIC_InitStruct.NVIC_IRQChannel = TIM5_IRQn;
//ÓÅÏȼ¶Ê¹ÄÜ
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
//ÅäÖÃͨµÀÇÀÕ¼¼¶±ð
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
//ÅäÖÃͨµÀÏìÓ¦¼¶±ð
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
//ÅäÖÃ
NVIC_Init(&NVIC_InitStruct);
//¶¨Ê±Æ÷ʹÄÜ
TIM_Cmd(TIM5,ENABLE);
}
/*º¯ÊýÃû£ºTIM5_IC_Config
*ÃèÊö £ºTIM5³õʼ»¯
*²ÎÊý £ºÎÞ
*·µ»Ø £ºÎÞ
*/
void TIM5_IC_Config(void)
{
//¶¨Òå½á¹¹Ìå
TIM_ICInitTypeDef TIM_ICInitStruct;
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 ;
GPIO_Init(GPIOA,&GPIO_InitStruct);
PAout(0) = 0;
//Ñ¡ÔñͨµÀÒ»
TIM_ICInitStruct.TIM_Channel = TIM_Channel_1;
//6´ÎÂ˲¨
TIM_ICInitStruct.TIM_ICFilter = 0;
//ÉÏÉýÑز¶»ñ
TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;
//²»·ÖƵ
TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;
//Ó³Éäµ½TIÉÏ
TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;
//²¶»ñ³õʼ»¯
TIM_ICInit(TIM5,&TIM_ICInitStruct);
//ÖжÏʹÄÜ
TIM_ITConfig(TIM5,TIM_IT_CC1,ENABLE);
}
void TIM5_IRQHandler(void)
{
if(TIM_GetITStatus(TIM5,TIM_IT_Update) == SET)
{
//Çå³ý±ê־λ
TIM_ClearITPendingBit(TIM5,TIM_IT_Update);
}
if(TIM_GetITStatus(TIM5,TIM_IT_CC1) == SET)
{
PBout(5) = ~PBout(5);
while(PAin(0));
TIM_ClearITPendingBit(TIM5,TIM_IT_CC1);
}
}
乱码都是注释,忽略不看即可。。。。
一周热门 更多>