正点原子输入捕获实验代码笔记(HAL库)

时间:2024-02-22 10:57:28

一、软硬件环境

  STM32F1精英版 ,MDK5

二、输入捕获原理

  

  如上图所示,t1时刻输入高电平,发生中断,在中断里将计数值置0,开始记溢出次数N,其中每计数0xFFFF次溢出一次,直到t2时刻跳变回低电平,获取最后一次溢出时到t2时刻的计数值TIM5CH1_CAPTURE_VAL,则  溢出总次数 = 溢出次数*65535+TIM5CH1_CAPTURE_VAL ;根据定时器初始化时的频率即可计算出溢出总次数所占用的时间,即为高电平时间。

 

三、输入捕获重点代码笔记

  1、初始化TIM5 CH1为 1MHz ,即1us计数一次

TIM5_CH1_Cap_Init(0XFFFF,72-1);

 

  2、第一次捕获到高电平时,要清除计数寄存器里面的值

__HAL_TIM_SET_COUNTER(&TIM5_Handler,0);//设置计数寄存器的值变为0

 

  3、清除并重设捕获极性(上升沿或下降沿触发)

TIM_RESET_CAPTUREPOLARITY(&TIM5_Handler,TIM_CHANNEL_1);   //一定要先清除原来的捕获极性!!
TIM_SET_CAPTUREPOLARITY(&TIM5_Handler,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);//定时器5通道1设置为下降沿捕获(重设捕获极性)

 

  4、捕获到下降沿后,获取最后一次溢出到t2时刻的计数值

TIM5CH1_CAPTURE_VAL=HAL_TIM_ReadCapturedValue(&TIM5_Handler,TIM_CHANNEL_1);//获取当前的捕获值.

  5、溢出次数

//捕获状态
//[7]:0,没有成功的捕获;1,成功捕获到一次.
//[6]:0,还没捕获到低电平;1,已经捕获到低电平了.
//[5:0]:捕获低电平后溢出的次数
u8  TIM5CH1_CAPTURE_STA=0;                            //输入捕获状态,每次溢出+1,最大值为0X3F

 

  6、计算总溢出次数

temp=TIM5CH1_CAPTURE_STA&0X3F; 
temp*=65536;                     //溢出时间总和
temp+=TIM5CH1_CAPTURE_VAL;      //得到总的高电平时间

 

 

that is all .