外部时钟,主频64M
定时器1 通道1发出PWM波 频率1K
定时器2 通道1输入捕获,上升沿触发
串口
/* USER CODE BEGIN 0 */
uint32_t time_up_num=0;//上升沿计数
float time_frequency;//频率
/* USER CODE END 0 */
初始换打开定时器
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 300);
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);//函数用于使能定时器某一通道的输入捕获功能,并使能相应的中断
HAL_Delay(100);
/* USER CODE END 2 */
回调函数
/* USER CODE BEGIN 4 */
// 捕获中断回调函数,每次捕获到信号就会进入这个回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
// 判断是否是定时器2的外部捕获口1
if(htim->Instance == TIM2)
{
if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1 )
{
time_up_num = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1); // 读取捕获计数,这个时间即为上升沿持续的时间
__HAL_TIM_SET_COUNTER(&htim2, 0); // 计数清零,从头开始计
}
}
}
/* USER CODE END 4 */
计算频率打印,若是想改变频率可设定定时器的计数
__HAL_TIM_SET_AUTORELOAD(&htim1, 499);
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
time_frequency=1000000/time_up_num;//频率
printf("frequency=%.2f\r\n",time_frequency);
HAL_Delay(500);
// __HAL_TIM_SET_AUTORELOAD(&htim1, 499);
}
前两个是频率为1KHz,后面修改了PWM的频率,即频率为2KHz。