OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2658|回复: 0

定时器中断区别

[复制链接]

4

主题

10

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2018-7-19
在线时间
13 小时
发表于 2018-7-25 18:16:10 | 显示全部楼层 |阅读模式
在使用定时器中断时候,中断有更新中断和捕获中断(即TIM_IT_Update 和 TIM_IT_CC1- TIM_IT_CC4)的区别,我大致理解为更新中断是计时器溢出的标志,捕获中断是捕获事件发生的标志。
于是我利用上升沿捕获写了一个简单的测频率的中断服务函数,函数思想是计算一个计时器周期(开始计数到溢出)内上升沿的次数,以固定的计数器溢出时间和次数计算频率。中断服务函数如下
u8  TIM5CH1_CAPTURE_STA=0; //输入捕获状态         
uint32_t time;  //计数次数值
//定时器5中断服务程序  
void TIM5_IRQHandler(void)
{
  if((TIM5CH1_CAPTURE_STA&0X80)==0)//还未成功捕获
{
  if (TIM_GetITStatus(TIM5, TIM_IT_CC1) !=RESET)//捕获1发生捕获事件,上升沿到来
  {
   if(TIM5CH1_CAPTURE_STA&0x40)     //先判断是否已经捕获到上升沿   
   {  
    time++;              //如果已经捕获到上升沿,那么后边捕获到上升沿后只需给计数器加一
     if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)  //定时器溢出中断是否发生
     {        
     TIM5CH1_CAPTURE_STA|=0X80;    //标记成功,捕获到一个计数器周期的高电平
     }
   }
   else          //还未开始,第一次捕获上升沿
   {
    time=0;                 //计数器归零
     TIM_SetCounter(TIM5,0);  //计时器归零
    TIM5CH1_CAPTURE_STA|=0x40;  //标记捕获到了上升沿
   }      
  }                 
  }
   TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位
}

主函数部分代码如下:
  TIM5_Cap_Init(49999,72-1); //将重装载值设置为49999,以1Mhz的频率计数 ,则计满一次为50ms
    while(1)
{
  delay_ms(10);
   if(TIM5CH1_CAPTURE_STA&0X80)//成功捕获到了一次上升沿
  {
   printf("\r  time= %d ci\r\n",time); //一个定时器周期计数次数
   printf("\r    F= %f Hz\r\n",time/50.0f);
   delay_ms(500);
  }
}

问题是,无论信号源多少评率,这边只是显示,一个定时器周期内只捕获到一次上升沿,串口打印值如下图

我不知道是定时器捕获中断理解错误,还是代码编写错误,希望哪位大神给我指导一下,感激不尽!!!!

QQ图片20180725181239.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-17 17:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表