HAL_TIM输入捕获源码理解

     在这个例程中用了定时器5通道1的输入捕获/比较模式,测定按下一次按键用时为多少。

    在用cubemx生成配置代码时,我们用到了串口和定时器5的通道1,串口的初始化代码非常简单,就是设置了波特率为115200,8位数据位,一个停止位,没有校验位,收发模式。

   在初始化定时器的代码中,用到了 GENERAL_TIMx_Init(); 函数,我们go to definition进入函数体。

里面的配置几乎和我上一篇文章的PWM输出中对定时器的配置一样,只有一条代码不同。


我们双击GENERAL_TIM_STRAT_ICPolarity得到下图:

再次双击TIM_INPUTCHANNELPOLARITY_RISING得到下图:


我们可以看出我们最终设置的是TIM的CCER寄存器的CC1P位寄存器所在位置如下图;


我们选择的是输入捕获,此处配置为上升沿捕获。

接着我们看main函数下面的内容, ulTmrClk = HAL_RCC_GetHCLKFreq()/GENERAL_TIM_PRESCALER;   (‘/’操作符两个操作数都是一个宏定义) 这条代码的意思是对系统主时钟进行72分频,使定时器的时钟为1MHZ即计数器加一走时1us。在while(1)中 :

while (1)
  {
    if(strCapture.ucFinishFlag == 1 )//参数为捕获的结束标志,属于定义的一个结构体变量
{

//strCapture .usPeriod为定时器正常计数溢出次数

//strCapture .usCtr为计数器当前值
ulTime = strCapture .usPeriod * GENERAL_TIM_PERIOD + strCapture .usCtr;//得到总的计数
printf ( "测得高电平脉宽时间为:%d.%d s\n", ulTime / ulTmrClk, ulTime % ulTmrClk ); 
strCapture .ucFinishFlag = 0;
}
  }

在定时器每次溢出时,会执行strCapture .usPeriod ++;得到溢出次数。

这里重点讲解定时器输入捕获中断回调函数。



回调函数主要流程就是:当我们按下KEY1时(KEY1和定时器5通道1连在同一个引脚)判断捕获是否开启按下按键后首先会进入if分支,首先翻转小灯状态,清零计数器,修改捕获触发方式为下降沿捕获,以便按键弹起时能检测到,清楚当前中断标志位,并重新开启捕获中断以便下次产生中断能进入回调函数,设置捕获开始标志    strCapture .ucStartFlag = 1; 退出循环并退出函数。

当按键弹起时,再次翻转小灯状态,获取定时器CNT的值,配置下降沿捕获。并设置结束标志strCapture .ucFinishFlag = 1;    strCapture .ucStartFlag = 0;退出循环。

这样就可以得到高电平的时间,由(溢出次数*计数周期+TIM->CNT)*1us=T(总)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值