用TIM4做频率计
1.将TIM4的channel1配置为indirect mode,将channel2配置为direct mode
2.在TIM4的配置选项中做如下图2的配置
3.在程序中添加代码:
/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
/* Captured Value */
__IO uint16_t uhIC2Value = 0;
/* Duty Cycle Value */
__IO uint16_t uhDutyCycle = 0;
/* Frequency Value */
__IO uint32_t uwFrequency = 0;
/* USER CODE END PV */
/* USER CODE BEGIN 2 */
/*##-4- Start the Input Capture in interrupt mode ##########################*/
HAL_TIM_IC_Start_IT(&htim4, TIM_CHANNEL_2);
/*##-5- Start the Input Capture in interrupt mode ##########################*/
HAL_TIM_IC_Start_IT(&htim4, TIM_CHANNEL_1);
/* USER CODE END 2 */
/* USER CODE BEGIN 4 */
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
{
/* Get the Input Capture value */
uhIC2Value = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2);
if (uhIC2Value != 0)
{
/* Duty cycle computation */
uhDutyCycle = ((HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1)) * 100) / uhIC2Value;
/* uwFrequency computation
TIM4 counter clock = (RCC_Clocks.HCLK_Frequency)/2 */
uwFrequency = (HAL_RCC_GetHCLKFreq())/2 / uhIC2Value;
}
else
{
uhDutyCycle = 0;
uwFrequency = 0;
}
}
}
/* USER CODE END 4 */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
uint8_t Fre[4];
Fre[0]=uwFrequency>>24;
Fre[1]=uwFrequency>>16;
Fre[2]=uwFrequency>>8;
Fre[3]=uwFrequency>>0;
HAL_UART_Transmit_IT(&huart1,Fre,4);
HAL_Delay(100);
}
/* USER CODE END 3 */
1.remap了引脚,因为原来那里接了灯