cubeMX配置:
选用PB4, PA15为定时器通道ch1
配置预分频,重装载值(设为最大,防止溢出),启用中断
关键代码:
计算频率:
//频率捕获
u32 cp_value1=0; // 定义变量cp_value1,用于存储捕获寄存器的值,初始化为0
u32 frq1=0; // 定义变量frq1,用于存储频率值,初始化为0
u32 cp_value2=0; // 定义变量cp_value2,用于存储捕获寄存器的值,初始化为0
u32 frq2=0; // 定义变量frq2,用于存储频率值,初始化为0
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM2) // 判断定时器实例是否为TIM2
{
cp_value1=HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_1); // 读取TIM2通道1的捕获值并赋给cp_value1
__HAL_TIM_SetCounter(&htim2, 0); // 重置TIM2的计数器为0
frq1=(80000000/80)/cp_value1; // 计算频率值并赋给frq1,假设时钟频率为80MHz
HAL_TIM_IC_Start(htim, TIM_CHANNEL_1); // 启动TIM2通道1的捕获功能
}
if(htim->Instance==TIM3) // 判断定时器实例是否为TIM3
{
cp_value2=HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_1); // 读取TIM3通道1的捕获值并赋给cp_value2
__HAL_TIM_SetCounter(&htim3, 0); // 重置TIM3的计数器为0
frq2=(80000000/80)/cp_value2; // 计算频率值并赋给frq2,假设时钟频率为80MHz
HAL_TIM_IC_Start(htim, TIM_CHANNEL_1); // 启动TIM3通道1的捕获功能
}
}
主要注意这四个函数:
HAL_TIM_IC_CaptureCallback(),输入捕获(IC)功能的回调函数。它在输入捕获中断触发时被调用,用于处理捕获到的输入信号。
HAL_TIM_ReadCapturedValue(),用于读取输入捕获寄存器的值。它可以用来获取定时器捕获到的输入信号的计数值。
__HAL_TIM_SetCounter(),用于设置定时器的计数器值。它可以用来手动设置定时器的计数器,从而改变定时器的计数状态。
HAL_TIM_IC_Start(),用于启动定时器的输入捕获(IC)功能。它会使能定时器的输入捕获功能,并开始捕获外部信号的脉冲。
主函数中,需要记得先开启输入捕获中断