展开讨论一下这句话,先来看看这个函数
TIM_GetITStatus这个函数返回中断状态,因为tim有多个中断源公用一个中断,所以需要辨别是哪个源产生的中断时用到这个函数.
库函数的源代码是
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));
//上面两行是个宏函数,意思是检查参数是否合法,release编译时忽略,不管它
itstatus = TIMx->SR & TIM_IT;
itenable = TIMx->DIER & TIM_IT;
if ((itstatus != (uint16_t)RESET) && (itenable != (uint16_t)RESET))
//这三句的意思是如果设置了中断并且中断标志为1返回1
{
bitstatus = SET;
}
else
{
bitstatus = RESET;
}
return bitstatus;
}
上面的那个条件看起来有点多余,直接检测中断标志不行吗?
如果不用库函数这样写if (TIMx->SR & TIM_IT_x) {}不是很省吗?
实际的情况是如果只开启了一个中断源的时候是可以的,如果有两个以上就不行,你可以试试.这一点手册上并没有说清楚,因此用库函数是比较保险的方式.但是多个中断源的判别就比较累了好像这样
if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)
{
}
if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)
{
}
if (TIM_GetITStatus(TIM2, TIM_IT_CC3) != RESET)
{
}
if (TIM_GetITStatus(TIM2, TIM_IT_CC4) != RESET)
{
}
因为返回值非0即1所以需要反复的调用这个函数.
根据库函数分析只要改成这样就没有问题了
switch (TIMx->SR & TIMx->DIER & (TIM_IT_CC1|TIM_IT_CC2|TIM_IT_CC3|TIM_IT_CC4) {
case TIM_IT_CC1:
...
break;
case TIM_IT_CC2:
...
break;
case TIM_IT_CC3:
...
break;
case TIM_IT_CC4:
...
break;
}
更进一步还可以使用位操作来判断,之中的差距不小啊.
总之用不用固件库函数你自己看着办吧.
|