2741|0

4008

帖子

0

TA的资源

版主

楼主
 

固件库的逻辑是有原因的不确定的情况下不要改 [复制链接]

展开讨论一下这句话,先来看看这个函数
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;
}
更进一步还可以使用位操作来判断,之中的差距不小啊.
总之用不用固件库函数你自己看着办吧.
此帖出自stm32/stm8论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表