原文鏈接 https://blog.csdn.net/yuleitao/article/details/104055748
使用標准庫來配置的,可以看我之前的博客
https://blog.csdn.net/yuleitao/article/details/103721812
這個項目是使用CUBEMX配置,hal庫來寫,實現的功能一樣
幾個點注意
使用定時器1,將通道1設置為主模式(直接模式),通道2設置為從模式(非直接模式)
通道1捕獲上升沿,通道二捕獲下降沿
節省CPU時間,提高捕獲精度
CUBEMX配置
時鍾,系統這些就不說了,直接最關鍵的部分,開定時器TIM1
trigger source 選擇 TI1FP1
clock source 選擇 internal clock
channel1 選擇 input capture direct mode
channel2 選擇 input capture indirect mode
下方的設置按照圖上所設一樣就行
最后打開工程,插入如下代碼,開啟定時器1通道1和通道2的捕獲中斷
/* USER CODE BEGIN 2 */ HAL_TIM_IC_Start_IT(&htim1,TIM_CHANNEL_1); HAL_TIM_IC_Start_IT(&htim1,TIM_CHANNEL_2); /* USER CODE END 2 */
/* USER CODE BEGIN 0 */ uint32_t Cap_Data1 ; uint32_t Cap_Data2 ; float Fre_Cap = 0.0; float zhouqi_Cap = 0.0; float Pwm_Duty = 0.0; void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) { Cap_Data1 = HAL_TIM_ReadCapturedValue(&htim1,TIM_CHANNEL_1); if(Cap_Data1 != 0 ) { Fre_Cap = 16.8 * 1000000/Cap_Data1; zhouqi_Cap = 1 / Fre_Cap; Pwm_Duty = Cap_Data2 * 1.0 /Cap_Data1; } } if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2) { Cap_Data2 = HAL_TIM_ReadCapturedValue(&htim1,TIM_CHANNEL_2); } } /* USER CODE END 0 */