中级会员
 
- 积分
- 200
- 金钱
- 200
- 注册时间
- 2016-4-27
- 在线时间
- 29 小时
|
1金钱
2.库函数版本
u16 TPAD_Get_Val(void)
{
TPAD_Reset();
while(TIM_GetITStatus(TIM5, TIM_IT_CC2) != RESET)//等待溢出( 或用TIM_GetFlagStatus(TIM5, TIM_IT_CC2) == RESET)代替)
{
if(TIM_GetCounter(TIM5)>TPAD_ARR_MAX_VAL-500)
return TIM_GetCounter(TIM5);//超时了,直接返回CNT的值
};
return TIM_GetCapture2(TIM5);
}
我的问题是
是不是这个地方用TIM_GetITStatus(TIM5, TIM_IT_CC2) != RESET这个函数就不对把,因为没开中断,if ((itstatus != (uint16_t)RESET) && (itenable != (uint16_t)RESET))
{
bitstatus = SET;
}
else
{
bitstatus = RESET;
}
return bitstatus;
}他永远都是reset,根本执行这个while语句,所以把return TIM_GetCapture2(TIM5)放在while循环里面就永远没有返回值,但是为什么用这个语句却还好使呢?怎么检测到有按键按下的啊?不是应该进入这个函数就直接返回return TIM_GetCapture2(TIM5)了么?
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT)
{
ITStatus bitstatus = RESET;
uint16_t itstatus = 0x0, itenable = 0x0;
/* Check the parameters */
assert_param(IS_TIM_ALL_PERIPH(TIMx));
assert_param(IS_TIM_GET_IT(TIM_IT));
itstatus = TIMx->SR & TIM_IT;
itenable = TIMx->DIER & TIM_IT;
if ((itstatus != (uint16_t)RESET) && (itenable != (uint16_t)RESET))
{
bitstatus = SET;
}
else
{
bitstatus = RESET;
}
return bitstatus;
}
|
最佳答案
查看完整内容[请看2#楼]
我知道为什么了,原子最开始的程序代码是不对的,根本没有捕获到上升沿,而是一直读取counter的值,把while删掉,程序一样好使
|