正点原子输入捕获实验代码笔记(HAL库)
一、软硬件环境
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 .