找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 822|回复: 0
打印 上一主题 下一主题
收起左侧

关于STM32正点原子战舰板的输入捕获实验相关问题

[复制链接]
跳转到指定楼层
楼主
ID:609192 发表于 2021-12-6 18:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  • void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//更新中断(溢出)发生时执行  
  • {  
  •     if((TIM5CH1_CAPTURE_STA&0X80)==0)               //还未成功捕获  
  •     {  
  •         if(TIM5CH1_CAPTURE_STA&0X40)                //已经捕获到高电平了  
  •         {  
  •             if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)    //高电平太长了  
  •             {  
  •                 TIM5CH1_CAPTURE_STA|=0X80;          //标记成功捕获了一次  
  •                 TIM5CH1_CAPTURE_VAL=0XFFFF;  
  •             }else TIM5CH1_CAPTURE_STA++;  
  •         }      
  •     }         
  • }  
  •   
  • //定时器输入捕获中断处理回调函数,该函数在HAL_TIM_IRQHandler中会被调用  
  • void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)//捕获中断发生时执行  
  • {  
  •     if((TIM5CH1_CAPTURE_STA&0X80)==0)               //还未成功捕获  
  •     {  
  •         if(TIM5CH1_CAPTURE_STA&0X40)                //捕获到一个下降沿        
  •         {                 
  •             TIM5CH1_CAPTURE_STA|=0X80;              //标记成功捕获到一次高电平脉宽  
  •             TIM5CH1_CAPTURE_VAL=HAL_TIM_ReadCapturedValue(&TIM5_Handler,TIM_CHANNEL_1);//获取当前的捕获值.  
  •             TIM_RESET_CAPTUREPOLARITY(&TIM5_Handler,TIM_CHANNEL_1);   //一定要先清除原来的设置!!  
  •             TIM_SET_CAPTUREPOLARITY(&TIM5_Handler,TIM_CHANNEL_1,TIM_ICPOLARITY_RISING);//配置TIM5通道1上升沿捕获  
  •         }else                                       //还未开始,第一次捕获上升沿  
  •         {  
  •             TIM5CH1_CAPTURE_STA=0;                  //清空  
  •             TIM5CH1_CAPTURE_VAL=0;  
  •             TIM5CH1_CAPTURE_STA|=0X40;              //标记捕获到了上升沿  
  •             __HAL_TIM_DISABLE(&TIM5_Handler);       //关闭定时器5  
  •             __HAL_TIM_SET_COUNTER(&TIM5_Handler,0);  
  •             TIM_RESET_CAPTUREPOLARITY(&TIM5_Handler,TIM_CHANNEL_1);   //一定要先清除原来的设置!!  
  •             TIM_SET_CAPTUREPOLARITY(&TIM5_Handler,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);//定时器5通道1设置为下降沿捕获  
  •             __HAL_TIM_ENABLE(&TIM5_Handler);        //使能定时器5  
  •         }            
  •     }         
  • }

没溢出的话先捕获高电平变成捕获低电平,最后变回捕获高电平,这里我能理解;
溢出到极限的话他的逻辑是什么,没看懂他怎么把捕获低电平变回捕获高电平?
就是溢出次数达到0X3F时。
贴上主循环
  • while(1)  
  •    {  
  •        delay_ms(10);  
  •     TIM_SetTIM3Compare2(TIM_GetTIM3Capture2()+1);   
  •     if(TIM_GetTIM3Capture2()==300)TIM_SetTIM3Compare2(0);         
  •        if(TIM5CH1_CAPTURE_STA&0X80)        //成功捕获到了一次高电平  
  •     {  
  •         temp=TIM5CH1_CAPTURE_STA&0X3F;   
  •         temp*=65536;                    //溢出时间总和  
  •         temp+=TIM5CH1_CAPTURE_VAL;      //得到总的高电平时间  
  •         printf("HIGH:%lld us\r\n",temp);//打印总的高点平时间  
  •         TIM5CH1_CAPTURE_STA=0;          //开启下一次捕获  
  •     }  
  •    }

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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