一,通用定时器输入捕获
功能:捕获输入通道上信号的上升沿或下降沿
多用于测量PWM周期/频率,只要测量出连续的两个上升沿或连续的两个下降沿的时间间隔 也可以测量占空比,只要测量出连续的一个上升沿和一个下降沿的时间间隔 ,然后除以周期即可
二,hal配置
软件:vscode keil stm32cubemx
1.选择对应的芯片


2.配置时钟模式



3.配置串口输出 ,打印效果

4.配置通用定时器tim5


配置TIM4

PB6和pb12都是tim4的复用引脚线 我们可以在修改PB6为tim4如下 要查看对应的原理图



修改中断优先级

导出项目工程


配置烧录自动复位重启



添加支持的c语言库文件

三,编写代码
1、重新fput.c 在uart.c里面书写
c
#include <stdio.h> // 导入c库文件
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 1000);
return ch;
}
2.在stm32f1xx_it.c 里面重新回调中断函数
c
uint16_t cycle = 0;
uint8_t intCount = 0;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM4 && htim->Channel == TIM_CHANNEL_1)
{
intCount++;
if(intCount == 1)
{
// 第一个捕获值(上升沿),清零计数器
__HAL_TIM_SetCounter(&htim4,0);
}
else if(intCount == 2)
{
// 第二个捕获值(上升沿),读取CCR的值,交给cycle
cycle = __HAL_TIM_GetCompare(&htim4, TIM_CHANNEL_1);
intCount = 0;
}
}
}
// 计算PWM周期(单位:ms)
double TIM4_GetPWMCycle(void)
{
return cycle / 1000.0;
}
// 计算PWM频率(单位:Hz)
double TIM4_GetpwmFreq(void)
{
return 1000000.0 / cycle;
}
在main里面添加内容
c
HAL_TIM_PWM_Start(&htim5, TIM_CHANNEL_2);
HAL_TIM_IC_Start_IT(&htim4, TIM_CHANNEL_1);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
printf("PWM周期:%f ms\n", TIM4_GetPWMCycle());
printf("PWM频率:%f Hz\n", TIM4_GetpwmFreq());
HAL_Delay(1000);
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
